X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Frest%2FRestServiceDescription.java;h=926897564822b642c184868aa62b775ed5ffec1f;hb=97264690f394f98cf13cd1d834a53e8956fb1b0e;hp=aae225502206da4478f88768553c633322865cff;hpb=865a855a4ca87eadb3e5ff284ed32ed307d9c34b;p=jalview.git diff --git a/src/jalview/ws/rest/RestServiceDescription.java b/src/jalview/ws/rest/RestServiceDescription.java index aae2255..9268975 100644 --- a/src/jalview/ws/rest/RestServiceDescription.java +++ b/src/jalview/ws/rest/RestServiceDescription.java @@ -1,25 +1,29 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) - * Copyright (C) 2014 The Jalview Authors + * 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.JvDataType; +import jalview.util.StringUtils; +import jalview.ws.api.UIinfo; import jalview.ws.rest.params.Alignment; import jalview.ws.rest.params.AnnotationFile; import jalview.ws.rest.params.SeqGroupIndexVector; @@ -37,6 +41,9 @@ import java.util.regex.Pattern; 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 */ @@ -60,10 +67,7 @@ public class RestServiceDescription boolean vseparable, char gapCharacter) { super(); - this.details = new UIinfo(); - details.Action = action == null ? "" : action; - details.description = description == null ? "" : description; - details.Name = name == null ? "" : name; + this.details = new UIinfo(action, action, name, description, postUrl); this.postUrl = postUrl == null ? "" : postUrl; this.urlSuffix = urlSuffix == null ? "" : urlSuffix; if (inputParams != null) @@ -75,6 +79,7 @@ public class RestServiceDescription this.gapCharacter = gapCharacter; } + @Override public boolean equals(Object o) { if (o == null || !(o instanceof RestServiceDescription)) @@ -85,60 +90,17 @@ 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); - diff |= !details.Name.equals(other.details.Name); - diff |= !details.Action.equals(other.details.Action); - diff |= !details.description.equals(other.details.description); + diff |= !details.equals(other.details); return !diff; } - /** - * Service UI Info { Action, Specific Name of Service, Brief Description } - */ - - public class UIinfo - { - public String getAction() - { - return Action; - } - - public void setAction(String action) - { - Action = action; - } - - public String getName() - { - return Name; - } - - public void setName(String name) - { - Name = name; - } - - public String getDescription() - { - return description; - } - - public void setDescription(String description) - { - this.description = description; - } - - String Action; - - String Name; - - String description; - } - - public UIinfo details = new UIinfo(); + public UIinfo details; public String getAction() { @@ -229,7 +191,7 @@ public class RestServiceDescription /** * input info given as key/value pairs - mapped to post arguments */ - Map inputParams = new HashMap(); + Map inputParams = new HashMap<>(); /** * assigns the given inputType it to its corresponding input parameter token @@ -354,131 +316,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 @@ -490,7 +327,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; @@ -571,7 +408,7 @@ public class RestServiceDescription } StringTokenizer st = new StringTokenizer(outstring, ";"); String tok = ""; - resultData = new ArrayList(); + resultData = new ArrayList<>(); while (st.hasMoreTokens()) { try @@ -579,8 +416,8 @@ public class RestServiceDescription resultData.add(JvDataType.valueOf(tok = st.nextToken())); } catch (NoSuchElementException x) { - warnings.append("Invalid result type: '" + tok - + "' (must be one of: "); + warnings.append( + "Invalid result type: '" + tok + "' (must be one of: "); String sep = ""; for (JvDataType vl : JvDataType.values()) { @@ -595,7 +432,7 @@ public class RestServiceDescription private String getServiceIOProperties() { - ArrayList vls = new ArrayList(); + ArrayList vls = new ArrayList<>(); if (isHseparable()) { vls.add("hseparable"); @@ -608,20 +445,22 @@ 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]), + ","); } + @Override public String toString() { StringBuffer result = new StringBuffer(); result.append("|"); - result.append(details.Name); + result.append(details.getName()); result.append('|'); - result.append(details.Action); + result.append(details.getAction()); result.append('|'); - if (details.description != null) + if (details.getDescription() != null) { - result.append(details.description); + result.append(details.getDescription()); } ; // list job input flags @@ -651,7 +490,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) @@ -673,7 +512,8 @@ public class RestServiceDescription * @param p * @return */ - protected int parseServiceList(String[] list, StringBuffer warnings, int p) + protected int parseServiceList(String[] list, StringBuffer warnings, + int p) { boolean invalid = false; // look for the first non-empty position - expect it to be service name @@ -681,9 +521,8 @@ public class RestServiceDescription { p++; } - details.Name = list[p]; - details.Action = list[p + 1]; - details.description = list[p + 2]; + details = new UIinfo(list[p + 1], list[p + 1], list[p], list[p + 2], + postUrl); invalid |= !configureFromServiceInputProperties(list[p + 3], warnings); if (list.length - p > 5 && list[p + 5] != null && list[p + 5].trim().length() > 5) @@ -698,7 +537,8 @@ public class RestServiceDescription && list[p + 4].trim().length() > 5) { urlSuffix = null; - invalid |= !configureFromInputParamEncodedUrl(list[p + 4], warnings); + invalid |= !configureFromInputParamEncodedUrl(list[p + 4], + warnings); p += 5; } } @@ -752,8 +592,8 @@ 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("$"); } } @@ -779,9 +619,8 @@ public class RestServiceDescription boolean valid = true; int lastp = 0; String url = new String(); - Matcher prms = Pattern.compile("([?&])([A-Za-z0-9_]+)=\\$([^$]+)\\$") - .matcher(ipurl); - Map iparams = new Hashtable(); + Matcher prms = PARAM_ENCODED_URL_PATTERN.matcher(ipurl); + Map iparams = new Hashtable<>(); InputType jinput; while (prms.find()) { @@ -800,8 +639,8 @@ public class RestServiceDescription iprmparams = iprm.substring(colon + 1); iprm = iprm.substring(0, colon); } - valid = parseTypeString(prms.group(0), tok, iprm, iprmparams, - iparams, warnings); + valid = parseTypeString(prms.group(0), tok, iprm, iprmparams, iparams, + warnings); } if (valid) { @@ -822,11 +661,9 @@ public class RestServiceDescription public static Class[] getInputTypes() { // TODO - find a better way of maintaining this classlist - return new Class[] - { jalview.ws.rest.params.Alignment.class, + return new Class[] { jalview.ws.rest.params.Alignment.class, jalview.ws.rest.params.AnnotationFile.class, - SeqGroupIndexVector.class, - jalview.ws.rest.params.SeqIdVector.class, + SeqGroupIndexVector.class, jalview.ws.rest.params.SeqIdVector.class, jalview.ws.rest.params.SeqVector.class, jalview.ws.rest.params.Tree.class }; } @@ -841,11 +678,12 @@ 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, ",")) + ArrayList al = new ArrayList<>(); + for (String prprm : StringUtils.separatorListToArray(iprmparams, + ",")) { // hack to ensure that strings like "sep=','" containing unescaped // commas as values are concatenated @@ -918,7 +756,8 @@ public class RestServiceDescription /** * search the input types for an instance of the given class * - * @param class1 + * @param + * class1 * @return */ public boolean inputInvolves(Class class1) @@ -952,7 +791,7 @@ public class RestServiceDescription return jobId + urlSuffix; } - private List resultData = new ArrayList(); + private List resultData = new ArrayList<>(); /** * @@ -966,7 +805,7 @@ public class RestServiceDescription { if (resultData == null) { - resultData = new ArrayList(); + resultData = new ArrayList<>(); } resultData.add(dt); } @@ -996,8 +835,8 @@ public class RestServiceDescription public static List parseDescriptions( String services) throws Exception { - String[] list = separatorListToArray(services, "|"); - List svcparsed = new ArrayList(); + String[] list = StringUtils.separatorListToArray(services, "|"); + List svcparsed = new ArrayList<>(); int p = 0, lastp = 0; StringBuffer warnings = new StringBuffer(); do