X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Frest%2FRestServiceDescription.java;h=e0c56daf0bdd444c0d8da5d1866e7b2fd59c6efd;hb=996d3319402197c787ced05f24b201cc66f6ed50;hp=dec4d7c5bc2ecb7e084f46ebe225db7a0336344a;hpb=a789f790fbb3ab13f1967b42781b837b58bf9bbc;p=jalview.git diff --git a/src/jalview/ws/rest/RestServiceDescription.java b/src/jalview/ws/rest/RestServiceDescription.java index dec4d7c..e0c56da 100644 --- a/src/jalview/ws/rest/RestServiceDescription.java +++ b/src/jalview/ws/rest/RestServiceDescription.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * * This file is part of Jalview. * @@ -44,11 +44,17 @@ import javax.swing.JViewport; import com.stevesoft.pat.Regex; import com.sun.org.apache.xml.internal.serialize.OutputFormat.DTD; -import com.sun.tools.doclets.internal.toolkit.util.DocFinder.Output; public class RestServiceDescription { /** + * create a new rest service description ready to be configured + */ + public RestServiceDescription() + { + + } + /** * @param details * @param postUrl * @param urlSuffix @@ -501,6 +507,7 @@ public class RestServiceDescription ; boolean valid = true; String val = null; + int l = warnings.length(); int i; for (String prop : props) { @@ -538,12 +545,11 @@ public class RestServiceDescription } if (prop.equals("returns")) { - int l = warnings.length(); _configureOutputFormatFrom(val, warnings); - valid = (l != warnings.length()); } } - return valid; + // return true if valid is true and warning buffer was not appended to. + return valid && (l == warnings.length()); } private String _genOutputFormatString() @@ -598,18 +604,18 @@ public class RestServiceDescription private String getServiceIOProperties() { - String[] vls = new String[] - { isHseparable() ? "hseparable" : "", - isVseparable() ? "vseparable" : "", - (new String("gapCharacter='" + gapCharacter + "'")), - (new String("returns='" + _genOutputFormatString() + "'")) }; - - return arrayToSeparatorList(vls, ","); + ArrayList vls = new ArrayList(); + if (isHseparable()) { vls.add("hseparable");}; + if (isVseparable()) { vls.add("vseparable");}; + vls.add(new String("gapCharacter='" + gapCharacter + "'")); + vls.add(new String("returns='" + _genOutputFormatString() + "'")); + return arrayToSeparatorList(vls.toArray(new String[0]), ","); } public String toString() { StringBuffer result = new StringBuffer(); + result.append("|"); result.append(details.Name); result.append('|'); result.append(details.Action); @@ -633,31 +639,63 @@ public class RestServiceDescription return result.toString(); } + /** + * processes a service encoded as a string (as generated by RestServiceDescription.toString()) + * Note - this will only use the first service definition encountered in the string to configure the service. + * @param encoding + * @param warnings - where warning messages are reported. + * @return true if configuration was parsed successfully. + */ public boolean configureFromEncodedString(String encoding, StringBuffer warnings) { - boolean invalid = false; String[] list = separatorListToArray(encoding, "|"); - details.Name = list[0]; - details.Action = list[1]; - details.description = list[2]; - invalid |= !configureFromServiceInputProperties(list[3], warnings); - if (list.length > 5) + + int nextpos=parseServiceList(list,warnings, 0); + if (nextpos>0) { - urlSuffix = list[4]; - invalid |= !configureFromInputParamEncodedUrl(list[5], warnings); + return true; + } + return false; + } + /** + * processes the given list from position p, attempting to configure the service from it. + * Service lists are formed by concatenating individual stringified services. The first character of a stringified service is '|', enabling this, and the parser will ignore empty fields in a '|' separated list when they fall outside a service definition. + * @param list + * @param warnings + * @param p + * @return + */ + 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 + while (list[p]!=null && list[p].trim().length()==0) + { + p++; + } + details.Name = list[p]; + details.Action = list[p+1]; + details.description = list[p+2]; + invalid |= !configureFromServiceInputProperties(list[p+3], warnings); + if (list.length-p > 5 && list[p+5]!=null && list[p+5].trim().length()>5) + { + urlSuffix = list[p+4]; + invalid |= !configureFromInputParamEncodedUrl(list[p+5], warnings); + p+=6; } else { - if (list.length > 4) + if (list.length-p > 4 && list[p+4]!=null && list[p+4].trim().length()>5) { urlSuffix = null; - invalid |= !configureFromInputParamEncodedUrl(list[4], warnings); + invalid |= !configureFromInputParamEncodedUrl(list[p+4], warnings); + p+=5; } } - return !invalid; + return invalid ? -1 : p; } - + /** * @return string representation of the input parameters, their type and * constraints, appended to the service's base submission URL @@ -1029,4 +1067,29 @@ public class RestServiceDescription return resultData; } + /** + * parse a concatenated list of rest service descriptions into an array + * @param services + * @return zero or more services. + * @throws exceptions if the services are improperly encoded. + */ + public static List parseDescriptions(String services) throws Exception + { + String[] list = separatorListToArray(services, "|"); + List svcparsed = new ArrayList(); + int p=0,lastp=0; + StringBuffer warnings=new StringBuffer(); + do { + RestServiceDescription rsd = new RestServiceDescription(); + p=rsd.parseServiceList(list, warnings, lastp=p); + if (p>lastp && rsd.isValid()) + { + svcparsed.add(rsd); + } else { + throw new Exception("Failed to parse user defined RSBS services from :"+services+"\nFirst error was encountered at token "+lastp+" starting "+list[lastp]+":\n"+rsd.getInvalidMessage()); + } + } while (p