Hi all!
Just an update about my ongoing effort to OSGIfy GWT.

I did proposed a patch to GWT community and to validate it I've adapted 5
significant examples from the GWT distribution to run on Apache Karaf,
(more precisely I used ServiceMix 4.5.3 but I'm not using neither Camel,
CXF or ActiveMQ).

You can find the examples here:
https://github.com/cristcost/gwt-karaf-examples

They require GWT compiled using this patch of mine
https://gwt-review.googlesource.com/#/c/5351/
If someone want to try them out, I will be glad to help and give more
detailed instructions.

Actually there is no so much interest from GWT community, so I would like
you all supporting me by starring the related issue:
https://code.google.com/p/google-web-toolkit/issues/detail?id=8424
and if you are interested, apply to
https://gwt-review.googlesource.com/and perform a (non binding) review
of
https://gwt-review.googlesource.com/#/c/5351/ so that the patch can be
noticed more.


The patch is not yet ideal, as the .bnd file contains some "workaround" to
address complex dependencies in the GWT jar, but I hope these can be
addressed by a refactoring in GWT package structure in next release. Also,
there is a rare issue when two applications are deployed together and use
"com.google.web.bindery.requestfactory.server.RequestFactoryServlet".
Anyhow I would like it to be approved for the upcoming final release of GWT
2.6.0 which is expected beginning of december, so that community can start
developing first prototype applications using this architecture.

To go back to the examples, they actually don't make full use of OSGi
capabilities (no OSGi service is used for this) but me and some friends are
working on a *full* demo application that make use of the full ServiceMix
stack and have a GWT front-end deployed on ServiceMix. For this demo, stay
tuned on this other github project https://github.com/cristcost/sensormix
We would like to have it working on next version of GWT (2.6.0) and also
next version of ServiceMix (4.6.0). We would like to finish it before mid
december, and we will present it at next "GDG Firenze Happy Hour" meeting
that should be next 11th of December (you are welcome to join if you make a
stop in Italy).

I hope this topic interests you and if you like it I will be glad to have
feedback about this so to encourage me and my friends ;-)
Finally, we are open to any suggestion.

Thank you

Cristiano




2013/11/8 Cristiano Costantini <[email protected]>

> Hi all,
> I have followed Gert suggestion and I have a small patch that integrate
> osgi-fication of GWT-Servlet in the GWT ant build.
>
> I have one question before submitting the patch. The bnd property files
> looks like this:
>
> Bundle-Name: Google Web Toolkit :: Servlet
> Bundle-SymbolicName: gwt-servlet
> Bundle-Version: @version@
> Export-Package: *;version=@version@
> Import-Package: javax.servlet.*, !com.google.gwt.*, *;resolution:=optional
>
> the instruction !com.google.gwt.* generates the header "Ignore-Package:",
> and I have never seen it header before,
> but if I leave the configuration with just "Import-Package:
> *;resolution:=optional", I get a manifest with a huge list of optional
> package imports.
>
> I'm confident that the bundle really don't need to import packages inside
> com.google.gwt.* so excluding them seems more optimized.
> But I was not expecting the Ignore-Package header, and I don't know how to
> interpret it.
>
> So, which one of the two configuration should I use?
> Import-Package: *;resolution:=optional  ==> more conservative solution
> Import-Package: javax.servlet.*, !com.google.gwt.*, *;resolution:=optional
>  ==> probably more optimized
>
> both options works on my test (but it is a simple one).
>
> Thank you again.
> Cristiano
>
>
>
>
> 2013/11/6 Gert Vanthienen <[email protected]>
>
>> Hi Cristiano,
>>
>>
>> For the Import-Package, you should be able to append the resolution
>> directive with a ;, just like you do with the maven-bundle-plugin
>> instructions.  Something like *;resolution:=optional should work fine,
>> I think.
>>
>> For the properties, my first suggestion would be to just use plain Ant
>> to copy the file into a working directory and filter those property
>> values first and then point <bnd> to the filtered file, but it looks
>> like there's a <bndexpand> task as well that might be helpful, cfr.
>>
>> https://github.com/bndtools/bnd/wiki/%5Bant%5D-Loading-and-Expanding-Shared-Headers-or-Properties
>>
>>
>> Regards,
>>
>> Gert Vanthienen
>>
>>
>> On Wed, Nov 6, 2013 at 10:14 AM, Cristiano Costantini
>> <[email protected]> wrote:
>> > Hi all
>> >
>> > Short story:
>> > - Using "Import-Package: *" generates mandatory imports,
>> > do you know how to instruct bnd tool in the .bnd property file to scan
>> > imports and set them as with "resolution:=optional"?
>> >
>> > - "Bundle-Version: 2.6.0.rc1" is hard coded,
>> > do you know how to use external Ant variables in a .bnd property file
>> when
>> > using Ant tasks?
>> >
>> >
>> > Long story:
>> > I have made a GWT demo project that works into Servicemix 4.5.3 (I will
>> > publish it as soon as I have some more time),
>> > by now it resolves the dependency with gwt-servlet by installing the
>> > following bundle:
>> >     install -s
>> >
>> wrap:mvn:com.google.gwt/gwt-servlet/${gwt.version}$Bundle-SymbolicName=gwt-servlet
>> >
>> > It creates a huge manifest for the GWT-Servlet, it heavily make use of
>> > optional imports, the demo is just a simple example with 1 server side
>> GWT
>> > Rpc Service (-> a servlet), but it works.
>> >
>> > I then tried to automate the generation of OSGi Manifest into the build
>> > lifecycle of GWT so that the original Jar in the GWT distribution is
>> ready
>> > for deployment to OSGi without wrapping it, but here things get a little
>> > harder.
>> >
>> > The "bnd" ant task is hard to fit GWT lifecycle as the GWT-Servlet Jar
>> is a
>> > subset of classes extracted from GWT-User and GWT-Dev.
>> > I think using "bndwrap" ant task and post process GWT-Servlet is
>> > preferable.
>> >
>> > I tried first by wrapping the Jar on the command line and I made a
>> simple
>> > .bnd file with the following options contents:
>> >    Bundle-Name: Google Web Toolkit :: Servlet
>> >    Bundle-SymbolicName: gwt-servlet
>> >    Bundle-Version: 2.6.0.rc1
>> >    Export-Package: *
>> >    Import-Package: *
>> >
>> > I got an osgi-fied bundle, I deployed it replacing the one created with
>> > wrap: deployer but this new one does not get resolved:
>> > the difference is that the made with wrap deployer sets all Imports as
>> > optional.
>> > It sound reasonable to me, as the classes in the GWT-Servlet have been
>> > accurately selected by GWT committers (remember GWT-Servlet comes from a
>> > subset of GWT-Dev and GWT-User) and may have many java imports of
>> classes
>> > not required on the server but are still referenced in the bytecode.
>> >
>> > Ideally, we should create a .bnd file that only specify the right
>> Package
>> > Imports and Exports, but I don't have ideas on how to make it simple.
>> >
>> > I guess the best would be to make a first step and achieve having an
>> > initial bundle with imports as optional but I don't know how to specify
>> > this to bnd for Import-Packages... (see initial question).
>> > Anyone can suggest me how to do it?
>> >
>> >
>> > Here, if someone is interested, are the headers of the two bundles:
>> > This one works
>> >
>> >
>> https://gist.github.com/cristcost/7332635#file-gwt-servlet-osgi-headers-with-wrap
>> >
>> > This one don't
>> >
>> >
>> https://gist.github.com/cristcost/7332635#file-gwt-servlet-osgi-headers-from-command-line-bnd
>> >
>> > I'll keep you updated as I try to progress further.
>> > ;-)
>> >
>> > Cristiano
>> >
>> >
>> > PS. Here are the Ant rules for selecting what to put inside the
>> GWT-Servlet
>> > JAR. Any Idea on how to create more fine tuned .bnd files from these
>> rules?
>> >
>> >       <fileset dir="${gwt.dev.bin}">
>> >         <include name="com/google/gwt/dev/asm/**" />
>> >         <include name="com/google/gwt/dev/util/Name*.class" />
>> >         <include name="com/google/gwt/dev/util/StringKey.class" />
>> >         <include name="com/google/gwt/util/tools/shared/**" />
>> >         <include name="com/google/gwt/core/shared/**" />
>> >       </fileset>
>> >       <fileset dir="${gwt.user.bin}">
>> >         <exclude name="**/rebind/**" />
>> >         <exclude name="**/tools/**" />
>> >         <exclude name="**/super/**" />
>> >         <exclude name="com/google/gwt/json/**" />
>> >         <exclude name="com/google/gwt/junit/*" />
>> >         <exclude name="com/google/gwt/junit/client/GWTTestCase.*" />
>> >         <exclude name="com/google/gwt/junit/remote/**" />
>> >         <exclude name="com/google/gwt/junit/server/**" />
>> >         <exclude name="com/google/gwt/benchmarks/*" />
>> >         <exclude name="**/*.gwtar" />
>> >       </fileset>
>>
>
>

Reply via email to