JAL-2114 accept "<123..178" or "123..>178" format
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 20 May 2016 17:30:55 +0000 (18:30 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 20 May 2016 17:30:55 +0000 (18:30 +0100)
src/jalview/util/DnaUtils.java
test/jalview/util/DnaUtilsTest.java

index 9ab4fda..f6514e5 100644 (file)
@@ -35,14 +35,15 @@ public class DnaUtils
 
     /*
      * try to parse m..n (or simply m)
+     * also handles <m..n or m..>n (discarding < or >)
      */
     String[] range = location.split("\\.\\.");
     if (range.length == 1 || range.length == 2)
     {
       try
       {
-        int start = Integer.valueOf(range[0]);
-        int end = range.length == 1 ? start : Integer.valueOf(range[1]);
+        int start = parseRangeEnd(range[0]);
+        int end = range.length == 1 ? start : parseRangeEnd(range[1]);
         return Collections.singletonList(new int[] { start, end });
       } catch (NumberFormatException e)
       {
@@ -64,6 +65,22 @@ public class DnaUtils
   }
 
   /**
+   * Returns the integer value of a locus, discarding any < or > prefix
+   * 
+   * @throws NumberFormatException
+   *           if value is not numeric
+   */
+  static int parseRangeEnd(String loc)
+  {
+
+    if (loc.startsWith("<") || loc.startsWith(">"))
+    {
+      loc = loc.substring(1);
+    }
+    return Integer.valueOf(loc);
+  }
+
+  /**
    * Parses a complement(locationSpec) into a list of start-end ranges
    * 
    * @param location
index 9e978fe..bb3cc5b 100644 (file)
@@ -89,10 +89,20 @@ public class DnaUtilsTest
     assertEquals(87064, ranges.get(1)[1]);
 
     /*
+     * beyond 5' or 3' locus
+     */
+    ranges = DnaUtils.parseLocation("<34..126");
+    assertEquals(1, ranges.size());
+    assertEquals(34, ranges.get(0)[0]);
+    assertEquals(126, ranges.get(0)[1]);
+    ranges = DnaUtils.parseLocation("35..>127");
+    assertEquals(1, ranges.size());
+    assertEquals(35, ranges.get(0)[0]);
+    assertEquals(127, ranges.get(0)[1]);
+
+    /*
      * valid things we don't yet handle
      */
-    assertNull(DnaUtils.parseLocation("<34..126"));
-    assertNull(DnaUtils.parseLocation("34..>126"));
     assertNull(DnaUtils.parseLocation("34.126"));
     assertNull(DnaUtils.parseLocation("34^126"));
     assertNull(DnaUtils.parseLocation("order(34..126,130..180)"));