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 <lpri...@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 <lpri...@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.korho...@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+tjv01fiyzsded3u5iyop3wcf1r3prhqtdjrm7ix...@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 <mag...@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
> >>>>> <igor.drobia...@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 <mag...@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-unsubscr...@tapestry.apache.org
> >>> For additional commands, e-mail: users-h...@tapestry.apache.org
> >>>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> >> For additional commands, e-mail: users-h...@tapestry.apache.org
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

Reply via email to