Hi Achim,

I did some further digging.

On GWT, this is the relevant piece of code in charge of loading those
policy files: [1]

 protected SerializationPolicy doGetSerializationPolicy(
      HttpServletRequest request, String moduleBaseURL, String strongName) {
    // The request can tell you the path of the web app relative to the
    // container root.
    String contextPath = request.getContextPath();

    String modulePath = null;
    if (moduleBaseURL != null) {
      try {
        modulePath = new URL(moduleBaseURL).getPath();
      } catch (MalformedURLException ex) {
        // log the information, we will default
        log("Malformed moduleBaseURL: " + moduleBaseURL, ex);
      }
    }

I suspected the contextPath to be a potential candidate suspect in this
case. To test that theory, I deployed a simple servlet that dumps its
context.
I deployed it using WAB (MANIFEST: Webapp-Context + web.xml).  In this
deployment, the servlet reports:
[getContextPath]->[/ctx]

Then, changed the deployment to OSGi-ds with a programmatic activator
containing the resource mapping.
DefaultResourceMapping resourceMapping = new DefaultResourceMapping();
resourceMapping.setAlias( "/ctx" );
resourceMapping.setPath( "/war" );

In this case, the servlet reports:
[getContextPath]->[]

Translated to the gwt issue --> when gwt is deployed with a WAB, it finds
its config in /ctx/app  and when I use the programmatic resource mapping it
is looking into /app  and therefore does not find its resources.

Bottom line:
Webapp-Context is  not equivalent to the alias.   The alias does not
populate ContextPath the same way Webapp-Context does.

Is there something we could do in this case?

-greetz, Gerard.


[1]
http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java?spec=svn5045&r=5045


On Thu, Jun 21, 2012 at 1:26 PM, Achim Nierbeck <[email protected]>wrote:

> Hi Gerard,
>
> well the Webapp-Context is equivalent to the alias.
> So to my understanding you did this right.
>
> Now the tricky part, GWT does those specialties to the WAR where it places
> it's root stuff
> in that special directory /war,
> How do we transition this. Just one thing that just crossed my mind would
> be to set the
> alias to /ctx/war. But I haven't tested this right now. Just from the top
> of my head :)
>
> regards, Achim
>
>
>
> 2012/6/21 Gerard Maas <[email protected]>
>
>> Thanks Achim,
>>
>> After some thinking and code reading, I guess this issue can be boiled
>> down to the question:
>>
>> In PAX-WEB, what would be the programmatic equivalent of:
>>
>> MANIFEST.MF
>> ...
>> Webapp-Context: /ctx,
>> Webapp-Root: /war
>> ...
>>
>> ?
>>
>> GWT used to load its resources correctly when using the WAB model.
>>
>> (and the broader question: how to use GWT without a web.xml file?)
>>
>>
>> -kr, Gerard.
>>
>>
>>
>>
>>
>> On Thu, Jun 21, 2012 at 11:17 AM, Achim Nierbeck <[email protected]
>> > wrote:
>>
>>> hmm, this rather strange and right now I don't have much of an idea.
>>> Do you use std. gwt or vaadin? For vaadin I created a new Pax project to
>>> simplify the usage,
>>> though this is still a 0.1.0 :)
>>>
>>> regards, Achim
>>>
>>> 2012/6/20 Gerard Maas <[email protected]>
>>>
>>>>  Hi!,
>>>>
>>>> Further to my previous messages, I continue with the effort of
>>>> migrating our app to an uniform OSGi/DS-centric system.   The last
>>>> 'bastion' is our GWT web interface which  -being a GWT app- has a
>>>> WAR-centric format.
>>>> I successfully refactored all servlets out from the war and converted
>>>> into declarative OSGi services (<provide
>>>> interface="javax.servlet.Servlet"/>). That way I got rid of all the messy
>>>> ServiceTracker code.
>>>> To further replicated the other WAR functionality to register a filter,
>>>> serve static content and welcome page using the info on [1]  (thanks to
>>>> Achim for that link).
>>>>
>>>> Now, I'm having issues with PAX-WEB and the way GWT tries to load its
>>>> resources:
>>>>
>>>> While loading the serialization descriptors, GWT loads a local resource
>>>> using the HTTP context.
>>>> In my case it tries to resolve resources like
>>>> this: /ctx/ctx/62394587E47773FB1594FF.gwt.rpc
>>>> This resource is created by the GWT compiler and placed under :
>>>> <bundle>/war/ctx/ctx/resource...
>>>>
>>>> Before, using the standard wab mapping (Webapp-Context:
>>>> /ctx, Webapp-Root: /war) gwt would find its resources correctly.
>>>> Now that I'm using the programmatic resource mapping:
>>>> DefaultResourceMapping resourceMapping = new DefaultResourceMapping();
>>>> resourceMapping.setAlias( "/ctx" );
>>>> resourceMapping.setPath( "/war" );
>>>>
>>>> GWT fails to load the resouce and produces the following error:
>>>> 2012-06-20 12:46:36.283:INFO:/:AbcProxy: ERROR: The serialization
>>>> policy file '/ctx/ctx/600000000000000773FB1594FF.gwt.rpc' was not found;
>>>> did you forget to include it in this deployment?
>>>> 2012-06-20 12:46:36.283:INFO:/:AbcProxy: WARNING: Failed to get the
>>>> SerializationPolicy '600000000000000773FB1594FF' for module '
>>>> https://localhost:8443/ctx/ctx/'; a legacy, 1.3.3 compatible,
>>>> serialization policy will be used.  You may experience
>>>> SerializationExceptions as a result.
>>>>
>>>> [N.B. The last sentence should read "you will experience a hell of
>>>> serialization issues as a result"]
>>>>
>>>> I've tracked the issue to the HttpServiceContext loading the resource
>>>> and intrepreting the path as a file and not as a relative url:
>>>>
>>>> getting resource: [/mx/mx/6ECAD5B3A6F908CE17E47773FB1594FF.gwt.rpc]
>>>> HttpServiceContext | not a URL or invalid URL:
>>>> [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc], treating as a file path
>>>> DefaultHttpContext | Searching bundle [bundle] for resource
>>>> [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc]
>>>>
>>>> This obviously fails, as this resource is located under /war/ctx/ctx/
>>>> in bundle file system.
>>>> This seems to relate to bug PAXWEB-314 [2]   which implementation is to
>>>> turn the relative path into a file path:
>>>>
>>>>
>>>>  // IMPROVEMENT start PAXWEB-314
>>>>
>>>> 257 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#257>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>             try {
>>>>
>>>> 258 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#258>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>                 resource = new URL 
>>>> <http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/net/URL.java#URL>(path);
>>>>
>>>>  259 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#259>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>                 LOG 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java#HttpServiceContext.0LOG>.debug
>>>>  
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-api/1.6.1/org/slf4j/Logger.java#Logger.debug%28java.lang.String%29>(
>>>>  "resource: [" + path + "] is already a URL, returning" );
>>>>
>>>>  260 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#260>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>                 return resource;
>>>>
>>>> 261 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#261>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>             }
>>>>
>>>> 262 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#262>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>                 catch (MalformedURLException 
>>>> <http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/net/MalformedURLException.java#MalformedURLException>
>>>>  e) {
>>>>
>>>>  263 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#263>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>                    // do nothing, simply log
>>>>
>>>> 264 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#264>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>                     LOG 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java#HttpServiceContext.0LOG>.debug
>>>>  
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-api/1.6.1/org/slf4j/Logger.java#Logger.debug%28java.lang.String%29>(
>>>>  "not a URL or invalid URL: [" + path + "], treating as a file path" );
>>>>
>>>>  265 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#265>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>             }
>>>>
>>>> 266 
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#266>
>>>>
>>>> <http://grepcode.com/file/repo1.maven.org/maven2/org.ops4j.pax.web/pax-web-jetty/1.1.2/org/ops4j/pax/web/service/jetty/internal/HttpServiceContext.java?av=h#>
>>>>
>>>>             // IMPROVEMENT end PAXWEB-314
>>>>
>>>>
>>>> Is there a way to work around this issue?  Is somebody using GWT and
>>>> PAX-WEB using OSGi services instead of a WAB?
>>>> One possible way is to copy the /war/ctx produced by the GWT compiler
>>>> back to /ctx, but I'd like to find a decent solution before going into the
>>>> hack direction.
>>>>
>>>> Any pointers?
>>>>
>>>> -kr, Gerard.
>>>>
>>>> [1] -
>>>> https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/Activator.java
>>>> [2] - http://team.ops4j.org/browse/PAXWEB-314
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> general mailing list
>>>> [email protected]
>>>> http://lists.ops4j.org/mailman/listinfo/general
>>>>
>>>>
>>>
>>>
>>> --
>>>
>>> Apache Karaf <http://karaf.apache.org/> Committer & PMC
>>> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer
>>> & Project Lead
>>> OPS4J Pax for Vaadin <http://team.ops4j.org/wiki/display/PAXVAADIN/Home>
>>> Commiter & Project Lead
>>> blog <http://notizblog.nierbeck.de/>
>>>
>>> _______________________________________________
>>> general mailing list
>>> [email protected]
>>> http://lists.ops4j.org/mailman/listinfo/general
>>>
>>>
>>
>> _______________________________________________
>> general mailing list
>> [email protected]
>> http://lists.ops4j.org/mailman/listinfo/general
>>
>>
>
>
> --
>
> Apache Karaf <http://karaf.apache.org/> Committer & PMC
> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer &
> Project Lead
> OPS4J Pax for Vaadin <http://team.ops4j.org/wiki/display/PAXVAADIN/Home>
> Commiter & Project Lead
> blog <http://notizblog.nierbeck.de/>
>
> _______________________________________________
> general mailing list
> [email protected]
> http://lists.ops4j.org/mailman/listinfo/general
>
>
_______________________________________________
general mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/general

Reply via email to