X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Futil%2FUrlLink.java;h=0529c73790acf1a05841714563d0b1755b59a44f;hp=3ee64329521fe8af4b8d201a508c2858a0e70612;hb=136c0793b90b72b928c4d77dc109dd5c644e00d3;hpb=8677e6e34e291edc58c1da2fc9c958473754143f diff --git a/src/jalview/util/UrlLink.java b/src/jalview/util/UrlLink.java index 3ee6432..0529c73 100644 --- a/src/jalview/util/UrlLink.java +++ b/src/jalview/util/UrlLink.java @@ -21,6 +21,8 @@ package jalview.util; import static jalview.util.UrlConstants.DB_ACCESSION; +import static jalview.util.UrlConstants.DELIM; +import static jalview.util.UrlConstants.SEP; import static jalview.util.UrlConstants.SEQUENCE_ID; import jalview.datamodel.DBRefEntry; @@ -43,10 +45,9 @@ public class UrlLink * documentation todo. */ - // Internal constants - private static final String SEP = "|"; + private static final String EQUALS = "="; - private static final String DELIM = "$"; + private static final String SPACE = " "; private String urlSuffix; @@ -56,6 +57,8 @@ public class UrlLink private String label; + private String dbname; + private String regexReplace; private boolean dynamic = false; @@ -81,23 +84,38 @@ public class UrlLink dynamic = true; usesDBaccession = true; - sep = parseTargetAndLabel(sep, psqid, link); + sep = parseLabel(sep, psqid, link); - parseUrl(link, DB_ACCESSION, psqid, sep); + int endOfRegex = parseUrl(link, DB_ACCESSION, psqid, sep); + parseTarget(link, sep, endOfRegex); } else if (nsqid > -1) { dynamic = true; - sep = parseTargetAndLabel(sep, nsqid, link); + sep = parseLabel(sep, nsqid, link); + + int endOfRegex = parseUrl(link, SEQUENCE_ID, nsqid, sep); - parseUrl(link, SEQUENCE_ID, nsqid, sep); + parseTarget(link, sep, endOfRegex); } else { - target = link.substring(0, sep); - sep = link.lastIndexOf(SEP); - label = link.substring(0, sep); - urlPrefix = link.substring(sep + 1).trim(); + label = link.substring(0, sep).trim(); + + // if there's a third element in the url link string + // it is the target name, otherwise target=label + int lastsep = link.lastIndexOf(SEP); + if (lastsep != sep) + { + urlPrefix = link.substring(sep + 1, lastsep).trim(); + target = link.substring(lastsep + 1).trim(); + } + else + { + urlPrefix = link.substring(sep + 1).trim(); + target = label; + } + regexReplace = null; // implies we trim any prefix if necessary // urlSuffix = null; } @@ -107,9 +125,24 @@ public class UrlLink } /** + * Alternative constructor for separate name, link and description + * + * @param name + * The string used to match the link to a DB reference id + * @param url + * The url to link to + * @param desc + * The description of the associated target DB + */ + public UrlLink(String name, String url, String desc) + { + this(name + SEP + url + SEP + desc); + } + + /** * @return the url_suffix */ - public String getUrl_suffix() + public String getUrlSuffix() { return urlSuffix; } @@ -117,7 +150,7 @@ public class UrlLink /** * @return the url_prefix */ - public String getUrl_prefix() + public String getUrlPrefix() { return urlPrefix; } @@ -138,6 +171,16 @@ public class UrlLink return label; } + public String getUrlWithToken() + { + String var = (usesDBaccession ? DB_ACCESSION : SEQUENCE_ID); + + return urlPrefix + + (dynamic ? (DELIM + var + ((regexReplace != null) ? EQUALS + + regexReplace + EQUALS + DELIM : DELIM)) : "") + + ((urlSuffix == null) ? "" : urlSuffix); + } + /** * @return the regexReplace */ @@ -194,6 +237,16 @@ public class UrlLink } /** + * Set the target + * + * @param desc + */ + public void setTarget(String desc) + { + target = desc; + } + + /** * return one or more URL strings by applying regex to the given idstring * * @param idstring @@ -234,7 +287,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; @@ -278,7 +331,7 @@ public class UrlLink String[] res = new String[subs.size()]; for (int r = 0, rs = subs.size(); r < rs; r++) { - res[r] = (String) subs.elementAt(r); + res[r] = subs.elementAt(r); } subs.removeAllElements(); return res; @@ -307,17 +360,19 @@ public class UrlLink @Override public String toString() { - String var = (usesDBaccession ? DB_ACCESSION : SEQUENCE_ID); + return label + SEP + getUrlWithToken(); + } - return label - + SEP - + urlPrefix - + (dynamic ? (DELIM + var + ((regexReplace != null) ? "=" - + regexReplace + "=" + DELIM : DELIM)) : "") - + ((urlSuffix == null) ? "" : urlSuffix); + /** + * @return delimited string containing label, url and target + */ + public String toStringWithTarget() + { + return label + SEP + getUrlWithToken() + SEP + target; } /** + * Parse the label from the link string * * @param firstSep * Location of first occurrence of separator in link string @@ -327,7 +382,7 @@ public class UrlLink * Link string containing database name and url * @return Position of last separator symbol prior to any regex symbols */ - protected int parseTargetAndLabel(int firstSep, int psqid, String link) + protected int parseLabel(int firstSep, int psqid, String link) { int p = firstSep; int sep = firstSep; @@ -339,21 +394,44 @@ public class UrlLink // Assuming that the URL itself does not contain any SEP symbols // sep now contains last pipe symbol position prior to any regex symbols label = link.substring(0, sep); - if (label.indexOf(SEP) > -1) - { - // SEP terminated database name / www target at start of Label - target = label.substring(0, label.indexOf(SEP)); - } - else if (label.indexOf(" ") > 2) + + return sep; + } + + /** + * Parse the target from the link string + * + * @param link + * Link string containing database name and url + * @param sep + * Location of first separator symbol + * @param endOfRegex + * Location of end of any regular expression in link string + */ + protected void parseTarget(String link, int sep, int endOfRegex) + { + int lastsep = link.lastIndexOf(SEP); + + if ((lastsep != sep) && (lastsep > endOfRegex)) { - // space separated Label - matches database name - target = label.substring(0, label.indexOf(" ")); + // final element in link string is the target + target = link.substring(lastsep + 1).trim(); } else { target = label; } - return sep; + + if (target.indexOf(SEP) > -1) + { + // SEP terminated database name / www target at start of Label + target = target.substring(0, target.indexOf(SEP)); + } + else if (target.indexOf(SPACE) > 2) + { + // space separated label - first word matches database name + target = target.substring(0, target.indexOf(SPACE)); + } } /** @@ -367,8 +445,9 @@ public class UrlLink * Position of id or name in link string * @param sep * Position of separator in link string + * @return Location of end of any regex in link string */ - protected void parseUrl(String link, String varName, int sqidPos, int sep) + protected int parseUrl(String link, String varName, int sqidPos, int sep) { urlPrefix = link.substring(sep + 1, sqidPos).trim(); @@ -411,7 +490,14 @@ public class UrlLink // verify format is really correct. if (link.indexOf(DELIM + varName + DELIM) == sqidPos) { - urlSuffix = link.substring(sqidPos + startLength - 1); + int lastsep = link.lastIndexOf(SEP); + if (lastsep < sqidPos + startLength - 1) + { + // the last SEP character was before the regex, ignore + lastsep = link.length(); + } + urlSuffix = link.substring(sqidPos + startLength - 1, lastsep) + .trim(); regexReplace = null; } else @@ -420,6 +506,8 @@ public class UrlLink + link; } } + + return p; } /** @@ -453,11 +541,11 @@ public class UrlLink */ protected void createStaticLink(Map> linkset) { - if (!linkset.containsKey(label + SEP + getUrl_prefix())) + if (!linkset.containsKey(label + SEP + getUrlPrefix())) { // Add a non-dynamic link - linkset.put(label + SEP + getUrl_prefix(), - Arrays.asList(target, label, null, getUrl_prefix())); + linkset.put(label + SEP + getUrlPrefix(), + Arrays.asList(target, label, null, getUrlPrefix())); } } @@ -539,82 +627,4 @@ public class UrlLink } } } - - private static void testUrls(UrlLink ul, String idstring, String[] urls) - { - - if (urls == null) - { - System.out.println("Created NO urls."); - } - else - { - System.out.println("Created " + (urls.length / 2) + " Urls."); - for (int uls = 0; uls < urls.length; uls += 2) - { - System.out.println("URL Replacement text : " + urls[uls] - + " : URL : " + urls[uls + 1]); - } - } - } - - public static void main(String argv[]) - { - String[] links = new String[] { - /* - * "AlinkT|Target|http://foo.foo.soo/", - * "myUrl1|http://$SEQUENCE_ID=/[0-9]+/=$.someserver.org/foo", - * "myUrl2|http://$SEQUENCE_ID=/(([0-9]+).+([A-Za-z]+))/=$.someserver.org/foo" - * , - * "myUrl3|http://$SEQUENCE_ID=/([0-9]+).+([A-Za-z]+)/=$.someserver.org/foo" - * , "myUrl4|target|http://$SEQUENCE_ID$.someserver.org/foo|too", - * "PF1|http://us.expasy.org/cgi-bin/niceprot.pl?$SEQUENCE_ID=/(?:PFAM:)?(.+)/=$" - * , - * "PF2|http://us.expasy.org/cgi-bin/niceprot.pl?$SEQUENCE_ID=/(PFAM:)?(.+)/=$" - * , - * "PF3|http://us.expasy.org/cgi-bin/niceprot.pl?$SEQUENCE_ID=/PFAM:(.+)/=$" - * , "NOTFER|http://notfer.org/$SEQUENCE_ID=/(?