dev@grizzly.java.net

Re: servlet-mapping didn't work well in GrizzlyWebServerDeployer

From: Bongjae Chang <carryel_at_korea.com>
Date: Mon, 31 Aug 2009 14:41:29 +0900

Hi Sebastien,

Thank you for your reply.

I think that maybe your last reply is concerned about the following.

---
   if (appliPath != null && appliPath.endsWith(File.pathSeparator)) {
      appliPath = appliPath + File.pathSeparator;
   }
---
I see...

But, I think that definately, the following code is not correct.

---
mapping = urlPattern.substring(urlPattern.indexOf(sa.getServletPath()));
---

After you will review it, please let me know. :)

Thanks!

--
Bongjae Chang


  ----- Original Message -----
  From: Survivant 00
  To: dev_at_grizzly.dev.java.net
  Sent: Thursday, August 27, 2009 6:59 PM
  Subject: Re: servlet-mapping didn't work well in GrizzlyWebServerDeployer


  it's to early in the morning to think about it.. will come back to you later.

  but here what's in the help


-a, --application=[path]* Application(s) path(s). Application(s) deployed can be :
                              Servlet(s), war(s) and expanded war folder(s). To deploy multiple applications use File.pathSeparator Example : -a /app.war:/servlet/web.xml:/warfolder/




  2009/8/27 Bongjae Chang <carryel_at_korea.com>

    Hi,

    I deployed an web application with using GrizzlyWebServerDeploy, I found that the Servlet is not served because of wrong path mapping.

    Here is the example of web.xml
    ---
    <web-app>
    <servlet>
       <servlet-name>TestServlet</servlet-name>
       <servlet-class>my.test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
       <servlet-name>TestServlet</servlet-name>
       <url-pattern>/test/*</url-pattern>
    </servlet-mapping>
    ...
    </web-app>
    ---

    Assuming that context path is "/example",

    When I requested http://localhost:port/examples/test/abc, I expected that the TestServlet was serviced.

    When I debugged, I found some strange codes.

    In GrizzlyWebServerDeploy.java
    ---
    public String[] getAlias(ServletAdapter sa, Collection<String> aliases) {
       ...
       for( String urlPattern : aliases) {
          String mapping = "";
          if (!sa.getServletPath().equals(urlPattern) && urlPattern.indexOf(sa.getServletPath()) > -1) {
             mapping = urlPattern.substring(urlPattern.indexOf(sa.getServletPath()));
          }
          String aliasTmp = sa.getContextPath() + sa.getServletPath() + mapping;
       }
       ...
    }

    When I deployed the web app, sa.getServletPath() is equal to "/test" and urlPattern is equal to "/test/*".

    Then mapping result is equal to "/test/*" , so aliasTmp result is equal to "/example/test/test/*".

    But I think that aliasTmp should become to be "/examples/test/*".

    When I edited the mapping code like this experimentally,

    ---
    mapping = urlPattern.subString(urlPattern.indexOf(sa.getServletPath()) + sa.getServletPath().length());
    ---

    I could know that my test servlet is served well.

    Could you please review this?


    And I saw another strange code. This is trivial.

    In GrizzlyWebServerDeployer.java
    ---
    public String appendWarContentToClassPath(String appliPath) throw ... {
       ...
       if (appliPath != null && appliPath.endsWith(File.pathSeparator)) {
          appliPath = appliPath + File.pathSeparator;
       }
    }
    ---
    File.pathSeparator is equal to ";" in Windows.

    Perhaps you mean File.separator "/" or "\". Is it right?

    Then, the proposed patch is here.
    ---
    public String appendWarContentToClassPath(String appliPath) throw ... {
       ...
       if (appliPath != null && !appliPath.endsWith(File.separator)) {
          appliPath = appliPath + File.separator;
       }
    }
    ---

    Is also Right? But, I am not sure. :)

    Thanks!

    --
    Bongjae Chang