X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Frest%2FRestServiceDescription.java;h=896a2303b3cefe985cbfa0f4c0ac24d03ef571cb;hb=8edebdd9789b2d93fb8f9db24b8be2c1e6317690;hp=74bfe470dd6d7adec3b78a3ab58c50a9ca12c809;hpb=59d682209891099d46b960509907c79e3fb276fe;p=jalview.git diff --git a/src/jalview/ws/rest/RestServiceDescription.java b/src/jalview/ws/rest/RestServiceDescription.java index 74bfe47..896a230 100644 --- a/src/jalview/ws/rest/RestServiceDescription.java +++ b/src/jalview/ws/rest/RestServiceDescription.java @@ -1,32 +1,34 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.ws.rest; import jalview.datamodel.SequenceI; -import jalview.io.packed.DataProvider; -import jalview.io.packed.SimpleDataProvider; import jalview.io.packed.DataProvider.JvDataType; -import jalview.util.GroupUrlLink.UrlStringTooLongException; -import jalview.util.Platform; +import jalview.util.StringUtils; import jalview.ws.rest.params.Alignment; import jalview.ws.rest.params.AnnotationFile; -import jalview.ws.rest.params.JobConstant; import jalview.ws.rest.params.SeqGroupIndexVector; +import jalview.ws.rest.params.SeqIdVector; +import jalview.ws.rest.params.SeqVector; +import jalview.ws.rest.params.Tree; import java.net.URL; import java.util.ArrayList; @@ -36,17 +38,13 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.StringTokenizer; -import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.swing.JViewport; - -import com.stevesoft.pat.Regex; -import com.sun.org.apache.xml.internal.serialize.OutputFormat.DTD; - public class RestServiceDescription { + private static final Pattern PARAM_ENCODED_URL_PATTERN = Pattern.compile("([?&])([A-Za-z0-9_]+)=\\$([^$]+)\\$"); + /** * create a new rest service description ready to be configured */ @@ -85,6 +83,7 @@ public class RestServiceDescription this.gapCharacter = gapCharacter; } + @Override public boolean equals(Object o) { if (o == null || !(o instanceof RestServiceDescription)) @@ -95,7 +94,8 @@ public class RestServiceDescription boolean diff = (gapCharacter != other.gapCharacter); diff |= vseparable != other.vseparable; diff |= hseparable != other.hseparable; - diff |= !(urlSuffix.equals(other.urlSuffix)); + diff |= !(urlSuffix == null && other.urlSuffix == null || (urlSuffix != null + && other.urlSuffix != null && urlSuffix.equals(other.urlSuffix))); // TODO - robust diff that includes constants and reordering of URL // diff |= !(postUrl.equals(other.postUrl)); // diff |= !inputParams.equals(other.inputParams); @@ -364,131 +364,6 @@ public class RestServiceDescription return invalidMessage == null; } - private static boolean debug = false; - - /** - * parse the string into a list - * - * @param list - * @param separator - * @return elements separated by separator - */ - public static String[] separatorListToArray(String list, String separator) - { - int seplen = separator.length(); - if (list == null || list.equals("") || list.equals(separator)) - return null; - java.util.ArrayList jv = new ArrayList(); - int cp = 0, pos, escape; - boolean wasescaped = false, wasquoted = false; - String lstitem = null; - while ((pos = list.indexOf(separator, cp)) >= cp) - { - - escape = (pos > 0 && list.charAt(pos - 1) == '\\') ? -1 : 0; - if (wasescaped || wasquoted) - { - // append to previous pos - jv.set(jv.size() - 1, - lstitem = lstitem + separator - + list.substring(cp, pos + escape)); - - } - else - { - jv.add(lstitem = list.substring(cp, pos + escape)); - } - cp = pos + seplen; - wasescaped = escape == -1; - if (!wasescaped) - { - // last separator may be in an unmatched quote - if (java.util.regex.Pattern.matches("('[^']*')*[^']*'", lstitem)) - { - wasquoted = true; - } - } - - } - if (cp < list.length()) - { - String c = list.substring(cp); - if (wasescaped || wasquoted) - { - // append final separator - jv.set(jv.size() - 1, lstitem + separator + c); - } - else - { - if (!c.equals(separator)) - { - jv.add(c); - } - } - } - if (jv.size() > 0) - { - String[] v = jv.toArray(new String[jv.size()]); - jv.clear(); - if (debug) - { - System.err.println("Array from '" + separator - + "' separated List:\n" + v.length); - for (int i = 0; i < v.length; i++) - { - System.err.println("item " + i + " '" + v[i] + "'"); - } - } - return v; - } - if (debug) - { - System.err.println("Empty Array from '" + separator - + "' separated List"); - } - return null; - } - - /** - * concatenate the list with separator - * - * @param list - * @param separator - * @return concatenated string - */ - public static String arrayToSeparatorList(String[] list, String separator) - { - StringBuffer v = new StringBuffer(); - if (list != null && list.length > 0) - { - for (int i = 0, iSize = list.length; i < iSize; i++) - { - if (list[i] != null) - { - if (v.length() > 0) - { - v.append(separator); - } - // TODO - escape any separator values in list[i] - v.append(list[i]); - } - } - if (debug) - { - System.err.println("Returning '" + separator - + "' separated List:\n"); - System.err.println(v); - } - return v.toString(); - } - if (debug) - { - System.err.println("Returning empty '" + separator - + "' separated List\n"); - } - return "" + separator; - } - /** * parse a string containing a list of service properties and configure the * service description @@ -500,7 +375,7 @@ public class RestServiceDescription private boolean configureFromServiceInputProperties(String propList, StringBuffer warnings) { - String[] props = separatorListToArray(propList, ","); + String[] props = StringUtils.separatorListToArray(propList, ","); if (props == null) { return true; @@ -618,7 +493,7 @@ public class RestServiceDescription ; vls.add(new String("gapCharacter='" + gapCharacter + "'")); vls.add(new String("returns='" + _genOutputFormatString() + "'")); - return arrayToSeparatorList(vls.toArray(new String[0]), ","); + return StringUtils.arrayToSeparatorList(vls.toArray(new String[0]), ","); } public String toString() @@ -661,7 +536,7 @@ public class RestServiceDescription public boolean configureFromEncodedString(String encoding, StringBuffer warnings) { - String[] list = separatorListToArray(encoding, "|"); + String[] list = StringUtils.separatorListToArray(encoding, "|"); int nextpos = parseServiceList(list, warnings, 0); if (nextpos > 0) @@ -762,7 +637,7 @@ public class RestServiceDescription url.append("$"); url.append(param.getValue().getURLtokenPrefix()); url.append(":"); - url.append(arrayToSeparatorList(vals.toArray(new String[0]), + url.append(StringUtils.arrayToSeparatorList(vals.toArray(new String[0]), ",")); url.append("$"); } @@ -789,7 +664,7 @@ public class RestServiceDescription boolean valid = true; int lastp = 0; String url = new String(); - Matcher prms = Pattern.compile("([?&])([A-Za-z0-9_]+)=\\$([^$]+)\\$") + Matcher prms = PARAM_ENCODED_URL_PATTERN .matcher(ipurl); Map iparams = new Hashtable(); InputType jinput; @@ -833,12 +708,9 @@ public class RestServiceDescription { // TODO - find a better way of maintaining this classlist return new Class[] - { jalview.ws.rest.params.Alignment.class, - jalview.ws.rest.params.AnnotationFile.class, + { Alignment.class, AnnotationFile.class, SeqGroupIndexVector.class, - jalview.ws.rest.params.SeqIdVector.class, - jalview.ws.rest.params.SeqVector.class, - jalview.ws.rest.params.Tree.class }; + SeqIdVector.class, SeqVector.class, Tree.class }; } public static boolean parseTypeString(String fullstring, String tok, @@ -851,11 +723,11 @@ public class RestServiceDescription { try { - jinput = (InputType) (type.getConstructor().newInstance(null)); + jinput = (InputType) (type.getConstructor().newInstance()); if (iprm.equalsIgnoreCase(jinput.getURLtokenPrefix())) { ArrayList al = new ArrayList(); - for (String prprm : separatorListToArray(iprmparams, ",")) + for (String prprm : StringUtils.separatorListToArray(iprmparams, ",")) { // hack to ensure that strings like "sep=','" containing unescaped // commas as values are concatenated @@ -884,100 +756,6 @@ public class RestServiceDescription return valid; } - public static void main(String argv[]) - { - // test separator list - try - { - assert (separatorListToArray("foo=',',min='foo',max='1,2,3',fa=','", - ",").length == 4); - if (separatorListToArray("minsize='2', sep=','", ",").length == 2) - { - assert (false); - } - - } catch (AssertionError x) - { - System.err.println("separatorListToArray is faulty."); - } - if (argv.length == 0) - { - if (!testRsdExchange("Test using default Shmmr service", - RestClient.makeShmmrRestClient().service)) - { - System.err.println("default test failed."); - } - else - { - System.err.println("default test passed."); - } - } - else - { - int i = 0, p = 0; - for (String svc : argv) - { - p += testRsdExchange("Test " + (++i), svc) ? 1 : 0; - } - System.err.println("" + p + " out of " + i + " tests passed."); - - } - } - - private static boolean testRsdExchange(String desc, String servicestring) - { - try - { - RestServiceDescription newService = new RestServiceDescription( - servicestring); - if (!newService.isValid()) - { - throw new Error("Failed to create service from '" + servicestring - + "'.\n" + newService.getInvalidMessage()); - } - return testRsdExchange(desc, newService); - } catch (Throwable x) - { - System.err.println("Failed for service (" + desc + "): " - + servicestring); - x.printStackTrace(); - return false; - } - } - - private static boolean testRsdExchange(String desc, - RestServiceDescription service) - { - try - { - String fromservicetostring = service.toString(); - RestServiceDescription newService = new RestServiceDescription( - fromservicetostring); - if (!newService.isValid()) - { - throw new Error("Failed to create service from '" - + fromservicetostring + "'.\n" - + newService.getInvalidMessage()); - } - - if (!service.equals(newService)) - { - System.err.println("Failed for service (" + desc + ")."); - System.err.println("Original service and parsed service differ."); - System.err.println("Original: " + fromservicetostring); - System.err.println("Parsed : " + newService.toString()); - return false; - } - } catch (Throwable x) - { - System.err.println("Failed for service (" + desc + "): " - + service.toString()); - x.printStackTrace(); - return false; - } - return true; - } - /** * covenience method to generate the id and sequence string vector from a set * of seuqences using each sequence's getName() and getSequenceAsString() @@ -1100,7 +878,7 @@ public class RestServiceDescription public static List parseDescriptions( String services) throws Exception { - String[] list = separatorListToArray(services, "|"); + String[] list = StringUtils.separatorListToArray(services, "|"); List svcparsed = new ArrayList(); int p = 0, lastp = 0; StringBuffer warnings = new StringBuffer();