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.

Reply via email to