JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / datamodel / xdb / embl / EmblFeatureLocations.java
index 878042d..94105ae 100644 (file)
-package jalview.datamodel.xdb.embl;\r
-\r
-import java.util.Iterator;\r
-import java.util.Vector;\r
-\r
-public class EmblFeatureLocations {\r
-    Vector locElements;\r
-    String locationType;\r
-    boolean locationComplement;\r
-    /**\r
-     * @return the locationComplement\r
-     */\r
-    public boolean isLocationComplement() {\r
-        return locationComplement;\r
-    }\r
-    /**\r
-     * @param locationComplement the locationComplement to set\r
-     */\r
-    public void setLocationComplement(boolean locationComplement) {\r
-        this.locationComplement = locationComplement;\r
-    }\r
-    /**\r
-     * @return the locationType\r
-     */\r
-    public String getLocationType() {\r
-        return locationType;\r
-    }\r
-    /**\r
-     * @param locationType the locationType to set\r
-     */\r
-    public void setLocationType(String locationType) {\r
-        this.locationType = locationType;\r
-    }\r
-    /**\r
-     * @return the locElements\r
-     */\r
-    public Vector getLocElements() {\r
-        return locElements;\r
-    }\r
-    /**\r
-     * @param locElements the locElements to set\r
-     */\r
-    public void setLocElements(Vector locElements) {\r
-        this.locElements = locElements;\r
-    }\r
-    /**\r
-     * Return all location elements as start-end pairs on referenced sequence \r
-     * @return int[] { start1, end1, ... }\r
-     */\r
-    public int[] getElementRanges() {\r
-        if (locationType.equalsIgnoreCase("single")) {\r
-            int[] se = new int[locElements.size()*2];            \r
-            int sepos=0;\r
-            for (Iterator le=locElements.iterator();le.hasNext();) {\r
-                EmblFeatureLocElement loce = (EmblFeatureLocElement) le.next();\r
-                BasePosition bp[] = loce.getBasePositions();\r
-                if (bp.length==2) {\r
-                    se[sepos++] = Integer.parseInt(bp[0].getPos());\r
-                    se[sepos++] = Integer.parseInt(bp[1].getPos());\r
-                }\r
-            }\r
-            return se;\r
-        }\r
-        return null;\r
-    }\r
-}
\ No newline at end of file
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.datamodel.xdb.embl;
+
+import java.util.Vector;
+
+/**
+ * Data model for a &lt;loctaion&gt; child element of a &lt;feature&gt; read
+ * from an EMBL query reply
+ * 
+ * @see embl_mapping.xml
+ */
+public class EmblFeatureLocations
+{
+  Vector<EmblFeatureLocElement> locElements;
+
+  String locationType;
+
+  boolean locationComplement;
+
+  /**
+   * @return the locationComplement
+   */
+  public boolean isLocationComplement()
+  {
+    return locationComplement;
+  }
+
+  /**
+   * @param locationComplement
+   *          the locationComplement to set
+   */
+  public void setLocationComplement(boolean locationComplement)
+  {
+    this.locationComplement = locationComplement;
+  }
+
+  /**
+   * @return the locationType
+   */
+  public String getLocationType()
+  {
+    return locationType;
+  }
+
+  /**
+   * @param locationType
+   *          the locationType to set
+   */
+  public void setLocationType(String locationType)
+  {
+    this.locationType = locationType;
+  }
+
+  /**
+   * @return the locElements
+   */
+  public Vector<EmblFeatureLocElement> getLocElements()
+  {
+    return locElements;
+  }
+
+  /**
+   * @param locElements
+   *          the locElements to set
+   */
+  public void setLocElements(Vector<EmblFeatureLocElement> locElements)
+  {
+    this.locElements = locElements;
+  }
+
+  /**
+   * Return all location elements as start-end pairs (without accessions) TODO:
+   * pass back complement and 'less than or more than' range information Note:
+   * do not use this since it throws away any accessionIds associated with each
+   * location!
+   * 
+   * @return int[] { start1, end1, ... }
+   */
+  public int[] getElementRanges()
+  {
+    return getElementRanges(null);
+  }
+
+  /**
+   * Return all location elements concerning given accession as start-end pairs
+   * TODO: pass back complement and 'less than or more than' range information
+   * TODO: deal with multiple accessions
+   * 
+   * @param accession
+   *          the accession string for which locations are requested, or null
+   *          for all locations
+   * @return null or int[] { start1, end1, ... }
+   */
+
+  public int[] getElementRanges(String accession)
+  {
+    int sepos = 0;
+    int[] se = new int[locElements.size() * 2];
+    if (locationType.equalsIgnoreCase("single")) // TODO: or "simple" ?
+    {
+      for (EmblFeatureLocElement loce : locElements)
+      {
+        if (accession == null || loce.accession != null
+                && accession.equals(loce.accession))
+        {
+          BasePosition bp[] = loce.getBasePositions();
+          if (bp.length == 2)
+          {
+            se[sepos++] = Integer.parseInt(bp[0].getPos());
+            se[sepos++] = Integer.parseInt(bp[1].getPos());
+          }
+        }
+      }
+    }
+    else if (locationType.equalsIgnoreCase("join"))
+    {
+      for (EmblFeatureLocElement loce : locElements)
+      {
+        if (accession == null || loce.accession != null
+                && accession.equals(loce.accession))
+        {
+          BasePosition bp[] = loce.getBasePositions();
+          if (bp.length == 2)
+          {
+            se[sepos++] = Integer.parseInt(bp[0].getPos());
+            se[sepos++] = Integer.parseInt(bp[1].getPos());
+          }
+        }
+      }
+      return se;
+    }
+    else if (locationType != null)
+    {
+      if (jalview.bin.Cache.log != null)
+      {
+        jalview.bin.Cache.log
+                .error("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='"
+                        + locationType + "'");
+      }
+      else
+      {
+        System.err
+                .println("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='"
+                        + locationType + "'");
+      }
+    }
+    // trim range if necessary.
+    if (se != null && sepos != se.length)
+    {
+      int[] trimmed = new int[sepos];
+      System.arraycopy(se, 0, trimmed, 0, sepos);
+      se = trimmed;
+    }
+    return se;
+  }
+}