X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FUrlLink.java;h=0141a6ac2b35eae4446a973982cca6fd25f17625;hb=d89bd711a41eb3c1cd66d01c0067e1ddb5261ef9;hp=0529c73790acf1a05841714563d0b1755b59a44f;hpb=136c0793b90b72b928c4d77dc109dd5c644e00d3;p=jalview.git diff --git a/src/jalview/util/UrlLink.java b/src/jalview/util/UrlLink.java index 0529c73..0141a6a 100644 --- a/src/jalview/util/UrlLink.java +++ b/src/jalview/util/UrlLink.java @@ -29,21 +29,57 @@ 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 { + private static final String SEQUENCEID_PLACEHOLDER = DELIM + SEQUENCE_ID + + DELIM; + + private static final String ACCESSION_PLACEHOLDER = DELIM + DB_ACCESSION + + DELIM; + /** - * 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 + url (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 + } + if (link1.contains(SEQUENCEID_PLACEHOLDER) + && link2.contains(ACCESSION_PLACEHOLDER)) + { + return -1; + } + if (link2.contains(SEQUENCEID_PLACEHOLDER) + && link1.contains(ACCESSION_PLACEHOLDER)) + { + return 1; + } + return String.CASE_INSENSITIVE_ORDER.compare(link1, link2); + } + }; private static final String EQUALS = "="; @@ -176,8 +212,12 @@ public class UrlLink String var = (usesDBaccession ? DB_ACCESSION : SEQUENCE_ID); return urlPrefix - + (dynamic ? (DELIM + var + ((regexReplace != null) ? EQUALS - + regexReplace + EQUALS + DELIM : DELIM)) : "") + + (dynamic + ? (DELIM + var + + ((regexReplace != null) + ? EQUALS + regexReplace + EQUALS + DELIM + : DELIM)) + : "") + ((urlSuffix == null) ? "" : urlSuffix); } @@ -262,8 +302,8 @@ public class UrlLink { if (regexReplace != null) { - com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex.perlCode("/" - + regexReplace + "/"); + com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex + .perlCode("/" + regexReplace + "/"); if (rg.search(idstring)) { int ns = rg.numSubs(); @@ -287,7 +327,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; @@ -321,8 +361,8 @@ public class UrlLink if (rg.matchedFrom(s) > -1) { subs.addElement(rg.stringMatched(s)); - subs.addElement(urlPrefix + rg.stringMatched(s) - + urlSuffix); + subs.addElement( + urlPrefix + rg.stringMatched(s) + urlSuffix); } s++; } @@ -470,8 +510,8 @@ public class UrlLink regexReplace = link.substring(sqidPos + startLength, p); try { - com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex.perlCode("/" - + regexReplace + "/"); + com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex + .perlCode("/" + regexReplace + "/"); if (rg == null) { invalidMessage = "Invalid Regular Expression : '" + regexReplace @@ -572,16 +612,17 @@ public class UrlLink if (usesDBAccession()) // link is ID { // collect matching db-refs - DBRefEntry[] dbr = DBRefUtils.selectRefs(seq.getDBRefs(), - new String[] { target }); + List dbr = DBRefUtils.selectRefs(seq.getDBRefs(), + new String[] + { target }); // if there are any dbrefs which match up with the link if (dbr != null) { - for (int r = 0; r < dbr.length; r++) + for (int r = 0, nd = dbr.size(); r < nd; r++) { // create Bare ID link for this URL - createBareURLLink(dbr[r].getAccessionId(), true, linkset); + createBareURLLink(dbr.get(r).getAccessionId(), true, linkset); } } } @@ -627,4 +668,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); + } }