Hi Yue, As you mentioned in your Javadoc, you should consider using HttpClient's URLEncodedUtils for parsing form data encoded in URLs. That method handles URL decoding (i.e. the escaping that looks like '%2D') automatically, among other things.
Thanks, Jason On Tue, May 8, 2012 at 7:04 PM, <[email protected]> wrote: > Author: paperwing > Date: 2012-05-08 16:04:40 -0700 (Tue, 08 May 2012) > New Revision: 29160 > > Added: > > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java > Removed: > > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/LocalGetResponder.java > Modified: > > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java > > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java > Log: > Minor updates; renamed responder class, completed method for parsing > encoded URL. About to add support for the Cytoscape-App-Works-With tag in > the jar manifest which indicates the versions of Cytoscape that the app is > known to work with > > Modified: > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java > =================================================================== > --- > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java > 2012-05-08 22:36:27 UTC (rev 29159) > +++ > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java > 2012-05-08 23:04:40 UTC (rev 29160) > @@ -5,6 +5,7 @@ > import org.cytoscape.app.internal.action.AppManagerAction; > import org.cytoscape.app.internal.manager.AppManager; > import org.cytoscape.app.internal.net.WebQuerier; > +import org.cytoscape.app.internal.net.server.AppGetResponder; > import org.cytoscape.app.internal.net.server.LocalHttpServer; > import org.cytoscape.app.internal.net.server.LocalHttpServer.Response; > import org.cytoscape.app.swing.CySwingAppAdapter; > @@ -346,7 +347,7 @@ > registerService(bc, webQuerier, WebQuerier.class, new > Properties()); > > // Attempt to instantiate new manager > - AppManager appManager = new AppManager( > + final AppManager appManager = new AppManager( > cyAppAdapter, > cyApplicationConfigurationServiceRef, webQuerier); > registerService(bc, appManager, AppManager.class, new > Properties()); > > @@ -361,16 +362,7 @@ > @Override > public void run() { > server = new LocalHttpServer(2608, > Executors.newSingleThreadExecutor()); > - server.addGetResponder(new > LocalHttpServer.GetResponder() { > - public boolean canRespondTo(String > url) { > - return true; > - } > - > - @Override > - public LocalHttpServer.Response > respond(String url) throws Exception { > - return new > LocalHttpServer.Response("sample response body for url: " + url + "\n", > "application/json"); > - } > - }); > + server.addGetResponder(new > AppGetResponder(appManager)); > > server.run(); > } > > Modified: > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java > =================================================================== > --- > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java > 2012-05-08 22:36:27 UTC (rev 29159) > +++ > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java > 2012-05-08 23:04:40 UTC (rev 29160) > @@ -32,6 +32,12 @@ > private static final String APP_VERSION_TAG = > "Cytoscape-App-Version"; > > /** > + * The name of the key in the app jar's manifest file indicating > the major versions of > + * Cytoscape that the app is known to be compatible with in > comma-delimited form > + */ > + private static final String APP_COMPATIBLE_TAG = > "Cytoscape-App-Works-With"; > + > + /** > * A regular a expression representing valid app versions, which > are in the format major.minor.patch[-tag] > */ > private static final String APP_VERSION_TAG_REGEX = > "(0|([1-9]+\\d*))\\.(\\d)+\\.(\\d)+(-.*)?"; > > Copied: > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java > (from rev 29141, > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/LocalGetResponder.java) > =================================================================== > --- > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java > (rev 0) > +++ > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java > 2012-05-08 23:04:40 UTC (rev 29160) > @@ -0,0 +1,93 @@ > +package org.cytoscape.app.internal.net.server; > + > +import java.util.HashMap; > +import java.util.Map; > + > +import org.cytoscape.app.internal.manager.AppManager; > +import org.cytoscape.app.internal.net.server.LocalHttpServer.Response; > + > +/** > + * This class is responsible for handling GET requests received by the > local HTTP server. > + */ > +public class AppGetResponder implements LocalHttpServer.GetResponder{ > + > + private static final String STATUS_QUERY_URL = "status"; > + private static final String STATUS_QUERY_APP_NAME = "appname"; > + > + private static final String INSTALL_QUERY_URL = "install"; > + private static final String INSTALL_QUERY_APP_NAME = "appname"; > + > + private AppManager appManager; > + > + @Override > + public boolean canRespondTo(String url) throws Exception { > + return true; > + } > + > + @Override > + public Response respond(String url) throws Exception { > + Map<String, String> parsed = parseEncodedUrl(url); > + > + System.out.println("Request received. Url: " + url); > + System.out.println("Url request prefix: " + > getUrlRequestPrefix(url)); > + System.out.println("Parsed result of encoded url: " + > parsed); > + > + LocalHttpServer.Response response = new > LocalHttpServer.Response("test response", "text/plain"); > + > + return response; > + } > + > + public AppGetResponder(AppManager appManager) { > + this.appManager = appManager; > + > + } > + > + /** > + * Parses the parameters from an URL encoded in the > application/x-www-form-urlencoded form, > + * which is the default form. This method uses a simple parsing > method, only scanning text after the last '?' symbol > + * and splitting with the '=' symbol. A more comprehensive (and > possibly securer) parser can be found in the URLEncodedUtils > + * class of the Apache HttpClient library. > + * > + * @param url The encoded URL in String form > + * @return A map containing the encoded keys as keys and the > corresponding encoded values as values. > + */ > + private Map<String, String> parseEncodedUrl(String url) { > + Map<String, String> parameters = new HashMap<String, > String>(); > + > + int lastIndex = url.lastIndexOf("?"); > + > + if (lastIndex != -1) { > + String paramSubstring = url.substring(lastIndex + > 1); > + > + String[] splitParameters = > paramSubstring.split("&"); > + > + > + String key, value; > + int equalSignIndex; > + for (int i = 0; i < splitParameters.length; i++) { > + equalSignIndex = > splitParameters[i].indexOf('='); > + > + if (equalSignIndex != -1) { > + key = > splitParameters[i].substring(0, equalSignIndex); > + value = > splitParameters[i].substring(equalSignIndex + 1); > + > + parameters.put(key, value); > + } > + } > + } > + > + return parameters; > + } > + > + /** > + * Returns the request prefix for a URL encoded according to the > application/x-www-form-urlencoded specification, ie. > + * returns "installed" for " > http://127.0.0.1:2608/installed?appname=3d&version=1.0.0" > + */ > + private String getUrlRequestPrefix(String url) { > + > + // Use the last occurrence of the question mark > + int lastIndex = url.lastIndexOf("?"); > + > + return url.substring(url.indexOf("/"), lastIndex); > + } > +} > > > Property changes on: > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java > ___________________________________________________________________ > Added: svn:mime-type > + text/plain > > Deleted: > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/LocalGetResponder.java > =================================================================== > --- > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/LocalGetResponder.java > 2012-05-08 22:36:27 UTC (rev 29159) > +++ > csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/net/server/LocalGetResponder.java > 2012-05-08 23:04:40 UTC (rev 29160) > @@ -1,48 +0,0 @@ > -package org.cytoscape.app.internal.net.server; > - > -import java.util.Map; > - > -import org.cytoscape.app.internal.net.server.LocalHttpServer.Response; > - > -/** > - * This class is responsible for handling GET requests received by the > local HTTP server. > - */ > -public class LocalGetResponder implements LocalHttpServer.GetResponder{ > - > - private static final String STATUS_QUERY_URL = "status"; > - private static final String STATUS_QUERY_APP_NAME = "appname"; > - > - private static final String INSTALL_QUERY_URL = "install"; > - private static final String INSTALL_QUERY_APP_NAME = "appname"; > - > - > - @Override > - public boolean canRespondTo(String url) throws Exception { > - // TODO Auto-generated method stub > - return false; > - } > - > - @Override > - public Response respond(String url) throws Exception { > - // TODO Auto-generated method stub > - return null; > - } > - > - > - /** > - * Parses the parameters from an URL encoded in the > application/x-www-form-urlencoded form, > - * which is the default form. This method uses a simple parsing > method, only scanning text after the last '?' symbol > - * and splitting with the '=' symbol. A more comprehensive (and > possibly securer) parser can be found in the URLEncodedUtils > - * class of the Apache HttpClient library. > - * > - * @param url > - * @return > - */ > - private Map<String, String> parseEncodedUrl(String url) { > - int lastIndex = url.lastIndexOf("?"); > - > - String paramSubstring = url.substring(lastIndex); > - > - return null; > - } > -} > > -- > You received this message because you are subscribed to the Google Groups > "cytoscape-cvs" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/cytoscape-cvs?hl=en. > > -- You received this message because you are subscribed to the Google Groups "cytoscape-cvs" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/cytoscape-cvs?hl=en.
