X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FUrlLink.java;h=dda9e0ea48e1e994d58669aa2154e0596747b55d;hb=b22e1863f9c10dbff13ca8bc889255b91f0c4d1c;hp=007da86f5d00fb2b2b9d3303972dd45839a07e77;hpb=1554f4bd8e8ee6dd985251c1591793e23d89aad7;p=jalview.git diff --git a/src/jalview/util/UrlLink.java b/src/jalview/util/UrlLink.java index 007da86..dda9e0e 100644 --- a/src/jalview/util/UrlLink.java +++ b/src/jalview/util/UrlLink.java @@ -29,21 +29,63 @@ import jalview.datamodel.DBRefEntry; import jalview.datamodel.SequenceI; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Vector; +/** + * A helper class to parse URL Link strings taken from applet parameters or + * jalview properties file using the com.stevesoft.pat.Regex implementation. + * Jalview 2.4 extension allows regular expressions to be used to parse ID + * strings and replace the result in the URL. Regex's operate on the whole ID + * string given to the matchURL method, if no regex is supplied, then only text + * following the first pipe symbol will be substituted. Usage documentation + * todo. + */ public class UrlLink { /** - * helper class to parse URL Link strings taken from applet parameters or - * jalview properties file using the com.stevesoft.pat.Regex implementation. - * Jalview 2.4 extension allows regular expressions to be used to parse ID - * strings and replace the result in the URL. Regex's operate on the whole ID - * string given to the matchURL method, if no regex is supplied, then only - * text following the first pipe symbol will be substituted. Usage - * documentation todo. + * A comparator that puts SEQUENCE_ID template links before DB_ACCESSION + * links, and otherwise orders by link name (not case sensitive). It expects + * to compare strings formatted as "Name|URLTemplate" where the template may + * include $SEQUENCE_ID$ or $DB_ACCESSION$ or neither. */ + public static final Comparator LINK_COMPARATOR = new Comparator() + { + @Override + public int compare(String link1, String link2) + { + if (link1 == null || link2 == null) + { + return 0; // for failsafe only + } + String[] tokens1 = link1.split("\\|"); + String[] tokens2 = link2.split("\\|"); + if (tokens1.length < 2 || tokens2.length < 2) + { + // for failsafe only + return String.CASE_INSENSITIVE_ORDER.compare(link1, link2); + } + String name1 = tokens1[0]; + String name2 = tokens2[0]; + String pattern1 = tokens1[1]; + String pattern2 = tokens2[1]; + if (pattern1.contains(UrlConstants.SEQUENCE_ID) + && pattern2.contains(UrlConstants.DB_ACCESSION)) + { + return -1; + } + if (pattern2.contains(UrlConstants.SEQUENCE_ID) + && pattern1.contains(UrlConstants.DB_ACCESSION)) + { + return 1; + } + return String.CASE_INSENSITIVE_ORDER.compare(name1, name2); + + } + }; private static final String EQUALS = "="; @@ -291,7 +333,7 @@ public class UrlLink + rg.stringMatched(s) + "'"); } // try to collate subgroup matches - Vector subs = new Vector(); + Vector subs = new Vector<>(); // have to loop through submatches, collating them at top level // match int s = 0; // 1; @@ -632,4 +674,20 @@ public class UrlLink } } } + + /** + * Sorts links (formatted as LinkName|LinkPattern) suitable for display in a + * menu + *
    + *
  • SEQUENCE_ID links precede DB_ACCESSION links (i.e. canonical lookup + * before cross-references)
  • + *
  • otherwise by Link name (case insensitive)
  • + *
+ * + * @param nlinks + */ + public static void sort(List nlinks) + { + Collections.sort(nlinks, LINK_COMPARATOR); + } }