You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Kalle Korhonen <ka...@gmail.com> on 2013/03/09 23:34:06 UTC

Re: First stab at CDI module for tapestry

Hey Magnus,

as part of your tapestry-cdi work, did you look into implementing a
Tapestry CDI SPI, i.e. an implementation of
javax.enterprise.inject.spi.BeanManager? This is related to my earlier
thread about injectable entitylisteners (
http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E).
JPA 2.1 is required the check the SPI (see
http://java.dzone.com/articles/cdi-extensions-you-can-build,
http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener,
http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets).
The CDI is a solid spec, we should start thinking about offering
tapestry-cdi or similar as a core Tapestry module.

Kalle


On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <ma...@kvalheim.dk>wrote:

> Yes, I've noticed. Great work Igor :)
>
> I've intentionally not done anything for tapestry-cdi in terms of
> supporting
> javax.inject.@Inject.
>
> As Tap @inject and javax @inject are interchangeable - cdi bean injection
> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>
> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
> <ig...@gmail.com>wrote:
>
> > Just as a side note: starting with T5.3 it's possible to use JSR 330 for
> > injection.
> >
> > Check this out:
> > http://tapestry.apache.org/using-jsr-330-standard-annotations.html
> >
> > On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
> > wrote:
> >
> > > Hi all,
> > >
> > > We're looking into moving our apps from a 'traditional' servlet
> container
> > > with spring into a Java EE web profile server like glassfish 3.1.
> > > Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
> > more.
> > > Not just for the tapestry app, but also the other applications in
> > > our portfoleo which share common core business logic.
> > >
> > > For reference on previous discussions:
> > >
> > >
> >
> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
> > > http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
> > >
> > > Now, I've tried running the tapestry quickstart app in glassfish 3.1
> > (with
> > > the eclipse connector for publishing).
> > > This works ok - although I cannot make live class reloading work. :(
> > >
> > > Glassfish uses Weld, so the CDIModule is basically an objectprovider
> for
> > > injecting Weld managed beans.
> > > (As you probably know CDI/Weld can also be used outside jee as
> > alternative
> > > to tapestry-ioc, spring, etc)
> > >
> > > *CDIModule class*
> > > *public class CDIModule { *
> > > * public static void bind(ServiceBinder binder) {*
> > > *    binder.bind(ObjectProvider.class,
> > > CDIObjectProvider.class).withId("CDIObjectProvider");        *
> > > *    } *
> > > * public static BeanManager buildBeanManager(Logger log) { *
> > > * try {*
> > > * BeanManager beanManager = (BeanManager) new
> > > InitialContext().lookup("java:comp/BeanManager");*
> > > * return beanManager; *
> > > * } catch (NamingException e) {*
> > > * log.error("Could not lookup jndi resource: java:comp/BeanManager",
> e);*
> > > * }*
> > > * return null;*
> > > * } *
> > > * public static void contributeMasterObjectProvider(*
> > > * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
> > > * OrderedConfiguration<ObjectProvider> configuration) { *
> > > *// configuration.add("cdiProvider", cdiProvider,
> > >
> > >
> >
> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
> > > *
> > > * configuration.add("cdiProvider", cdiProvider, "after:*"); *
> > > * } *
> > > *}*
> > > *
> > > *
> > > The beanmanager is expected to be found in jndi. If the beans.xml is
> > > present
> > > it will be available at this point.
> > > The BeanManager is also exposed as a service and injectable for other
> > > services or components.
> > > I've tested by adding the *@SubModule(CDIModule.class) *to my
> quickstart
> > > appmodule.
> > > *
> > > *
> > > *CDIObjectProvider class*
> > > *public class CDIObjectProvider implements ObjectProvider { *
> > > * private BeanManager beanManager;*
> > > * private Logger log;*
> > > * *
> > > * @SuppressWarnings({ "unchecked", "rawtypes" })*
> > > * private Set allowedScopes = CollectionFactory.newSet(*
> > > * ApplicationScoped.class,*
> > > * Singleton.class);*
> > > *
> > > *
> > > * public CDIObjectProvider(*
> > > * Logger log,*
> > > * @InjectService("BeanManager") BeanManager manager) {*
> > > * this.beanManager = manager;*
> > > * this.log = log;*
> > > * }*
> > > * @SuppressWarnings("unchecked")*
> > > * public <T> T provide(Class<T> objectType,*
> > > * AnnotationProvider annotationProvider, ObjectLocator locator) {*
> > > * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
> > > * if(beans!=null && beans.size()>0) {*
> > > * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
> > > * if(hasValidScope(bean)) {*
> > > * CreationalContext<T> ctx =
> beanManager.createCreationalContext(bean);*
> > > * T o = (T) beanManager.getReference(bean, objectType, ctx); *
> > > * log.info("Found and returning: "+objectType.getCanonicalName());*
> > > * return o; *
> > > * }*
> > > * }*
> > > * return null;*
> > > * } *
> > > * protected <T> boolean hasValidScope(Bean<T> bean) {*
> > > * return bean!=null && allowedScopes.contains(bean.getScope());*
> > > * }*
> > > *}*
> > >
> > > I've limited the scope to singleton/applicationscoped. Perhaps also
> > Default
> > > could be accepted though.
> > > Until now I've only tested this with pojo's and not ejb's - but for
> that
> > > it's working as expected.
> > > I can inject CDI beans into pages and components using*
> > >  org.apache.tapestry5.ioc.annotations.Inject*
> > >
> > > I'm no expert to tapestry internals - so there could be
> > > other considerations that needs to be addressed.
> > > In fact in seemed just a little to easy to implement - so I must have
> > > missed
> > > something. - Or perhaps it's just that easy to do in Tapestry :)
> > >
> > > Thoughts, comments?
> > >
> >
> >
> >
> > --
> > Best regards,
> >
> > Igor Drobiazko
> > http://tapestry5.de
> >
>

Re: First stab at CDI module for tapestry

Posted by François Facon <fr...@atos.net>.
+1
Did you have a look at https://github.com/got5/cdi-tapestry-contribution?

François

2013/3/9 Kalle Korhonen <ka...@gmail.com>:
> Hey Magnus,
>
> as part of your tapestry-cdi work, did you look into implementing a
> Tapestry CDI SPI, i.e. an implementation of
> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
> thread about injectable entitylisteners (
> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E).
> JPA 2.1 is required the check the SPI (see
> http://java.dzone.com/articles/cdi-extensions-you-can-build,
> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener,
> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets).
> The CDI is a solid spec, we should start thinking about offering
> tapestry-cdi or similar as a core Tapestry module.
>
> Kalle
>
>
> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <ma...@kvalheim.dk>wrote:
>
>> Yes, I've noticed. Great work Igor :)
>>
>> I've intentionally not done anything for tapestry-cdi in terms of
>> supporting
>> javax.inject.@Inject.
>>
>> As Tap @inject and javax @inject are interchangeable - cdi bean injection
>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>>
>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>> <ig...@gmail.com>wrote:
>>
>> > Just as a side note: starting with T5.3 it's possible to use JSR 330 for
>> > injection.
>> >
>> > Check this out:
>> > http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>> >
>> > On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
>> > wrote:
>> >
>> > > Hi all,
>> > >
>> > > We're looking into moving our apps from a 'traditional' servlet
>> container
>> > > with spring into a Java EE web profile server like glassfish 3.1.
>> > > Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
>> > more.
>> > > Not just for the tapestry app, but also the other applications in
>> > > our portfoleo which share common core business logic.
>> > >
>> > > For reference on previous discussions:
>> > >
>> > >
>> >
>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>> > > http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>> > >
>> > > Now, I've tried running the tapestry quickstart app in glassfish 3.1
>> > (with
>> > > the eclipse connector for publishing).
>> > > This works ok - although I cannot make live class reloading work. :(
>> > >
>> > > Glassfish uses Weld, so the CDIModule is basically an objectprovider
>> for
>> > > injecting Weld managed beans.
>> > > (As you probably know CDI/Weld can also be used outside jee as
>> > alternative
>> > > to tapestry-ioc, spring, etc)
>> > >
>> > > *CDIModule class*
>> > > *public class CDIModule { *
>> > > * public static void bind(ServiceBinder binder) {*
>> > > *    binder.bind(ObjectProvider.class,
>> > > CDIObjectProvider.class).withId("CDIObjectProvider");        *
>> > > *    } *
>> > > * public static BeanManager buildBeanManager(Logger log) { *
>> > > * try {*
>> > > * BeanManager beanManager = (BeanManager) new
>> > > InitialContext().lookup("java:comp/BeanManager");*
>> > > * return beanManager; *
>> > > * } catch (NamingException e) {*
>> > > * log.error("Could not lookup jndi resource: java:comp/BeanManager",
>> e);*
>> > > * }*
>> > > * return null;*
>> > > * } *
>> > > * public static void contributeMasterObjectProvider(*
>> > > * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>> > > * OrderedConfiguration<ObjectProvider> configuration) { *
>> > > *// configuration.add("cdiProvider", cdiProvider,
>> > >
>> > >
>> >
>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>> > > *
>> > > * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>> > > * } *
>> > > *}*
>> > > *
>> > > *
>> > > The beanmanager is expected to be found in jndi. If the beans.xml is
>> > > present
>> > > it will be available at this point.
>> > > The BeanManager is also exposed as a service and injectable for other
>> > > services or components.
>> > > I've tested by adding the *@SubModule(CDIModule.class) *to my
>> quickstart
>> > > appmodule.
>> > > *
>> > > *
>> > > *CDIObjectProvider class*
>> > > *public class CDIObjectProvider implements ObjectProvider { *
>> > > * private BeanManager beanManager;*
>> > > * private Logger log;*
>> > > * *
>> > > * @SuppressWarnings({ "unchecked", "rawtypes" })*
>> > > * private Set allowedScopes = CollectionFactory.newSet(*
>> > > * ApplicationScoped.class,*
>> > > * Singleton.class);*
>> > > *
>> > > *
>> > > * public CDIObjectProvider(*
>> > > * Logger log,*
>> > > * @InjectService("BeanManager") BeanManager manager) {*
>> > > * this.beanManager = manager;*
>> > > * this.log = log;*
>> > > * }*
>> > > * @SuppressWarnings("unchecked")*
>> > > * public <T> T provide(Class<T> objectType,*
>> > > * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>> > > * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>> > > * if(beans!=null && beans.size()>0) {*
>> > > * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>> > > * if(hasValidScope(bean)) {*
>> > > * CreationalContext<T> ctx =
>> beanManager.createCreationalContext(bean);*
>> > > * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>> > > * log.info("Found and returning: "+objectType.getCanonicalName());*
>> > > * return o; *
>> > > * }*
>> > > * }*
>> > > * return null;*
>> > > * } *
>> > > * protected <T> boolean hasValidScope(Bean<T> bean) {*
>> > > * return bean!=null && allowedScopes.contains(bean.getScope());*
>> > > * }*
>> > > *}*
>> > >
>> > > I've limited the scope to singleton/applicationscoped. Perhaps also
>> > Default
>> > > could be accepted though.
>> > > Until now I've only tested this with pojo's and not ejb's - but for
>> that
>> > > it's working as expected.
>> > > I can inject CDI beans into pages and components using*
>> > >  org.apache.tapestry5.ioc.annotations.Inject*
>> > >
>> > > I'm no expert to tapestry internals - so there could be
>> > > other considerations that needs to be addressed.
>> > > In fact in seemed just a little to easy to implement - so I must have
>> > > missed
>> > > something. - Or perhaps it's just that easy to do in Tapestry :)
>> > >
>> > > Thoughts, comments?
>> > >
>> >
>> >
>> >
>> > --
>> > Best regards,
>> >
>> > Igor Drobiazko
>> > http://tapestry5.de
>> >
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: First stab at CDI module for tapestry

Posted by Kalle Korhonen <ka...@gmail.com>.
Just to complete the loop on my side regarding making Tapestry services as
CDI beans, it is almost, kind of, possible via an SPI extension. However,
you run into issues with the lifecycle management and bean requirements
(no-arg constructor etc.) as well as dependency loops. I followed
http://rmannibucau.wordpress.com/2013/08/19/adding-legacy-beans-to-cdi-context-a-cdi-extension-sample/for
inspiration (the author also has his code up on github at
https://github.com/rmannibucau/cdi-light-config/). A reasonable solution
could be useful for Tapestry as more JEE libraries expect a CDI layer. CDI
is great but still feels bulky and needlessly cumbersome compared to the
lightweight and easy-to-grasp nature of tapestry-ioc (for example, just
compare serviceResources.autobuild() to DeltaSpike's BeanBuilder). Perhaps
a future version of CDI will address this betters as the big boys (Spring,
Guice) are on the same boat (see
http://antoniogoncalves.org/2011/01/12/bootstrapping-cdi-in-several-environments/,
http://jglue.org/2011/11/29/cdi-for-guice-users/ for more info).

Kalle


On Sat, Mar 9, 2013 at 2:34 PM, Kalle Korhonen
<ka...@gmail.com>wrote:

> Hey Magnus,
>
> as part of your tapestry-cdi work, did you look into implementing a
> Tapestry CDI SPI, i.e. an implementation of
> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
> thread about injectable entitylisteners (
> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E).
> JPA 2.1 is required the check the SPI (see
> http://java.dzone.com/articles/cdi-extensions-you-can-build,
> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener,
>
> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets).
> The CDI is a solid spec, we should start thinking about offering
> tapestry-cdi or similar as a core Tapestry module.
>
> Kalle
>
>
>
> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <ma...@kvalheim.dk>wrote:
>
>> Yes, I've noticed. Great work Igor :)
>>
>> I've intentionally not done anything for tapestry-cdi in terms of
>> supporting
>> javax.inject.@Inject.
>>
>> As Tap @inject and javax @inject are interchangeable - cdi bean injection
>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>>
>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>> <ig...@gmail.com>wrote:
>>
>> > Just as a side note: starting with T5.3 it's possible to use JSR 330 for
>> > injection.
>> >
>> > Check this out:
>> > http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>> >
>> > On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
>> > wrote:
>> >
>> > > Hi all,
>> > >
>> > > We're looking into moving our apps from a 'traditional' servlet
>> container
>> > > with spring into a Java EE web profile server like glassfish 3.1.
>> > > Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
>> > more.
>> > > Not just for the tapestry app, but also the other applications in
>> > > our portfoleo which share common core business logic.
>> > >
>> > > For reference on previous discussions:
>> > >
>> > >
>> >
>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>> > > http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>> > >
>> > > Now, I've tried running the tapestry quickstart app in glassfish 3.1
>> > (with
>> > > the eclipse connector for publishing).
>> > > This works ok - although I cannot make live class reloading work. :(
>> > >
>> > > Glassfish uses Weld, so the CDIModule is basically an objectprovider
>> for
>> > > injecting Weld managed beans.
>> > > (As you probably know CDI/Weld can also be used outside jee as
>> > alternative
>> > > to tapestry-ioc, spring, etc)
>> > >
>> > > *CDIModule class*
>> > > *public class CDIModule { *
>> > > * public static void bind(ServiceBinder binder) {*
>> > > *    binder.bind(ObjectProvider.class,
>> > > CDIObjectProvider.class).withId("CDIObjectProvider");        *
>> > > *    } *
>> > > * public static BeanManager buildBeanManager(Logger log) { *
>> > > * try {*
>> > > * BeanManager beanManager = (BeanManager) new
>> > > InitialContext().lookup("java:comp/BeanManager");*
>> > > * return beanManager; *
>> > > * } catch (NamingException e) {*
>> > > * log.error("Could not lookup jndi resource: java:comp/BeanManager",
>> e);*
>> > > * }*
>> > > * return null;*
>> > > * } *
>> > > * public static void contributeMasterObjectProvider(*
>> > > * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>> > > * OrderedConfiguration<ObjectProvider> configuration) { *
>> > > *// configuration.add("cdiProvider", cdiProvider,
>> > >
>> > >
>> >
>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>> > > *
>> > > * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>> > > * } *
>> > > *}*
>> > > *
>> > > *
>> > > The beanmanager is expected to be found in jndi. If the beans.xml is
>> > > present
>> > > it will be available at this point.
>> > > The BeanManager is also exposed as a service and injectable for other
>> > > services or components.
>> > > I've tested by adding the *@SubModule(CDIModule.class) *to my
>> quickstart
>> > > appmodule.
>> > > *
>> > > *
>> > > *CDIObjectProvider class*
>> > > *public class CDIObjectProvider implements ObjectProvider { *
>> > > * private BeanManager beanManager;*
>> > > * private Logger log;*
>> > > * *
>> > > * @SuppressWarnings({ "unchecked", "rawtypes" })*
>> > > * private Set allowedScopes = CollectionFactory.newSet(*
>> > > * ApplicationScoped.class,*
>> > > * Singleton.class);*
>> > > *
>> > > *
>> > > * public CDIObjectProvider(*
>> > > * Logger log,*
>> > > * @InjectService("BeanManager") BeanManager manager) {*
>> > > * this.beanManager = manager;*
>> > > * this.log = log;*
>> > > * }*
>> > > * @SuppressWarnings("unchecked")*
>> > > * public <T> T provide(Class<T> objectType,*
>> > > * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>> > > * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>> > > * if(beans!=null && beans.size()>0) {*
>> > > * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>> > > * if(hasValidScope(bean)) {*
>> > > * CreationalContext<T> ctx =
>> beanManager.createCreationalContext(bean);*
>> > > * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>> > > * log.info("Found and returning: "+objectType.getCanonicalName());*
>> > > * return o; *
>> > > * }*
>> > > * }*
>> > > * return null;*
>> > > * } *
>> > > * protected <T> boolean hasValidScope(Bean<T> bean) {*
>> > > * return bean!=null && allowedScopes.contains(bean.getScope());*
>> > > * }*
>> > > *}*
>> > >
>> > > I've limited the scope to singleton/applicationscoped. Perhaps also
>> > Default
>> > > could be accepted though.
>> > > Until now I've only tested this with pojo's and not ejb's - but for
>> that
>> > > it's working as expected.
>> > > I can inject CDI beans into pages and components using*
>> > >  org.apache.tapestry5.ioc.annotations.Inject*
>> > >
>> > > I'm no expert to tapestry internals - so there could be
>> > > other considerations that needs to be addressed.
>> > > In fact in seemed just a little to easy to implement - so I must have
>> > > missed
>> > > something. - Or perhaps it's just that easy to do in Tapestry :)
>> > >
>> > > Thoughts, comments?
>> > >
>> >
>> >
>> >
>> > --
>> > Best regards,
>> >
>> > Igor Drobiazko
>> > http://tapestry5.de
>> >
>>
>
>

Re: First stab at CDI module for tapestry

Posted by Lenny Primak <lp...@hope.nyc.ny.us>.
We are using FlowLogix CDI support in production now.
The code is basically taken from Magnus' module, and
enhanced it a bit to be more resilient in case CDI is not present.
We've been using it in production for 6 months and it works great.

On Mar 10, 2013, at 5:56 PM, Magnus Kvalheim wrote:

> Hi.
> 
> Our motivation at the time was to investigate a move from a spring stack to
> a jee one.
> Most is written using jee annotations, with spring behind the scenes, so a
> switch looked feasible.
> 
> I made the tapestry-cdi module which bridged the gap on tapestry side.
> ( https://github.com/magnuskvalheim/tapestry-cdi ).
> 
> It worked quite well and got our apps playing nice with jee; jboss as7,
> jpa, cdi, +more and tapestry. But in the end it didn't move past sandbox
> stage and we're still with spring. It was a nice experience though and I
> found CDI quite solid and powerful and think that Tapestry does deserve a
> first class CDI module.
> 
> We never had any need to to do the reverse (expose tapestry services to
> cdi) so we didn't explore that in detail.
> Tapestry IOC has a lot going for it as well so I can see that some would
> like the option to go that direction as well.
> 
> I think that maybe CDI->Tapestry and Tapestry->CDI should be
> two separate modules. Or if it's in same module - have a convenient way to
> configure what directions for it to operate.
> 
> For CDI->Tapestry I would be happy to donate my module if it can be useful.
> Think maybe Lenny have some production related experience with it.
> The other mentioned, cdi-tapestry-contribution (
> https://github.com/rmannibucau/cdi-tapestry-contribution ) looks good and
> could be used somewhere in production as well.
> IMO we only need one good supported one :-)
> 
> --magnus
> 
> On Sun, Mar 10, 2013 at 10:15 AM, Lenny Primak <lp...@hope.nyc.ny.us>wrote:
> 
>> Kalle, that is exactly correct.
>> The CDI stuff (and by extension the CDI code in FlowLogix) which is taken
>> direct from CDI module
>> is so meant to use CDI beans in Tapestry, not use Tapestry services as CDI
>> beans.
>> 
>> On Mar 10, 2013, at 1:58 AM, Kalle Korhonen wrote:
>> 
>>> Both of these seem to be about referencing and using CDI managed beans in
>>> Tapestry services, please correct me if I'm wrong. What I'm asking is the
>>> reverse - using Tapestry services in applications & frameworks expecting
>> a
>>> CDI environment.
>>> 
>>> Kalle
>>> 
>>> 
>>> On Sat, Mar 9, 2013 at 3:41 PM, Lenny Primak <lp...@hope.nyc.ny.us>
>> wrote:
>>> 
>>>> Actually, the CDI SPI statement may not be accurate.
>>>> CDI support uses BeanManager to do its job, so its CDI SPI.  Not sure,
>>>> Kalle, if that's what you are referring to.
>>>> 
>>>> 
>>>> 
>> http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/CDIModule.java
>>>> 
>>>> On Mar 9, 2013, at 5:56 PM, Lenny Primak wrote:
>>>> 
>>>>> I would love to contribute the FlowLogix module, or as much of it as it
>>>> still applies to tapestry 5.4 into the core. It includes CDI support
>> plus
>>>> the JEE stack support.
>>>>> The CDI interface doesn't use SPI yet.
>>>>> 
>>>>> 
>>>>> 
>>>>> On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <kalle.o.korhonen@gmail.com
>>> 
>>>> wrote:
>>>>> 
>>>>>> Hey Magnus,
>>>>>> 
>>>>>> as part of your tapestry-cdi work, did you look into implementing a
>>>>>> Tapestry CDI SPI, i.e. an implementation of
>>>>>> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
>>>>>> thread about injectable entitylisteners (
>>>>>> 
>>>> 
>> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E
>>>> ).
>>>>>> JPA 2.1 is required the check the SPI (see
>>>>>> http://java.dzone.com/articles/cdi-extensions-you-can-build,
>>>>>> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
>>>>>> 
>>>> 
>> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener
>>>> ,
>>>>>> 
>>>> 
>> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets
>>>> ).
>>>>>> The CDI is a solid spec, we should start thinking about offering
>>>>>> tapestry-cdi or similar as a core Tapestry module.
>>>>>> 
>>>>>> Kalle
>>>>>> 
>>>>>> 
>>>>>> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <magnus@kvalheim.dk
>>>>> wrote:
>>>>>> 
>>>>>>> Yes, I've noticed. Great work Igor :)
>>>>>>> 
>>>>>>> I've intentionally not done anything for tapestry-cdi in terms of
>>>>>>> supporting
>>>>>>> javax.inject.@Inject.
>>>>>>> 
>>>>>>> As Tap @inject and javax @inject are interchangeable - cdi bean
>>>> injection
>>>>>>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>>>>>>> 
>>>>>>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>>>>>>> <ig...@gmail.com>wrote:
>>>>>>> 
>>>>>>>> Just as a side note: starting with T5.3 it's possible to use JSR 330
>>>> for
>>>>>>>> injection.
>>>>>>>> 
>>>>>>>> Check this out:
>>>>>>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>>>>>>>> 
>>>>>>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <magnus@kvalheim.dk
>>> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>>> Hi all,
>>>>>>>>> 
>>>>>>>>> We're looking into moving our apps from a 'traditional' servlet
>>>>>>> container
>>>>>>>>> with spring into a Java EE web profile server like glassfish 3.1.
>>>>>>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3
>> and
>>>>>>>> more.
>>>>>>>>> Not just for the tapestry app, but also the other applications in
>>>>>>>>> our portfoleo which share common core business logic.
>>>>>>>>> 
>>>>>>>>> For reference on previous discussions:
>>>>>>> 
>>>> 
>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>>>>>>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>>>>>>>>> 
>>>>>>>>> Now, I've tried running the tapestry quickstart app in glassfish
>> 3.1
>>>>>>>> (with
>>>>>>>>> the eclipse connector for publishing).
>>>>>>>>> This works ok - although I cannot make live class reloading work.
>> :(
>>>>>>>>> 
>>>>>>>>> Glassfish uses Weld, so the CDIModule is basically an
>> objectprovider
>>>>>>> for
>>>>>>>>> injecting Weld managed beans.
>>>>>>>>> (As you probably know CDI/Weld can also be used outside jee as
>>>>>>>> alternative
>>>>>>>>> to tapestry-ioc, spring, etc)
>>>>>>>>> 
>>>>>>>>> *CDIModule class*
>>>>>>>>> *public class CDIModule { *
>>>>>>>>> * public static void bind(ServiceBinder binder) {*
>>>>>>>>> *    binder.bind(ObjectProvider.class,
>>>>>>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
>>>>>>>>> *    } *
>>>>>>>>> * public static BeanManager buildBeanManager(Logger log) { *
>>>>>>>>> * try {*
>>>>>>>>> * BeanManager beanManager = (BeanManager) new
>>>>>>>>> InitialContext().lookup("java:comp/BeanManager");*
>>>>>>>>> * return beanManager; *
>>>>>>>>> * } catch (NamingException e) {*
>>>>>>>>> * log.error("Could not lookup jndi resource:
>> java:comp/BeanManager",
>>>>>>> e);*
>>>>>>>>> * }*
>>>>>>>>> * return null;*
>>>>>>>>> * } *
>>>>>>>>> * public static void contributeMasterObjectProvider(*
>>>>>>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>>>>>>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
>>>>>>>>> *// configuration.add("cdiProvider", cdiProvider,
>>>>>>> 
>>>> 
>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>>>>>>>>> *
>>>>>>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>>>>>>>>> * } *
>>>>>>>>> *}*
>>>>>>>>> *
>>>>>>>>> *
>>>>>>>>> The beanmanager is expected to be found in jndi. If the beans.xml
>> is
>>>>>>>>> present
>>>>>>>>> it will be available at this point.
>>>>>>>>> The BeanManager is also exposed as a service and injectable for
>> other
>>>>>>>>> services or components.
>>>>>>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
>>>>>>> quickstart
>>>>>>>>> appmodule.
>>>>>>>>> *
>>>>>>>>> *
>>>>>>>>> *CDIObjectProvider class*
>>>>>>>>> *public class CDIObjectProvider implements ObjectProvider { *
>>>>>>>>> * private BeanManager beanManager;*
>>>>>>>>> * private Logger log;*
>>>>>>>>> * *
>>>>>>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
>>>>>>>>> * private Set allowedScopes = CollectionFactory.newSet(*
>>>>>>>>> * ApplicationScoped.class,*
>>>>>>>>> * Singleton.class);*
>>>>>>>>> *
>>>>>>>>> *
>>>>>>>>> * public CDIObjectProvider(*
>>>>>>>>> * Logger log,*
>>>>>>>>> * @InjectService("BeanManager") BeanManager manager) {*
>>>>>>>>> * this.beanManager = manager;*
>>>>>>>>> * this.log = log;*
>>>>>>>>> * }*
>>>>>>>>> * @SuppressWarnings("unchecked")*
>>>>>>>>> * public <T> T provide(Class<T> objectType,*
>>>>>>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>>>>>>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>>>>>>>>> * if(beans!=null && beans.size()>0) {*
>>>>>>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>>>>>>>>> * if(hasValidScope(bean)) {*
>>>>>>>>> * CreationalContext<T> ctx =
>>>>>>> beanManager.createCreationalContext(bean);*
>>>>>>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>>>>>>>>> * log.info("Found and returning:
>> "+objectType.getCanonicalName());*
>>>>>>>>> * return o; *
>>>>>>>>> * }*
>>>>>>>>> * }*
>>>>>>>>> * return null;*
>>>>>>>>> * } *
>>>>>>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
>>>>>>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
>>>>>>>>> * }*
>>>>>>>>> *}*
>>>>>>>>> 
>>>>>>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
>>>>>>>> Default
>>>>>>>>> could be accepted though.
>>>>>>>>> Until now I've only tested this with pojo's and not ejb's - but for
>>>>>>> that
>>>>>>>>> it's working as expected.
>>>>>>>>> I can inject CDI beans into pages and components using*
>>>>>>>>> org.apache.tapestry5.ioc.annotations.Inject*
>>>>>>>>> 
>>>>>>>>> I'm no expert to tapestry internals - so there could be
>>>>>>>>> other considerations that needs to be addressed.
>>>>>>>>> In fact in seemed just a little to easy to implement - so I must
>> have
>>>>>>>>> missed
>>>>>>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
>>>>>>>>> 
>>>>>>>>> Thoughts, comments?
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> --
>>>>>>>> Best regards,
>>>>>>>> 
>>>>>>>> Igor Drobiazko
>>>>>>>> http://tapestry5.de
>>>>>>> 
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>> 
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>> 
>>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: First stab at CDI module for tapestry

Posted by Magnus Kvalheim <ma...@kvalheim.dk>.
Hi.

Our motivation at the time was to investigate a move from a spring stack to
a jee one.
Most is written using jee annotations, with spring behind the scenes, so a
switch looked feasible.

I made the tapestry-cdi module which bridged the gap on tapestry side.
( https://github.com/magnuskvalheim/tapestry-cdi ).

It worked quite well and got our apps playing nice with jee; jboss as7,
jpa, cdi, +more and tapestry. But in the end it didn't move past sandbox
stage and we're still with spring. It was a nice experience though and I
found CDI quite solid and powerful and think that Tapestry does deserve a
first class CDI module.

We never had any need to to do the reverse (expose tapestry services to
cdi) so we didn't explore that in detail.
Tapestry IOC has a lot going for it as well so I can see that some would
like the option to go that direction as well.

I think that maybe CDI->Tapestry and Tapestry->CDI should be
two separate modules. Or if it's in same module - have a convenient way to
configure what directions for it to operate.

For CDI->Tapestry I would be happy to donate my module if it can be useful.
Think maybe Lenny have some production related experience with it.
The other mentioned, cdi-tapestry-contribution (
https://github.com/rmannibucau/cdi-tapestry-contribution ) looks good and
could be used somewhere in production as well.
IMO we only need one good supported one :-)

--magnus

On Sun, Mar 10, 2013 at 10:15 AM, Lenny Primak <lp...@hope.nyc.ny.us>wrote:

> Kalle, that is exactly correct.
> The CDI stuff (and by extension the CDI code in FlowLogix) which is taken
> direct from CDI module
> is so meant to use CDI beans in Tapestry, not use Tapestry services as CDI
> beans.
>
> On Mar 10, 2013, at 1:58 AM, Kalle Korhonen wrote:
>
> > Both of these seem to be about referencing and using CDI managed beans in
> > Tapestry services, please correct me if I'm wrong. What I'm asking is the
> > reverse - using Tapestry services in applications & frameworks expecting
> a
> > CDI environment.
> >
> > Kalle
> >
> >
> > On Sat, Mar 9, 2013 at 3:41 PM, Lenny Primak <lp...@hope.nyc.ny.us>
> wrote:
> >
> >> Actually, the CDI SPI statement may not be accurate.
> >> CDI support uses BeanManager to do its job, so its CDI SPI.  Not sure,
> >> Kalle, if that's what you are referring to.
> >>
> >>
> >>
> http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/CDIModule.java
> >>
> >> On Mar 9, 2013, at 5:56 PM, Lenny Primak wrote:
> >>
> >>> I would love to contribute the FlowLogix module, or as much of it as it
> >> still applies to tapestry 5.4 into the core. It includes CDI support
> plus
> >> the JEE stack support.
> >>> The CDI interface doesn't use SPI yet.
> >>>
> >>>
> >>>
> >>> On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <kalle.o.korhonen@gmail.com
> >
> >> wrote:
> >>>
> >>>> Hey Magnus,
> >>>>
> >>>> as part of your tapestry-cdi work, did you look into implementing a
> >>>> Tapestry CDI SPI, i.e. an implementation of
> >>>> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
> >>>> thread about injectable entitylisteners (
> >>>>
> >>
> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E
> >> ).
> >>>> JPA 2.1 is required the check the SPI (see
> >>>> http://java.dzone.com/articles/cdi-extensions-you-can-build,
> >>>> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
> >>>>
> >>
> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener
> >> ,
> >>>>
> >>
> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets
> >> ).
> >>>> The CDI is a solid spec, we should start thinking about offering
> >>>> tapestry-cdi or similar as a core Tapestry module.
> >>>>
> >>>> Kalle
> >>>>
> >>>>
> >>>> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <magnus@kvalheim.dk
> >>> wrote:
> >>>>
> >>>>> Yes, I've noticed. Great work Igor :)
> >>>>>
> >>>>> I've intentionally not done anything for tapestry-cdi in terms of
> >>>>> supporting
> >>>>> javax.inject.@Inject.
> >>>>>
> >>>>> As Tap @inject and javax @inject are interchangeable - cdi bean
> >> injection
> >>>>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
> >>>>>
> >>>>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
> >>>>> <ig...@gmail.com>wrote:
> >>>>>
> >>>>>> Just as a side note: starting with T5.3 it's possible to use JSR 330
> >> for
> >>>>>> injection.
> >>>>>>
> >>>>>> Check this out:
> >>>>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
> >>>>>>
> >>>>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <magnus@kvalheim.dk
> >
> >>>>>> wrote:
> >>>>>>
> >>>>>>> Hi all,
> >>>>>>>
> >>>>>>> We're looking into moving our apps from a 'traditional' servlet
> >>>>> container
> >>>>>>> with spring into a Java EE web profile server like glassfish 3.1.
> >>>>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3
> and
> >>>>>> more.
> >>>>>>> Not just for the tapestry app, but also the other applications in
> >>>>>>> our portfoleo which share common core business logic.
> >>>>>>>
> >>>>>>> For reference on previous discussions:
> >>>>>
> >>
> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
> >>>>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
> >>>>>>>
> >>>>>>> Now, I've tried running the tapestry quickstart app in glassfish
> 3.1
> >>>>>> (with
> >>>>>>> the eclipse connector for publishing).
> >>>>>>> This works ok - although I cannot make live class reloading work.
> :(
> >>>>>>>
> >>>>>>> Glassfish uses Weld, so the CDIModule is basically an
> objectprovider
> >>>>> for
> >>>>>>> injecting Weld managed beans.
> >>>>>>> (As you probably know CDI/Weld can also be used outside jee as
> >>>>>> alternative
> >>>>>>> to tapestry-ioc, spring, etc)
> >>>>>>>
> >>>>>>> *CDIModule class*
> >>>>>>> *public class CDIModule { *
> >>>>>>> * public static void bind(ServiceBinder binder) {*
> >>>>>>> *    binder.bind(ObjectProvider.class,
> >>>>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
> >>>>>>> *    } *
> >>>>>>> * public static BeanManager buildBeanManager(Logger log) { *
> >>>>>>> * try {*
> >>>>>>> * BeanManager beanManager = (BeanManager) new
> >>>>>>> InitialContext().lookup("java:comp/BeanManager");*
> >>>>>>> * return beanManager; *
> >>>>>>> * } catch (NamingException e) {*
> >>>>>>> * log.error("Could not lookup jndi resource:
> java:comp/BeanManager",
> >>>>> e);*
> >>>>>>> * }*
> >>>>>>> * return null;*
> >>>>>>> * } *
> >>>>>>> * public static void contributeMasterObjectProvider(*
> >>>>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
> >>>>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
> >>>>>>> *// configuration.add("cdiProvider", cdiProvider,
> >>>>>
> >>
> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
> >>>>>>> *
> >>>>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
> >>>>>>> * } *
> >>>>>>> *}*
> >>>>>>> *
> >>>>>>> *
> >>>>>>> The beanmanager is expected to be found in jndi. If the beans.xml
> is
> >>>>>>> present
> >>>>>>> it will be available at this point.
> >>>>>>> The BeanManager is also exposed as a service and injectable for
> other
> >>>>>>> services or components.
> >>>>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
> >>>>> quickstart
> >>>>>>> appmodule.
> >>>>>>> *
> >>>>>>> *
> >>>>>>> *CDIObjectProvider class*
> >>>>>>> *public class CDIObjectProvider implements ObjectProvider { *
> >>>>>>> * private BeanManager beanManager;*
> >>>>>>> * private Logger log;*
> >>>>>>> * *
> >>>>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
> >>>>>>> * private Set allowedScopes = CollectionFactory.newSet(*
> >>>>>>> * ApplicationScoped.class,*
> >>>>>>> * Singleton.class);*
> >>>>>>> *
> >>>>>>> *
> >>>>>>> * public CDIObjectProvider(*
> >>>>>>> * Logger log,*
> >>>>>>> * @InjectService("BeanManager") BeanManager manager) {*
> >>>>>>> * this.beanManager = manager;*
> >>>>>>> * this.log = log;*
> >>>>>>> * }*
> >>>>>>> * @SuppressWarnings("unchecked")*
> >>>>>>> * public <T> T provide(Class<T> objectType,*
> >>>>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
> >>>>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
> >>>>>>> * if(beans!=null && beans.size()>0) {*
> >>>>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
> >>>>>>> * if(hasValidScope(bean)) {*
> >>>>>>> * CreationalContext<T> ctx =
> >>>>> beanManager.createCreationalContext(bean);*
> >>>>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
> >>>>>>> * log.info("Found and returning:
> "+objectType.getCanonicalName());*
> >>>>>>> * return o; *
> >>>>>>> * }*
> >>>>>>> * }*
> >>>>>>> * return null;*
> >>>>>>> * } *
> >>>>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
> >>>>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
> >>>>>>> * }*
> >>>>>>> *}*
> >>>>>>>
> >>>>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
> >>>>>> Default
> >>>>>>> could be accepted though.
> >>>>>>> Until now I've only tested this with pojo's and not ejb's - but for
> >>>>> that
> >>>>>>> it's working as expected.
> >>>>>>> I can inject CDI beans into pages and components using*
> >>>>>>> org.apache.tapestry5.ioc.annotations.Inject*
> >>>>>>>
> >>>>>>> I'm no expert to tapestry internals - so there could be
> >>>>>>> other considerations that needs to be addressed.
> >>>>>>> In fact in seemed just a little to easy to implement - so I must
> have
> >>>>>>> missed
> >>>>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
> >>>>>>>
> >>>>>>> Thoughts, comments?
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Best regards,
> >>>>>>
> >>>>>> Igor Drobiazko
> >>>>>> http://tapestry5.de
> >>>>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> >>> For additional commands, e-mail: users-help@tapestry.apache.org
> >>>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> >> For additional commands, e-mail: users-help@tapestry.apache.org
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

Re: First stab at CDI module for tapestry

Posted by Lenny Primak <lp...@hope.nyc.ny.us>.
Also, you can secure CDI beans using Tapestry-security using this:

http://code.google.com/p/flowlogix/wiki/TLShiroSecurityInterceptor

On Mar 10, 2013, at 5:15 AM, Lenny Primak wrote:

> Kalle, that is exactly correct.
> The CDI stuff (and by extension the CDI code in FlowLogix) which is taken direct from CDI module
> is so meant to use CDI beans in Tapestry, not use Tapestry services as CDI beans.
> 
> On Mar 10, 2013, at 1:58 AM, Kalle Korhonen wrote:
> 
>> Both of these seem to be about referencing and using CDI managed beans in
>> Tapestry services, please correct me if I'm wrong. What I'm asking is the
>> reverse - using Tapestry services in applications & frameworks expecting a
>> CDI environment.
>> 
>> Kalle
>> 
>> 
>> On Sat, Mar 9, 2013 at 3:41 PM, Lenny Primak <lp...@hope.nyc.ny.us> wrote:
>> 
>>> Actually, the CDI SPI statement may not be accurate.
>>> CDI support uses BeanManager to do its job, so its CDI SPI.  Not sure,
>>> Kalle, if that's what you are referring to.
>>> 
>>> 
>>> http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/CDIModule.java
>>> 
>>> On Mar 9, 2013, at 5:56 PM, Lenny Primak wrote:
>>> 
>>>> I would love to contribute the FlowLogix module, or as much of it as it
>>> still applies to tapestry 5.4 into the core. It includes CDI support plus
>>> the JEE stack support.
>>>> The CDI interface doesn't use SPI yet.
>>>> 
>>>> 
>>>> 
>>>> On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <ka...@gmail.com>
>>> wrote:
>>>> 
>>>>> Hey Magnus,
>>>>> 
>>>>> as part of your tapestry-cdi work, did you look into implementing a
>>>>> Tapestry CDI SPI, i.e. an implementation of
>>>>> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
>>>>> thread about injectable entitylisteners (
>>>>> 
>>> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E
>>> ).
>>>>> JPA 2.1 is required the check the SPI (see
>>>>> http://java.dzone.com/articles/cdi-extensions-you-can-build,
>>>>> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
>>>>> 
>>> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener
>>> ,
>>>>> 
>>> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets
>>> ).
>>>>> The CDI is a solid spec, we should start thinking about offering
>>>>> tapestry-cdi or similar as a core Tapestry module.
>>>>> 
>>>>> Kalle
>>>>> 
>>>>> 
>>>>> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <magnus@kvalheim.dk
>>>> wrote:
>>>>> 
>>>>>> Yes, I've noticed. Great work Igor :)
>>>>>> 
>>>>>> I've intentionally not done anything for tapestry-cdi in terms of
>>>>>> supporting
>>>>>> javax.inject.@Inject.
>>>>>> 
>>>>>> As Tap @inject and javax @inject are interchangeable - cdi bean
>>> injection
>>>>>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>>>>>> 
>>>>>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>>>>>> <ig...@gmail.com>wrote:
>>>>>> 
>>>>>>> Just as a side note: starting with T5.3 it's possible to use JSR 330
>>> for
>>>>>>> injection.
>>>>>>> 
>>>>>>> Check this out:
>>>>>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>>>>>>> 
>>>>>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
>>>>>>> wrote:
>>>>>>> 
>>>>>>>> Hi all,
>>>>>>>> 
>>>>>>>> We're looking into moving our apps from a 'traditional' servlet
>>>>>> container
>>>>>>>> with spring into a Java EE web profile server like glassfish 3.1.
>>>>>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
>>>>>>> more.
>>>>>>>> Not just for the tapestry app, but also the other applications in
>>>>>>>> our portfoleo which share common core business logic.
>>>>>>>> 
>>>>>>>> For reference on previous discussions:
>>>>>> 
>>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>>>>>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>>>>>>>> 
>>>>>>>> Now, I've tried running the tapestry quickstart app in glassfish 3.1
>>>>>>> (with
>>>>>>>> the eclipse connector for publishing).
>>>>>>>> This works ok - although I cannot make live class reloading work. :(
>>>>>>>> 
>>>>>>>> Glassfish uses Weld, so the CDIModule is basically an objectprovider
>>>>>> for
>>>>>>>> injecting Weld managed beans.
>>>>>>>> (As you probably know CDI/Weld can also be used outside jee as
>>>>>>> alternative
>>>>>>>> to tapestry-ioc, spring, etc)
>>>>>>>> 
>>>>>>>> *CDIModule class*
>>>>>>>> *public class CDIModule { *
>>>>>>>> * public static void bind(ServiceBinder binder) {*
>>>>>>>> *    binder.bind(ObjectProvider.class,
>>>>>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
>>>>>>>> *    } *
>>>>>>>> * public static BeanManager buildBeanManager(Logger log) { *
>>>>>>>> * try {*
>>>>>>>> * BeanManager beanManager = (BeanManager) new
>>>>>>>> InitialContext().lookup("java:comp/BeanManager");*
>>>>>>>> * return beanManager; *
>>>>>>>> * } catch (NamingException e) {*
>>>>>>>> * log.error("Could not lookup jndi resource: java:comp/BeanManager",
>>>>>> e);*
>>>>>>>> * }*
>>>>>>>> * return null;*
>>>>>>>> * } *
>>>>>>>> * public static void contributeMasterObjectProvider(*
>>>>>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>>>>>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
>>>>>>>> *// configuration.add("cdiProvider", cdiProvider,
>>>>>> 
>>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>>>>>>>> *
>>>>>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>>>>>>>> * } *
>>>>>>>> *}*
>>>>>>>> *
>>>>>>>> *
>>>>>>>> The beanmanager is expected to be found in jndi. If the beans.xml is
>>>>>>>> present
>>>>>>>> it will be available at this point.
>>>>>>>> The BeanManager is also exposed as a service and injectable for other
>>>>>>>> services or components.
>>>>>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
>>>>>> quickstart
>>>>>>>> appmodule.
>>>>>>>> *
>>>>>>>> *
>>>>>>>> *CDIObjectProvider class*
>>>>>>>> *public class CDIObjectProvider implements ObjectProvider { *
>>>>>>>> * private BeanManager beanManager;*
>>>>>>>> * private Logger log;*
>>>>>>>> * *
>>>>>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
>>>>>>>> * private Set allowedScopes = CollectionFactory.newSet(*
>>>>>>>> * ApplicationScoped.class,*
>>>>>>>> * Singleton.class);*
>>>>>>>> *
>>>>>>>> *
>>>>>>>> * public CDIObjectProvider(*
>>>>>>>> * Logger log,*
>>>>>>>> * @InjectService("BeanManager") BeanManager manager) {*
>>>>>>>> * this.beanManager = manager;*
>>>>>>>> * this.log = log;*
>>>>>>>> * }*
>>>>>>>> * @SuppressWarnings("unchecked")*
>>>>>>>> * public <T> T provide(Class<T> objectType,*
>>>>>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>>>>>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>>>>>>>> * if(beans!=null && beans.size()>0) {*
>>>>>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>>>>>>>> * if(hasValidScope(bean)) {*
>>>>>>>> * CreationalContext<T> ctx =
>>>>>> beanManager.createCreationalContext(bean);*
>>>>>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>>>>>>>> * log.info("Found and returning: "+objectType.getCanonicalName());*
>>>>>>>> * return o; *
>>>>>>>> * }*
>>>>>>>> * }*
>>>>>>>> * return null;*
>>>>>>>> * } *
>>>>>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
>>>>>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
>>>>>>>> * }*
>>>>>>>> *}*
>>>>>>>> 
>>>>>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
>>>>>>> Default
>>>>>>>> could be accepted though.
>>>>>>>> Until now I've only tested this with pojo's and not ejb's - but for
>>>>>> that
>>>>>>>> it's working as expected.
>>>>>>>> I can inject CDI beans into pages and components using*
>>>>>>>> org.apache.tapestry5.ioc.annotations.Inject*
>>>>>>>> 
>>>>>>>> I'm no expert to tapestry internals - so there could be
>>>>>>>> other considerations that needs to be addressed.
>>>>>>>> In fact in seemed just a little to easy to implement - so I must have
>>>>>>>> missed
>>>>>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
>>>>>>>> 
>>>>>>>> Thoughts, comments?
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> Best regards,
>>>>>>> 
>>>>>>> Igor Drobiazko
>>>>>>> http://tapestry5.de
>>>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>> 
>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>> 
>>> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: First stab at CDI module for tapestry

Posted by Lenny Primak <lp...@hope.nyc.ny.us>.
Kalle, that is exactly correct.
The CDI stuff (and by extension the CDI code in FlowLogix) which is taken direct from CDI module
is so meant to use CDI beans in Tapestry, not use Tapestry services as CDI beans.

On Mar 10, 2013, at 1:58 AM, Kalle Korhonen wrote:

> Both of these seem to be about referencing and using CDI managed beans in
> Tapestry services, please correct me if I'm wrong. What I'm asking is the
> reverse - using Tapestry services in applications & frameworks expecting a
> CDI environment.
> 
> Kalle
> 
> 
> On Sat, Mar 9, 2013 at 3:41 PM, Lenny Primak <lp...@hope.nyc.ny.us> wrote:
> 
>> Actually, the CDI SPI statement may not be accurate.
>> CDI support uses BeanManager to do its job, so its CDI SPI.  Not sure,
>> Kalle, if that's what you are referring to.
>> 
>> 
>> http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/CDIModule.java
>> 
>> On Mar 9, 2013, at 5:56 PM, Lenny Primak wrote:
>> 
>>> I would love to contribute the FlowLogix module, or as much of it as it
>> still applies to tapestry 5.4 into the core. It includes CDI support plus
>> the JEE stack support.
>>> The CDI interface doesn't use SPI yet.
>>> 
>>> 
>>> 
>>> On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <ka...@gmail.com>
>> wrote:
>>> 
>>>> Hey Magnus,
>>>> 
>>>> as part of your tapestry-cdi work, did you look into implementing a
>>>> Tapestry CDI SPI, i.e. an implementation of
>>>> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
>>>> thread about injectable entitylisteners (
>>>> 
>> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E
>> ).
>>>> JPA 2.1 is required the check the SPI (see
>>>> http://java.dzone.com/articles/cdi-extensions-you-can-build,
>>>> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
>>>> 
>> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener
>> ,
>>>> 
>> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets
>> ).
>>>> The CDI is a solid spec, we should start thinking about offering
>>>> tapestry-cdi or similar as a core Tapestry module.
>>>> 
>>>> Kalle
>>>> 
>>>> 
>>>> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <magnus@kvalheim.dk
>>> wrote:
>>>> 
>>>>> Yes, I've noticed. Great work Igor :)
>>>>> 
>>>>> I've intentionally not done anything for tapestry-cdi in terms of
>>>>> supporting
>>>>> javax.inject.@Inject.
>>>>> 
>>>>> As Tap @inject and javax @inject are interchangeable - cdi bean
>> injection
>>>>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>>>>> 
>>>>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>>>>> <ig...@gmail.com>wrote:
>>>>> 
>>>>>> Just as a side note: starting with T5.3 it's possible to use JSR 330
>> for
>>>>>> injection.
>>>>>> 
>>>>>> Check this out:
>>>>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>>>>>> 
>>>>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
>>>>>> wrote:
>>>>>> 
>>>>>>> Hi all,
>>>>>>> 
>>>>>>> We're looking into moving our apps from a 'traditional' servlet
>>>>> container
>>>>>>> with spring into a Java EE web profile server like glassfish 3.1.
>>>>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
>>>>>> more.
>>>>>>> Not just for the tapestry app, but also the other applications in
>>>>>>> our portfoleo which share common core business logic.
>>>>>>> 
>>>>>>> For reference on previous discussions:
>>>>> 
>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>>>>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>>>>>>> 
>>>>>>> Now, I've tried running the tapestry quickstart app in glassfish 3.1
>>>>>> (with
>>>>>>> the eclipse connector for publishing).
>>>>>>> This works ok - although I cannot make live class reloading work. :(
>>>>>>> 
>>>>>>> Glassfish uses Weld, so the CDIModule is basically an objectprovider
>>>>> for
>>>>>>> injecting Weld managed beans.
>>>>>>> (As you probably know CDI/Weld can also be used outside jee as
>>>>>> alternative
>>>>>>> to tapestry-ioc, spring, etc)
>>>>>>> 
>>>>>>> *CDIModule class*
>>>>>>> *public class CDIModule { *
>>>>>>> * public static void bind(ServiceBinder binder) {*
>>>>>>> *    binder.bind(ObjectProvider.class,
>>>>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
>>>>>>> *    } *
>>>>>>> * public static BeanManager buildBeanManager(Logger log) { *
>>>>>>> * try {*
>>>>>>> * BeanManager beanManager = (BeanManager) new
>>>>>>> InitialContext().lookup("java:comp/BeanManager");*
>>>>>>> * return beanManager; *
>>>>>>> * } catch (NamingException e) {*
>>>>>>> * log.error("Could not lookup jndi resource: java:comp/BeanManager",
>>>>> e);*
>>>>>>> * }*
>>>>>>> * return null;*
>>>>>>> * } *
>>>>>>> * public static void contributeMasterObjectProvider(*
>>>>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>>>>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
>>>>>>> *// configuration.add("cdiProvider", cdiProvider,
>>>>> 
>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>>>>>>> *
>>>>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>>>>>>> * } *
>>>>>>> *}*
>>>>>>> *
>>>>>>> *
>>>>>>> The beanmanager is expected to be found in jndi. If the beans.xml is
>>>>>>> present
>>>>>>> it will be available at this point.
>>>>>>> The BeanManager is also exposed as a service and injectable for other
>>>>>>> services or components.
>>>>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
>>>>> quickstart
>>>>>>> appmodule.
>>>>>>> *
>>>>>>> *
>>>>>>> *CDIObjectProvider class*
>>>>>>> *public class CDIObjectProvider implements ObjectProvider { *
>>>>>>> * private BeanManager beanManager;*
>>>>>>> * private Logger log;*
>>>>>>> * *
>>>>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
>>>>>>> * private Set allowedScopes = CollectionFactory.newSet(*
>>>>>>> * ApplicationScoped.class,*
>>>>>>> * Singleton.class);*
>>>>>>> *
>>>>>>> *
>>>>>>> * public CDIObjectProvider(*
>>>>>>> * Logger log,*
>>>>>>> * @InjectService("BeanManager") BeanManager manager) {*
>>>>>>> * this.beanManager = manager;*
>>>>>>> * this.log = log;*
>>>>>>> * }*
>>>>>>> * @SuppressWarnings("unchecked")*
>>>>>>> * public <T> T provide(Class<T> objectType,*
>>>>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>>>>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>>>>>>> * if(beans!=null && beans.size()>0) {*
>>>>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>>>>>>> * if(hasValidScope(bean)) {*
>>>>>>> * CreationalContext<T> ctx =
>>>>> beanManager.createCreationalContext(bean);*
>>>>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>>>>>>> * log.info("Found and returning: "+objectType.getCanonicalName());*
>>>>>>> * return o; *
>>>>>>> * }*
>>>>>>> * }*
>>>>>>> * return null;*
>>>>>>> * } *
>>>>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
>>>>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
>>>>>>> * }*
>>>>>>> *}*
>>>>>>> 
>>>>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
>>>>>> Default
>>>>>>> could be accepted though.
>>>>>>> Until now I've only tested this with pojo's and not ejb's - but for
>>>>> that
>>>>>>> it's working as expected.
>>>>>>> I can inject CDI beans into pages and components using*
>>>>>>> org.apache.tapestry5.ioc.annotations.Inject*
>>>>>>> 
>>>>>>> I'm no expert to tapestry internals - so there could be
>>>>>>> other considerations that needs to be addressed.
>>>>>>> In fact in seemed just a little to easy to implement - so I must have
>>>>>>> missed
>>>>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
>>>>>>> 
>>>>>>> Thoughts, comments?
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> --
>>>>>> Best regards,
>>>>>> 
>>>>>> Igor Drobiazko
>>>>>> http://tapestry5.de
>>>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: First stab at CDI module for tapestry

Posted by Kalle Korhonen <ka...@gmail.com>.
Both of these seem to be about referencing and using CDI managed beans in
Tapestry services, please correct me if I'm wrong. What I'm asking is the
reverse - using Tapestry services in applications & frameworks expecting a
CDI environment.

Kalle


On Sat, Mar 9, 2013 at 3:41 PM, Lenny Primak <lp...@hope.nyc.ny.us> wrote:

> Actually, the CDI SPI statement may not be accurate.
> CDI support uses BeanManager to do its job, so its CDI SPI.  Not sure,
> Kalle, if that's what you are referring to.
>
>
> http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/CDIModule.java
>
> On Mar 9, 2013, at 5:56 PM, Lenny Primak wrote:
>
> > I would love to contribute the FlowLogix module, or as much of it as it
> still applies to tapestry 5.4 into the core. It includes CDI support plus
> the JEE stack support.
> > The CDI interface doesn't use SPI yet.
> >
> >
> >
> > On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <ka...@gmail.com>
> wrote:
> >
> >> Hey Magnus,
> >>
> >> as part of your tapestry-cdi work, did you look into implementing a
> >> Tapestry CDI SPI, i.e. an implementation of
> >> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
> >> thread about injectable entitylisteners (
> >>
> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E
> ).
> >> JPA 2.1 is required the check the SPI (see
> >> http://java.dzone.com/articles/cdi-extensions-you-can-build,
> >> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
> >>
> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener
> ,
> >>
> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets
> ).
> >> The CDI is a solid spec, we should start thinking about offering
> >> tapestry-cdi or similar as a core Tapestry module.
> >>
> >> Kalle
> >>
> >>
> >> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <magnus@kvalheim.dk
> >wrote:
> >>
> >>> Yes, I've noticed. Great work Igor :)
> >>>
> >>> I've intentionally not done anything for tapestry-cdi in terms of
> >>> supporting
> >>> javax.inject.@Inject.
> >>>
> >>> As Tap @inject and javax @inject are interchangeable - cdi bean
> injection
> >>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
> >>>
> >>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
> >>> <ig...@gmail.com>wrote:
> >>>
> >>>> Just as a side note: starting with T5.3 it's possible to use JSR 330
> for
> >>>> injection.
> >>>>
> >>>> Check this out:
> >>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
> >>>>
> >>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
> >>>> wrote:
> >>>>
> >>>>> Hi all,
> >>>>>
> >>>>> We're looking into moving our apps from a 'traditional' servlet
> >>> container
> >>>>> with spring into a Java EE web profile server like glassfish 3.1.
> >>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
> >>>> more.
> >>>>> Not just for the tapestry app, but also the other applications in
> >>>>> our portfoleo which share common core business logic.
> >>>>>
> >>>>> For reference on previous discussions:
> >>>
> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
> >>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
> >>>>>
> >>>>> Now, I've tried running the tapestry quickstart app in glassfish 3.1
> >>>> (with
> >>>>> the eclipse connector for publishing).
> >>>>> This works ok - although I cannot make live class reloading work. :(
> >>>>>
> >>>>> Glassfish uses Weld, so the CDIModule is basically an objectprovider
> >>> for
> >>>>> injecting Weld managed beans.
> >>>>> (As you probably know CDI/Weld can also be used outside jee as
> >>>> alternative
> >>>>> to tapestry-ioc, spring, etc)
> >>>>>
> >>>>> *CDIModule class*
> >>>>> *public class CDIModule { *
> >>>>> * public static void bind(ServiceBinder binder) {*
> >>>>> *    binder.bind(ObjectProvider.class,
> >>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
> >>>>> *    } *
> >>>>> * public static BeanManager buildBeanManager(Logger log) { *
> >>>>> * try {*
> >>>>> * BeanManager beanManager = (BeanManager) new
> >>>>> InitialContext().lookup("java:comp/BeanManager");*
> >>>>> * return beanManager; *
> >>>>> * } catch (NamingException e) {*
> >>>>> * log.error("Could not lookup jndi resource: java:comp/BeanManager",
> >>> e);*
> >>>>> * }*
> >>>>> * return null;*
> >>>>> * } *
> >>>>> * public static void contributeMasterObjectProvider(*
> >>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
> >>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
> >>>>> *// configuration.add("cdiProvider", cdiProvider,
> >>>
> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
> >>>>> *
> >>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
> >>>>> * } *
> >>>>> *}*
> >>>>> *
> >>>>> *
> >>>>> The beanmanager is expected to be found in jndi. If the beans.xml is
> >>>>> present
> >>>>> it will be available at this point.
> >>>>> The BeanManager is also exposed as a service and injectable for other
> >>>>> services or components.
> >>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
> >>> quickstart
> >>>>> appmodule.
> >>>>> *
> >>>>> *
> >>>>> *CDIObjectProvider class*
> >>>>> *public class CDIObjectProvider implements ObjectProvider { *
> >>>>> * private BeanManager beanManager;*
> >>>>> * private Logger log;*
> >>>>> * *
> >>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
> >>>>> * private Set allowedScopes = CollectionFactory.newSet(*
> >>>>> * ApplicationScoped.class,*
> >>>>> * Singleton.class);*
> >>>>> *
> >>>>> *
> >>>>> * public CDIObjectProvider(*
> >>>>> * Logger log,*
> >>>>> * @InjectService("BeanManager") BeanManager manager) {*
> >>>>> * this.beanManager = manager;*
> >>>>> * this.log = log;*
> >>>>> * }*
> >>>>> * @SuppressWarnings("unchecked")*
> >>>>> * public <T> T provide(Class<T> objectType,*
> >>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
> >>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
> >>>>> * if(beans!=null && beans.size()>0) {*
> >>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
> >>>>> * if(hasValidScope(bean)) {*
> >>>>> * CreationalContext<T> ctx =
> >>> beanManager.createCreationalContext(bean);*
> >>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
> >>>>> * log.info("Found and returning: "+objectType.getCanonicalName());*
> >>>>> * return o; *
> >>>>> * }*
> >>>>> * }*
> >>>>> * return null;*
> >>>>> * } *
> >>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
> >>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
> >>>>> * }*
> >>>>> *}*
> >>>>>
> >>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
> >>>> Default
> >>>>> could be accepted though.
> >>>>> Until now I've only tested this with pojo's and not ejb's - but for
> >>> that
> >>>>> it's working as expected.
> >>>>> I can inject CDI beans into pages and components using*
> >>>>> org.apache.tapestry5.ioc.annotations.Inject*
> >>>>>
> >>>>> I'm no expert to tapestry internals - so there could be
> >>>>> other considerations that needs to be addressed.
> >>>>> In fact in seemed just a little to easy to implement - so I must have
> >>>>> missed
> >>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
> >>>>>
> >>>>> Thoughts, comments?
> >>>>
> >>>>
> >>>>
> >>>> --
> >>>> Best regards,
> >>>>
> >>>> Igor Drobiazko
> >>>> http://tapestry5.de
> >>>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> > For additional commands, e-mail: users-help@tapestry.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

Re: First stab at CDI module for tapestry

Posted by Lenny Primak <lp...@hope.nyc.ny.us>.
Actually, the CDI SPI statement may not be accurate. 
CDI support uses BeanManager to do its job, so its CDI SPI.  Not sure, Kalle, if that's what you are referring to.

http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/CDIModule.java

On Mar 9, 2013, at 5:56 PM, Lenny Primak wrote:

> I would love to contribute the FlowLogix module, or as much of it as it still applies to tapestry 5.4 into the core. It includes CDI support plus the JEE stack support. 
> The CDI interface doesn't use SPI yet. 
> 
> 
> 
> On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <ka...@gmail.com> wrote:
> 
>> Hey Magnus,
>> 
>> as part of your tapestry-cdi work, did you look into implementing a
>> Tapestry CDI SPI, i.e. an implementation of
>> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
>> thread about injectable entitylisteners (
>> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E).
>> JPA 2.1 is required the check the SPI (see
>> http://java.dzone.com/articles/cdi-extensions-you-can-build,
>> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
>> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener,
>> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets).
>> The CDI is a solid spec, we should start thinking about offering
>> tapestry-cdi or similar as a core Tapestry module.
>> 
>> Kalle
>> 
>> 
>> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <ma...@kvalheim.dk>wrote:
>> 
>>> Yes, I've noticed. Great work Igor :)
>>> 
>>> I've intentionally not done anything for tapestry-cdi in terms of
>>> supporting
>>> javax.inject.@Inject.
>>> 
>>> As Tap @inject and javax @inject are interchangeable - cdi bean injection
>>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>>> 
>>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>>> <ig...@gmail.com>wrote:
>>> 
>>>> Just as a side note: starting with T5.3 it's possible to use JSR 330 for
>>>> injection.
>>>> 
>>>> Check this out:
>>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>>>> 
>>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
>>>> wrote:
>>>> 
>>>>> Hi all,
>>>>> 
>>>>> We're looking into moving our apps from a 'traditional' servlet
>>> container
>>>>> with spring into a Java EE web profile server like glassfish 3.1.
>>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
>>>> more.
>>>>> Not just for the tapestry app, but also the other applications in
>>>>> our portfoleo which share common core business logic.
>>>>> 
>>>>> For reference on previous discussions:
>>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>>>>> 
>>>>> Now, I've tried running the tapestry quickstart app in glassfish 3.1
>>>> (with
>>>>> the eclipse connector for publishing).
>>>>> This works ok - although I cannot make live class reloading work. :(
>>>>> 
>>>>> Glassfish uses Weld, so the CDIModule is basically an objectprovider
>>> for
>>>>> injecting Weld managed beans.
>>>>> (As you probably know CDI/Weld can also be used outside jee as
>>>> alternative
>>>>> to tapestry-ioc, spring, etc)
>>>>> 
>>>>> *CDIModule class*
>>>>> *public class CDIModule { *
>>>>> * public static void bind(ServiceBinder binder) {*
>>>>> *    binder.bind(ObjectProvider.class,
>>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
>>>>> *    } *
>>>>> * public static BeanManager buildBeanManager(Logger log) { *
>>>>> * try {*
>>>>> * BeanManager beanManager = (BeanManager) new
>>>>> InitialContext().lookup("java:comp/BeanManager");*
>>>>> * return beanManager; *
>>>>> * } catch (NamingException e) {*
>>>>> * log.error("Could not lookup jndi resource: java:comp/BeanManager",
>>> e);*
>>>>> * }*
>>>>> * return null;*
>>>>> * } *
>>>>> * public static void contributeMasterObjectProvider(*
>>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
>>>>> *// configuration.add("cdiProvider", cdiProvider,
>>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>>>>> *
>>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>>>>> * } *
>>>>> *}*
>>>>> *
>>>>> *
>>>>> The beanmanager is expected to be found in jndi. If the beans.xml is
>>>>> present
>>>>> it will be available at this point.
>>>>> The BeanManager is also exposed as a service and injectable for other
>>>>> services or components.
>>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
>>> quickstart
>>>>> appmodule.
>>>>> *
>>>>> *
>>>>> *CDIObjectProvider class*
>>>>> *public class CDIObjectProvider implements ObjectProvider { *
>>>>> * private BeanManager beanManager;*
>>>>> * private Logger log;*
>>>>> * *
>>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
>>>>> * private Set allowedScopes = CollectionFactory.newSet(*
>>>>> * ApplicationScoped.class,*
>>>>> * Singleton.class);*
>>>>> *
>>>>> *
>>>>> * public CDIObjectProvider(*
>>>>> * Logger log,*
>>>>> * @InjectService("BeanManager") BeanManager manager) {*
>>>>> * this.beanManager = manager;*
>>>>> * this.log = log;*
>>>>> * }*
>>>>> * @SuppressWarnings("unchecked")*
>>>>> * public <T> T provide(Class<T> objectType,*
>>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>>>>> * if(beans!=null && beans.size()>0) {*
>>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>>>>> * if(hasValidScope(bean)) {*
>>>>> * CreationalContext<T> ctx =
>>> beanManager.createCreationalContext(bean);*
>>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>>>>> * log.info("Found and returning: "+objectType.getCanonicalName());*
>>>>> * return o; *
>>>>> * }*
>>>>> * }*
>>>>> * return null;*
>>>>> * } *
>>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
>>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
>>>>> * }*
>>>>> *}*
>>>>> 
>>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
>>>> Default
>>>>> could be accepted though.
>>>>> Until now I've only tested this with pojo's and not ejb's - but for
>>> that
>>>>> it's working as expected.
>>>>> I can inject CDI beans into pages and components using*
>>>>> org.apache.tapestry5.ioc.annotations.Inject*
>>>>> 
>>>>> I'm no expert to tapestry internals - so there could be
>>>>> other considerations that needs to be addressed.
>>>>> In fact in seemed just a little to easy to implement - so I must have
>>>>> missed
>>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
>>>>> 
>>>>> Thoughts, comments?
>>>> 
>>>> 
>>>> 
>>>> --
>>>> Best regards,
>>>> 
>>>> Igor Drobiazko
>>>> http://tapestry5.de
>>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: First stab at CDI module for tapestry

Posted by Lenny Primak <lp...@hope.nyc.ny.us>.
I would love to contribute the FlowLogix module, or as much of it as it still applies to tapestry 5.4 into the core. It includes CDI support plus the JEE stack support. 
The CDI interface doesn't use SPI yet. 



On Mar 9, 2013, at 5:34 PM, Kalle Korhonen <ka...@gmail.com> wrote:

> Hey Magnus,
> 
> as part of your tapestry-cdi work, did you look into implementing a
> Tapestry CDI SPI, i.e. an implementation of
> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
> thread about injectable entitylisteners (
> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=EWnB+Tjv01fiyZsDEd3U5iyOp3wcf1r3PRhqtDjrM7ixTdA@mail.gmail.com%3E).
> JPA 2.1 is required the check the SPI (see
> http://java.dzone.com/articles/cdi-extensions-you-can-build,
> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener,
> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets).
> The CDI is a solid spec, we should start thinking about offering
> tapestry-cdi or similar as a core Tapestry module.
> 
> Kalle
> 
> 
> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <ma...@kvalheim.dk>wrote:
> 
>> Yes, I've noticed. Great work Igor :)
>> 
>> I've intentionally not done anything for tapestry-cdi in terms of
>> supporting
>> javax.inject.@Inject.
>> 
>> As Tap @inject and javax @inject are interchangeable - cdi bean injection
>> with either @inject should 'just work' with tapestry-cdi and T5.3 :)
>> 
>> On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko
>> <ig...@gmail.com>wrote:
>> 
>>> Just as a side note: starting with T5.3 it's possible to use JSR 330 for
>>> injection.
>>> 
>>> Check this out:
>>> http://tapestry.apache.org/using-jsr-330-standard-annotations.html
>>> 
>>> On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <ma...@kvalheim.dk>
>>> wrote:
>>> 
>>>> Hi all,
>>>> 
>>>> We're looking into moving our apps from a 'traditional' servlet
>> container
>>>> with spring into a Java EE web profile server like glassfish 3.1.
>>>> Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and
>>> more.
>>>> Not just for the tapestry app, but also the other applications in
>>>> our portfoleo which share common core business logic.
>>>> 
>>>> For reference on previous discussions:
>> http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html
>>>> http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html
>>>> 
>>>> Now, I've tried running the tapestry quickstart app in glassfish 3.1
>>> (with
>>>> the eclipse connector for publishing).
>>>> This works ok - although I cannot make live class reloading work. :(
>>>> 
>>>> Glassfish uses Weld, so the CDIModule is basically an objectprovider
>> for
>>>> injecting Weld managed beans.
>>>> (As you probably know CDI/Weld can also be used outside jee as
>>> alternative
>>>> to tapestry-ioc, spring, etc)
>>>> 
>>>> *CDIModule class*
>>>> *public class CDIModule { *
>>>> * public static void bind(ServiceBinder binder) {*
>>>> *    binder.bind(ObjectProvider.class,
>>>> CDIObjectProvider.class).withId("CDIObjectProvider");        *
>>>> *    } *
>>>> * public static BeanManager buildBeanManager(Logger log) { *
>>>> * try {*
>>>> * BeanManager beanManager = (BeanManager) new
>>>> InitialContext().lookup("java:comp/BeanManager");*
>>>> * return beanManager; *
>>>> * } catch (NamingException e) {*
>>>> * log.error("Could not lookup jndi resource: java:comp/BeanManager",
>> e);*
>>>> * }*
>>>> * return null;*
>>>> * } *
>>>> * public static void contributeMasterObjectProvider(*
>>>> * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,*
>>>> * OrderedConfiguration<ObjectProvider> configuration) { *
>>>> *// configuration.add("cdiProvider", cdiProvider,
>> "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild");
>>>> *
>>>> * configuration.add("cdiProvider", cdiProvider, "after:*"); *
>>>> * } *
>>>> *}*
>>>> *
>>>> *
>>>> The beanmanager is expected to be found in jndi. If the beans.xml is
>>>> present
>>>> it will be available at this point.
>>>> The BeanManager is also exposed as a service and injectable for other
>>>> services or components.
>>>> I've tested by adding the *@SubModule(CDIModule.class) *to my
>> quickstart
>>>> appmodule.
>>>> *
>>>> *
>>>> *CDIObjectProvider class*
>>>> *public class CDIObjectProvider implements ObjectProvider { *
>>>> * private BeanManager beanManager;*
>>>> * private Logger log;*
>>>> * *
>>>> * @SuppressWarnings({ "unchecked", "rawtypes" })*
>>>> * private Set allowedScopes = CollectionFactory.newSet(*
>>>> * ApplicationScoped.class,*
>>>> * Singleton.class);*
>>>> *
>>>> *
>>>> * public CDIObjectProvider(*
>>>> * Logger log,*
>>>> * @InjectService("BeanManager") BeanManager manager) {*
>>>> * this.beanManager = manager;*
>>>> * this.log = log;*
>>>> * }*
>>>> * @SuppressWarnings("unchecked")*
>>>> * public <T> T provide(Class<T> objectType,*
>>>> * AnnotationProvider annotationProvider, ObjectLocator locator) {*
>>>> * Set<Bean<?>> beans =  beanManager.getBeans(objectType);*
>>>> * if(beans!=null && beans.size()>0) {*
>>>> * Bean<T> bean = (Bean<T>) beans.iterator().next(); *
>>>> * if(hasValidScope(bean)) {*
>>>> * CreationalContext<T> ctx =
>> beanManager.createCreationalContext(bean);*
>>>> * T o = (T) beanManager.getReference(bean, objectType, ctx); *
>>>> * log.info("Found and returning: "+objectType.getCanonicalName());*
>>>> * return o; *
>>>> * }*
>>>> * }*
>>>> * return null;*
>>>> * } *
>>>> * protected <T> boolean hasValidScope(Bean<T> bean) {*
>>>> * return bean!=null && allowedScopes.contains(bean.getScope());*
>>>> * }*
>>>> *}*
>>>> 
>>>> I've limited the scope to singleton/applicationscoped. Perhaps also
>>> Default
>>>> could be accepted though.
>>>> Until now I've only tested this with pojo's and not ejb's - but for
>> that
>>>> it's working as expected.
>>>> I can inject CDI beans into pages and components using*
>>>> org.apache.tapestry5.ioc.annotations.Inject*
>>>> 
>>>> I'm no expert to tapestry internals - so there could be
>>>> other considerations that needs to be addressed.
>>>> In fact in seemed just a little to easy to implement - so I must have
>>>> missed
>>>> something. - Or perhaps it's just that easy to do in Tapestry :)
>>>> 
>>>> Thoughts, comments?
>>> 
>>> 
>>> 
>>> --
>>> Best regards,
>>> 
>>> Igor Drobiazko
>>> http://tapestry5.de
>> 

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org