/*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
*
- * This program 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 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
*
- * This program 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.
+ * 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 this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ * 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.Enumeration;
-import java.util.Iterator;
+import jalview.bin.Cache;
+import jalview.util.ArrayUtils;
+
+import java.util.Arrays;
import java.util.Vector;
+/**
+ * Data model for a <location> child element of a <feature> read
+ * from an EMBL query reply
+ *
+ * @see embl_mapping.xml
+ * @see http://www.insdc.org/files/feature_table.html#3.4.2
+ */
public class EmblFeatureLocations
{
- Vector locElements;
+ Vector<EmblFeatureLocElement> locElements;
String locationType;
/**
* @param locationComplement
- * the locationComplement to set
+ * the locationComplement to set
*/
public void setLocationComplement(boolean locationComplement)
{
/**
* @param locationType
- * the locationType to set
+ * the locationType to set
*/
public void setLocationType(String locationType)
{
/**
* @return the locElements
*/
- public Vector getLocElements()
+ public Vector<EmblFeatureLocElement> getLocElements()
{
return locElements;
}
/**
* @param locElements
- * the locElements to set
+ * the locElements to set
*/
- public void setLocElements(Vector locElements)
+ public void setLocElements(Vector<EmblFeatureLocElement> locElements)
{
this.locElements = locElements;
}
}
/**
- * 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
+ * Return all location elements concerning given accession as start-end pairs.
+ * If the CDS feature is on the forward strand, then start <= end, if on the
+ * reverse strand then start > end.
*
* @param accession
- * the accession string for which locations are requested, or
- * null for all locations
- * @return null or int[] { start1, end1, ... }
+ * the accession string for which locations are requested, or null
+ * for all locations
+ * @return int[] { start1, end1, ... }
*/
-
- public int[] getElementRanges(String accession)
+ int[] getElementRanges(String accession)
{
int sepos = 0;
int[] se = new int[locElements.size() * 2];
- if (locationType.equalsIgnoreCase("single"))
+ if ("single".equalsIgnoreCase(locationType)
+ || "join".equalsIgnoreCase(locationType))
{
- for (Enumeration le = locElements.elements(); le.hasMoreElements();)
+ for (EmblFeatureLocElement loce : locElements)
{
- EmblFeatureLocElement loce = (EmblFeatureLocElement) le
- .nextElement();
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());
+ try
+ {
+ int start = Integer.parseInt(bp[0].getPos());
+ int end = Integer.parseInt(bp[1].getPos());
+ se[sepos++] = start;
+ se[sepos++] = end;
+ } catch (NumberFormatException e)
+ {
+ System.err
+ .println("format error in EMBL CDS location basePosition: "
+ + e.getMessage());
+ }
}
- }
- }
- }
- else if (locationType.equalsIgnoreCase("join"))
- {
- for (Enumeration le = locElements.elements(); le.hasMoreElements();)
- {
- EmblFeatureLocElement loce = (EmblFeatureLocElement) le
- .nextElement();
- if (accession == null || loce.accession != null
- && accession.equals(loce.accession))
- {
- BasePosition bp[] = loce.getBasePositions();
- if (bp.length == 2)
+ else
{
- se[sepos++] = Integer.parseInt(bp[0].getPos());
- se[sepos++] = Integer.parseInt(bp[1].getPos());
+ System.err
+ .println("format error in EMBL CDS location, basePosition count = "
+ + bp.length);
}
}
}
- return se;
}
else if (locationType != null)
{
- if (jalview.bin.Cache.log != null)
- jalview.bin.Cache.log
- .error("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='"
+ if (Cache.log != null)
+ {
+ Cache.log
+ .error("EmblFeatureLocations.getElementRanges cannot deal with locationType=='"
+ locationType + "'");
+ }
else
+ {
System.err
- .println("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='"
+ .println("EmblFeatureLocations.getElementRanges cannot deal with locationType=='"
+ locationType + "'");
+ }
+ }
+
+ if (sepos != se.length)
+ {
+ /*
+ * we failed to parse something - trim off null values
+ */
+ se = Arrays.copyOf(se, sepos);
}
- // trim range if necessary.
- if (se != null && sepos != se.length)
+
+ /*
+ * If on the complement, reverse the ranges to [end, start, ...end1, start1].
+ * For an example of a joined complement, see (tRNA feature) CAGL0B00165r on
+ * http://www.ebi.ac.uk/ena/data/view/CR380948&display=xml
+ * http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/embl/CR380948/emblxml
+ */
+ if (locationComplement)
{
- int[] trimmed = new int[sepos];
- System.arraycopy(se, 0, trimmed, 0, sepos);
- se = trimmed;
+ ArrayUtils.reverseIntArray(se);
}
return se;
}