users@javaee-spec.java.net

[javaee-spec users] Re: Fwd: [jsr366-experts] Re: One container to rule them all

From: Peter Pilgrim <peter.pilgrim_at_gmail.com>
Date: Sat, 24 Jan 2015 09:11:33 +0000

Hi Antonio

Would your idea be also useful with embedding Containers in an application?

Such you can specify the build of Container that you required and then
execute it from `static void main(String args[])' ?




On 12 January 2015 at 19:12, Antonio Goncalves <antonio.goncalves_at_gmail.com>
wrote:

> A "Container" API would be a very good first step (remember that we have
> an EJBContainer API that is not *that* useful and no WebContainer API)
>
> On Mon, Jan 12, 2015 at 8:08 PM, Romain Manni-Bucau <rmannibucau_at_gmail.com
> > wrote:
>
>> I got the idea but isnt it already the case since spec are integrated
>> between them? JBatch doesn't need a EE container it is just provided
>> by EE but well defined in SE. Introducing such a container you stay
>> full EE to keep this provided spirit so next question will be "I don't
>> want a dependency I dont need" so you are back in SE. Did I miss
>> something here?
>>
>> Not sure it does worth spending time on it *now* as you mentionned it.
>>
>>
>>
>>
>> Romain Manni-Bucau
>> @rmannibucau
>> http://www.tomitribe.com
>> http://rmannibucau.wordpress.com
>> https://github.com/rmannibucau
>>
>>
>> 2015-01-12 19:59 GMT+01:00 Antonio Goncalves <antonio.goncalves_at_gmail.com
>> >:
>> > Modularization is not the main topic to be honest, Java EE will be
>> modular
>> > once Java SE is. So I don't worry about this.
>> >
>> > I'm more concerned about this entire idea of having an EJB container
>> (while
>> > the EJB spec is losing momentum) and a Web Container (while JBatch is
>> part
>> > of EE and doesn't need any web).
>> >
>> > So, what about introducing a single container that does everything that
>> is
>> > needed ? And an API so EE could be configured and triggered from SE ?
>> >
>> > Any thoughts ?
>> >
>> > Antonio
>> >
>> > On Wed, Jan 7, 2015 at 8:28 AM, Romain Manni-Bucau <
>> rmannibucau_at_gmail.com>
>> > wrote:
>> >>
>> >> Seems this message was bounced to Linda, sorry Linda and fwding it to
>> >> the right list.
>> >>
>> >>
>> >>
>> >> ---------- Forwarded message ----------
>> >> From: Romain Manni-Bucau <rmannibucau_at_gmail.com>
>> >> Date: 2015-01-06 17:39 GMT+01:00
>> >> Subject: Re: [javaee-spec users] [jsr366-experts] Re: One container to
>> >> rule them all
>> >> To: jsr366-experts_at_javaee-spec.java.net
>> >>
>> >>
>> >> this is funny to put a SE need in EE - in EE all is already assembled
>> >> so why activating or not features through another API? This actually
>> >> looks like the opposite of EE.
>> >>
>> >> This kind of API "super extensible" is just either too generic to be
>> >> useful in practise or just not generic enough to be extended
>> >> (Container.createWebManager()) so I'm not sure to get the gain.
>> >>
>> >> What would maybe be useful and join the underlying need is to be able
>> >> to assemble an app completely programmatically - what all specs try to
>> >> do - and then skip scanning, descriptor discovery etc.
>> >>
>> >>
>> >>
>> >> Romain Manni-Bucau
>> >> @rmannibucau
>> >> http://www.tomitribe.com
>> >> http://rmannibucau.wordpress.com
>> >> https://github.com/rmannibucau
>> >>
>> >>
>> >> 2015-01-06 17:30 GMT+01:00 Antonio Goncalves
>> >> <antonio.goncalves_at_gmail.com>:
>> >> > I think the Java EE spec is the perfect place to have such feature !
>> >> >
>> >> > Antonio
>> >> >
>> >> > On Tue, Jan 6, 2015 at 5:25 PM, Antoine Sabot-Durand
>> >> > <antoine_at_sabot-durand.net> wrote:
>> >> >>
>> >> >> Form what I understand, you're proposing to add a new specification
>> to
>> >> >> provide a facade and a common SPI for all the container. Is that it?
>> >> >>
>> >> >> Antoine
>> >> >>
>> >> >>
>> >> >> Le 22 déc. 2014 à 21:28, Antonio Goncalves
>> >> >> <antonio.goncalves_at_gmail.com> a
>> >> >> écrit :
>> >> >>
>> >> >> Hi all,
>> >> >>
>> >> >> We've talked about this topic in EE 7... and I'm bringing it back
>> to EE
>> >> >> 8.
>> >> >>
>> >> >> At the moment, the Java EE spec defines several containers (EE.2.4 -
>> >> >> Containers) : Web Container, EJB Container, Application Client
>> >> >> Container and
>> >> >> Applet Container. Each having its own set of services (EE.2.7 -
>> Java EE
>> >> >> Standard Services) such as JTA, Validation, CDI... The spec also
>> >> >> defines
>> >> >> SPIs (EE.2.12.2 - Java EE Service Provider Interfaces) as "the
>> contract
>> >> >> between the Java EE platform and service providers that may be
>> plugged
>> >> >> into
>> >> >> a Java EE product". But these SPIs are not really mandatory (only a
>> few
>> >> >> specs have SPIs).
>> >> >>
>> >> >> Why not go further and say "There is a single Java EE container, and
>> >> >> each
>> >> >> service can then be plugged in through a SPI" ?
>> >> >>
>> >> >> Let me take an example. If we want to persist a Book Entity in Java
>> SE
>> >> >> we
>> >> >> go :
>> >> >>
>> >> >> EntityManagerFactory emf =
>> >> >> Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
>> >> >> EntityManager em = emf.createEntityManager();
>> >> >> EntityTransaction tx em.getTransaction();
>> >> >>
>> >> >> tx.begin();
>> >> >> Book book = service.createBook(new Book("H2G2"));
>> >> >> tx.commit();
>> >> >>
>> >> >> em.close();
>> >> >> emf.close();
>> >> >>
>> >> >>
>> >> >> That's fine because the JPA service does persistence. But if the
>> Book
>> >> >> Entity has a Listener with a CDI @Inject, this doesn't work anymore
>> :
>> >> >> you
>> >> >> need an extra injection services that comes from another spec (CDI
>> in
>> >> >> this
>> >> >> case). The idea behind the EJBContainer API was to aggregate several
>> >> >> services (i.e. the services given to an EJB component). So, to have
>> JPA
>> >> >> and
>> >> >> CDI working in Java SE we would go :
>> >> >>
>> >> >> Map<String, Object> properties = new HashMap<>();
>> >> >> properties.put(EJBContainer.MODULES, new File("target/classes"));
>> >> >> EJBContainer ec = EJBContainer.createEJBContainer(properties);
>> >> >> Context ctx = ec.getContext();
>> >> >>
>> >> >> BookEJB bookEJB = (BookEJB)
>> ctx.lookup("java:global/classes/BookEJB");
>> >> >>
>> >> >> ec.close();
>> >> >>
>> >> >>
>> >> >> But if the EJB spec is not updated, then the EJBContainer will not
>> >> >> include
>> >> >> the new services (such has the new Security spec, and so on).
>> >> >>
>> >> >> So what if the Java EE spec would define a single container API ?
>> >> >> Something like this would trigger a full Java EE container with
>> *all*
>> >> >> the
>> >> >> services :
>> >> >>
>> >> >> Container eec = Container.createContainer();
>> >> >>
>> >> >> EntityManagerFactory emf =
>> >> >> eec.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
>> >> >> EntityManager em = emf.createEntityManager();
>> >> >> EntityTransaction tx em.getTransaction();
>> >> >>
>> >> >> tx.begin();
>> >> >> Book book = service.createBook(new Book("H2G2"));
>> >> >> tx.commit();
>> >> >>
>> >> >> em.close();
>> >> >> emf.close();
>> >> >>
>> >> >> eec.close();
>> >> >>
>> >> >>
>> >> >> Or if we just need the JPA + BeanValidation + CDI providers, we
>> would
>> >> >> go :
>> >> >>
>> >> >> List<Container.PROVIDER> properties = new ArrayList<>();
>> >> >> properties.put(PROVIDER.JPA);
>> >> >> properties.put(PROVIDER.BEAN_VALIDATION);
>> >> >> properties.put(PROVIDER.CDI);
>> >> >> Container eec = Container.createContainer(properties);
>> >> >> //...
>> >> >> eec.close();
>> >> >>
>> >> >>
>> >> >> To have a Web Profile we could go :
>> >> >>
>> >> >> List<Container.PROVIDER> properties = new ArrayList<>();
>> >> >> properties.put(PROVIDER.WEB_PROFILE);
>> >> >> Container ec = Container.createContainer(properties);
>> >> >> //...
>> >> >> ec.close();
>> >> >>
>> >> >>
>> >> >> And the Container API would become a facade to create any Java EE
>> >> >> provider
>> >> >> :
>> >> >>
>> >> >> EntityManagerFactory emf =
>> >> >> Container.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
>> >> >> CacheManager cache = Container.createCacheManager();
>> >> >> WebManager web = Container.createWebManager();
>> >> >> BeanManager bm = Container.createBeanManager();
>> >> >>
>> >> >>
>> >> >> This would bring real modularity (even before Java EE 9) and,
>> finally,
>> >> >> would ease Java SE execution and testing.
>> >> >>
>> >> >> Any thoughts ?
>> >> >>
>> >> >> --
>> >> >> Antonio Goncalves
>> >> >> Software architect, Java Champion and Pluralsight author
>> >> >>
>> >> >> Web site | Twitter | LinkedIn | Pluralsight | Paris JUG | Devoxx
>> France
>> >> >>
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Antonio Goncalves
>> >> > Software architect, Java Champion and Pluralsight author
>> >> >
>> >> > Web site | Twitter | LinkedIn | Pluralsight | Paris JUG | Devoxx
>> France
>> >
>> >
>> >
>> >
>> > --
>> > Antonio Goncalves
>> > Software architect, Java Champion and Pluralsight author
>> >
>> > Web site | Twitter | LinkedIn | Pluralsight | Paris JUG | Devoxx France
>>
>
>
>
> --
> Antonio Goncalves
> Software architect, Java Champion and Pluralsight author
>
> Web site <http://www.antoniogoncalves.org> | Twitter
> <http://twitter.com/agoncal> | LinkedIn
> <http://www.linkedin.com/in/agoncal> | Pluralsight
> <http://pluralsight.com/training/Authors/Details/antonio-goncalves> | Paris
> JUG <http://www.parisjug.org> | Devoxx France <http://www.devoxx.fr>
>



-- 
Best wishes
Peter Pilgrim,
**Java Champion**,
Scala and Java EE Software Development / Design / Architect for `BlueChip'
enterprises, London, UK
I am the author of ``The Java EE 7 Developer Handbook''  Packt Pub
(September 2013)
http://www.packtpub.com/java-ee-7-developer-handbook/book
I am currently writing ``Digital Java EE 7 Development'' Packt Pub (March
2025)
++ Digital ++ Finance ++ Adaptation  ++ Transformation ++ Software ++
:: http://www.xenonique.co.uk/blog/  ::
:: http://twitter.com/peter_pilgrim ::
:: http://java-champions.java.net/ ::
:: Skype Call peter_pilgrim ::
:: http://audio.fm/profile/peter_pilgrim  ::