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