X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FUrlLink.java;h=007da86f5d00fb2b2b9d3303972dd45839a07e77;hb=3d0101179759ef157b088ea135423cd909512d9f;hp=c8892876ab024ae615801ada3ac9093b51708a81;hpb=d3cabbfdd38d554bb8a8b17d3e2c4b113c102545;p=jalview.git diff --git a/src/jalview/util/UrlLink.java b/src/jalview/util/UrlLink.java index c889287..007da86 100644 --- a/src/jalview/util/UrlLink.java +++ b/src/jalview/util/UrlLink.java @@ -45,6 +45,10 @@ public class UrlLink * documentation todo. */ + private static final String EQUALS = "="; + + private static final String SPACE = " "; + private String urlSuffix; private String urlPrefix; @@ -53,6 +57,8 @@ public class UrlLink private String label; + private String dbname; + private String regexReplace; private boolean dynamic = false; @@ -78,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); - parseUrl(link, SEQUENCE_ID, nsqid, sep); + int endOfRegex = 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; } @@ -104,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; } @@ -114,7 +150,7 @@ public class UrlLink /** * @return the url_prefix */ - public String getUrl_prefix() + public String getUrlPrefix() { return urlPrefix; } @@ -135,6 +171,20 @@ 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 */ @@ -191,6 +241,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 @@ -206,8 +266,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(); @@ -231,7 +291,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; @@ -265,8 +325,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++; } @@ -275,7 +335,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; @@ -304,17 +364,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 @@ -324,7 +386,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; @@ -336,21 +398,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)); + } } /** @@ -364,8 +449,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(); @@ -388,8 +474,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 @@ -408,7 +494,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 @@ -417,6 +510,8 @@ public class UrlLink + link; } } + + return p; } /** @@ -450,11 +545,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())); } } @@ -482,7 +577,8 @@ public class UrlLink { // collect matching db-refs DBRefEntry[] dbr = DBRefUtils.selectRefs(seq.getDBRefs(), - new String[] { target }); + new String[] + { target }); // if there are any dbrefs which match up with the link if (dbr != null) @@ -536,82 +632,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=/(?