@mark: +1 regards, gerhard
2013/10/11 Mark Struberg <strub...@yahoo.de> > > >If you don't destroy it you'll likely leak. > Yes, fully agree. But the way we do it is still wrong. IF it is a > @Dependent scoped instance, then we must store the > DependentProvider<EntityManager> somewhere and only invoke it's destroy() > method once we really need. > > For NormalScoped beans you are relieved of this burden, but for @Dependent > ones you need to handle it manually. The DependentProvider just helps to > easily store the CreationalContext, the Bean<T> and the instance for > convenience reasons. > > > LieGrue, > strub > > > >________________________________ > > From: Romain Manni-Bucau <rmannibu...@gmail.com> > >To: "dev@deltaspike.apache.org" <dev@deltaspike.apache.org>; Mark > Struberg <strub...@yahoo.de> > >Sent: Thursday, 10 October 2013, 9:07 > >Subject: Re: git commit: DELTASPIKE-424 taking into account > EntityManagerResolver with a normal scope > > > > > >If you don't destroy it you'll likely leak. > > > >And once again you are in your case where you handle the emf yourself. In > >other cases @Dependent should work fine. > > > >That said nothing again preventing using @Dependent so just do it If it > >solves the issue. Normal scopes were the important part for me. > > > >*Romain Manni-Bucau* > >*Twitter: @rmannibucau <https://twitter.com/rmannibucau>* > >*Blog: **http://rmannibucau.wordpress.com/*< > http://rmannibucau.wordpress.com/> > >*LinkedIn: **http://fr.linkedin.com/in/rmannibucau* > >*Github: https://github.com/rmannibucau* > > > > > > > > > >2013/10/10 Mark Struberg <strub...@yahoo.de> > > > >> > >> >Both works > >> > >> That's exactly where I disagree. While both 'work' in the sample, > >> immediately destroying the instances again after creating them - and > only > >> later returning the java reference to the now 'dead' > EntityManagerResolver > >> - is broken if you will use it in productive scenarios. > >> > >> > >> Either we fix this, or we don't need any special handling. In this case > I > >> suggest to just use DependentProvider.get() for all cases. It has no > harm > >> on NormalScoped instances anyway. > >> > >> I will guard DependentProvider#destroy to not have any impact on > >> @Dependent scoped instances. > >> > >> > >> LieGrue, > >> strub > >> > >> > >> >________________________________ > >> > From: Romain Manni-Bucau <rmannibu...@gmail.com> > >> >To: "dev@deltaspike.apache.org" <dev@deltaspike.apache.org>; Mark > >> Struberg <strub...@yahoo.de> > >> >Sent: Thursday, 10 October 2013, 8:33 > >> >Subject: Re: git commit: DELTASPIKE-424 taking into account > >> EntityManagerResolver with a normal scope > >> > > >> > > >> > > >> >Both works Mark depending as you said from where you take your em. We > >> just need to be explicit on this behavior. BTW I prefer the normal scope > >> usage too. > >> > > >> > > >> >Romain Manni-Bucau > >> >Twitter: @rmannibucau > >> >Blog: http://rmannibucau.wordpress.com/ > >> >LinkedIn: http://fr.linkedin.com/in/rmannibucau > >> >Github: https://github.com/rmannibucau > >> > > >> > > >> > > >> > > >> >2013/10/10 Mark Struberg <strub...@yahoo.de> > >> > > >> >Not sure if we really need this flag. > >> >>The most important question to me is _when_ do we trigger the > destroy() > >> method. > >> >> > >> >>The following code doesn't make much sense imo: > >> >> > >> >>> final DependentProvider<? extends EntityManagerResolver> resolver = > >> lookupResolver(emrc); > >> >>> result = resolver.get().resolveEntityManager(); > >> >>> resolver.destroy(); > >> >> > >> >> > >> >>The DependentProvider is intended to store it's instances somewhere to > >> be able to properly destroy the created @Dependent instance once you > don't > >> need it anymore. Invoking destroy() immediately but returning the > created > >> contextual instance makes no sense imo. Imagine what happens if you > would > >> close the EntityManagerFactory in a @PreDestroy method. > >> >> > >> >>If there is no clean way to clean up the instance again, then we > should > >> only rely on NormalScoped instances and remove the handling (and get the > >> warnings again, because they make sense). > >> >> > >> >>LieGrue, > >> >>strub > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > >> >>----- Original Message ----- > >> >>> From: "rmannibu...@apache.org" <rmannibu...@apache.org> > >> >>> To: comm...@deltaspike.apache.org > >> >>> Cc: > >> >>> Sent: Wednesday, 9 October 2013, 16:46 > >> >>> Subject: git commit: DELTASPIKE-424 taking into account > >> EntityManagerResolver with a normal scope > >> >>> > >> >>> Updated Branches: > >> >>> refs/heads/master bdc9cdce6 -> e8148110e > >> >>> > >> >>> > >> >>> DELTASPIKE-424 taking into account EntityManagerResolver with a > normal > >> scope > >> >>> > >> >>> > >> >>> Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo > >> >>> Commit: > >> http://git-wip-us.apache.org/repos/asf/deltaspike/commit/e8148110 > >> >>> Tree: > http://git-wip-us.apache.org/repos/asf/deltaspike/tree/e8148110 > >> >>> Diff: > http://git-wip-us.apache.org/repos/asf/deltaspike/diff/e8148110 > >> >>> > >> >>> Branch: refs/heads/master > >> >>> Commit: e8148110ea2458fa2244a439583da0f2adddb482 > >> >>> Parents: bdc9cdc > >> >>> Author: Romain Manni-Bucau <rmannibu...@apache.org> > >> >>> Authored: Wed Oct 9 16:46:06 2013 +0200 > >> >>> Committer: Romain Manni-Bucau <rmannibu...@apache.org> > >> >>> Committed: Wed Oct 9 16:46:06 2013 +0200 > >> >>> > >> >>> > ---------------------------------------------------------------------- > >> >>> .../data/impl/RepositoryExtension.java | 2 +- > >> >>> .../data/impl/handler/EntityManagerLookup.java | 20 > +++++++++++------ > >> >>> .../data/impl/meta/RepositoryComponent.java | 23 > >> +++++++++++++++++++- > >> >>> .../data/impl/meta/RepositoryComponents.java | 16 ++++++++------ > >> >>> .../data/impl/builder/part/QueryRootTest.java | 5 ++--- > >> >>> 5 files changed, 47 insertions(+), 19 deletions(-) > >> >>> > ---------------------------------------------------------------------- > >> >>> > >> >>> > >> >>> > >> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >> >>> > ---------------------------------------------------------------------- > >> >>> diff --git > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >> >>> index 076393b..8ba0dca 100755 > >> >>> --- > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >> >>> +++ > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >> >>> @@ -72,7 +72,7 @@ public class RepositoryExtension implements > Extension > >> >>> { > >> >>> log.log(Level.FINER, "getHandlerClass: Repository > >> >>> annotation detected on {0}", > >> >>> event.getAnnotatedType()); > >> >>> - > RepositoryComponentsFactory.instance().add(repoClass); > >> >>> + > RepositoryComponentsFactory.instance().add(repoClass, > >> >>> beanManager); > >> >>> } > >> >>> catch (RepositoryDefinitionException e) > >> >>> { > >> >>> > >> >>> > >> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >> >>> > ---------------------------------------------------------------------- > >> >>> diff --git > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >> >>> index 5548f16..4554497 100644 > >> >>> --- > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >> >>> +++ > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >> >>> @@ -36,15 +36,22 @@ public class EntityManagerLookup > >> >>> @Any > >> >>> private Instance<EntityManager> entityManager; > >> >>> > >> >>> - public EntityManager lookupFor(RepositoryComponent repository) > >> >>> + public EntityManager lookupFor(final RepositoryComponent > >> repository) > >> >>> { > >> >>> EntityManager result = null; > >> >>> if (repository.hasEntityManagerResolver()) > >> >>> { > >> >>> - DependentProvider<? extends EntityManagerResolver> > >> resolver = > >> >>> - > >> lookupResolver(repository.getEntityManagerResolverClass()); > >> >>> - result = resolver.get().resolveEntityManager(); > >> >>> - resolver.destroy(); > >> >>> + final Class<? extends EntityManagerResolver> emrc = > >> >>> repository.getEntityManagerResolverClass(); > >> >>> + if (!repository.isEntityManagerResolverIsNormalScope()) > >> >>> + { > >> >>> + final DependentProvider<? extends > >> EntityManagerResolver> > >> >>> resolver = lookupResolver(emrc); > >> >>> + result = resolver.get().resolveEntityManager(); > >> >>> + resolver.destroy(); > >> >>> + } > >> >>> + else > >> >>> + { > >> >>> + result = > >> >>> BeanProvider.getContextualReference(emrc).resolveEntityManager(); > >> >>> + } > >> >>> } > >> >>> else > >> >>> { > >> >>> @@ -60,7 +67,6 @@ public class EntityManagerLookup > >> >>> private DependentProvider<? extends EntityManagerResolver> > >> >>> lookupResolver( > >> >>> Class<? extends EntityManagerResolver> resolverClass) > >> >>> { > >> >>> - DependentProvider<? extends EntityManagerResolver> > resolver = > >> >>> BeanProvider.getDependent(resolverClass); > >> >>> - return resolver; > >> >>> + return BeanProvider.getDependent(resolverClass); > >> >>> } > >> >>> } > >> >>> > >> >>> > >> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >> >>> > ---------------------------------------------------------------------- > >> >>> diff --git > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >> >>> index c2dc466..5acee4e 100644 > >> >>> --- > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >> >>> +++ > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >> >>> @@ -19,6 +19,7 @@ > >> >>> package org.apache.deltaspike.data.impl.meta; > >> >>> > >> >>> import java.io.Serializable; > >> >>> +import java.lang.annotation.Annotation; > >> >>> import java.lang.reflect.Method; > >> >>> import java.util.Arrays; > >> >>> import java.util.Collection; > >> >>> @@ -29,6 +30,8 @@ import java.util.Set; > >> >>> import java.util.logging.Level; > >> >>> import java.util.logging.Logger; > >> >>> > >> >>> +import javax.enterprise.inject.spi.Bean; > >> >>> +import javax.enterprise.inject.spi.BeanManager; > >> >>> import javax.persistence.FlushModeType; > >> >>> > >> >>> import org.apache.deltaspike.data.api.EntityManagerConfig; > >> >>> @@ -53,11 +56,12 @@ public class RepositoryComponent > >> >>> private final Class<?> repoClass; > >> >>> private final RepositoryEntity entityClass; > >> >>> private final Class<? extends EntityManagerResolver> > >> >>> entityManagerResolver; > >> >>> + private final boolean entityManagerResolverIsNormalScope; > >> >>> private final FlushModeType entityManagerFlushMode; > >> >>> > >> >>> private final Map<Method, RepositoryMethod> methods = new > >> >>> HashMap<Method, RepositoryMethod>(); > >> >>> > >> >>> - public RepositoryComponent(Class<?> repoClass, RepositoryEntity > >> >>> entityClass) > >> >>> + public RepositoryComponent(Class<?> repoClass, RepositoryEntity > >> >>> entityClass, BeanManager beanManager) > >> >>> { > >> >>> if (entityClass == null) > >> >>> { > >> >>> @@ -67,9 +71,26 @@ public class RepositoryComponent > >> >>> this.entityClass = entityClass; > >> >>> this.entityManagerResolver = > >> extractEntityManagerResolver(repoClass); > >> >>> this.entityManagerFlushMode = > >> extractEntityManagerFlushMode(repoClass); > >> >>> + > >> >>> + if (entityManagerResolver != null && beanManager != null) > >> >>> + { > >> >>> + final Set<Bean<?>> beans = > >> >>> beanManager.getBeans(entityManagerResolver); > >> >>> + final Class<? extends Annotation> scope = > >> >>> beanManager.resolve(beans).getScope(); > >> >>> + entityManagerResolverIsNormalScope = > >> >>> beanManager.isNormalScope(scope); > >> >>> + } > >> >>> + else > >> >>> + { > >> >>> + entityManagerResolverIsNormalScope = false; > >> >>> + } > >> >>> + > >> >>> initialize(); > >> >>> } > >> >>> > >> >>> + public boolean isEntityManagerResolverIsNormalScope() > >> >>> + { > >> >>> + return entityManagerResolverIsNormalScope; > >> >>> + } > >> >>> + > >> >>> public String getEntityName() > >> >>> { > >> >>> return > EntityUtils.entityName(entityClass.getEntityClass()); > >> >>> > >> >>> > >> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >> >>> > ---------------------------------------------------------------------- > >> >>> diff --git > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >> >>> index e6ded42..1bc12db 100644 > >> >>> --- > >> >>> > >> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >> >>> +++ > >> >>> > >> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >> >>> @@ -18,6 +18,12 @@ > >> >>> */ > >> >>> package org.apache.deltaspike.data.impl.meta; > >> >>> > >> >>> +import > org.apache.deltaspike.data.impl.RepositoryDefinitionException; > >> >>> +import > >> >>> > >> > org.apache.deltaspike.data.impl.meta.extractor.AnnotationMetadataExtractor; > >> >>> +import > >> org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor; > >> >>> +import > >> org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor; > >> >>> + > >> >>> +import javax.enterprise.inject.spi.BeanManager; > >> >>> import java.io.Serializable; > >> >>> import java.lang.reflect.Method; > >> >>> import java.util.Arrays; > >> >>> @@ -25,11 +31,6 @@ import java.util.HashMap; > >> >>> import java.util.List; > >> >>> import java.util.Map; > >> >>> > >> >>> -import > org.apache.deltaspike.data.impl.RepositoryDefinitionException; > >> >>> -import > >> >>> > >> > org.apache.deltaspike.data.impl.meta.extractor.AnnotationMetadataExtractor; > >> >>> -import > >> org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor; > >> >>> -import > >> org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor; > >> >>> - > >> >>> /** > >> >>> * Convenience class to access Repository and Repository method > meta > >> data. > >> >>> * Acts as repository for Repository related meta data. > >> >>> @@ -47,13 +48,14 @@ public class RepositoryComponents implements > >> Serializable > >> >>> /** > >> >>> * Add a Repository class to the meta data repository. > >> >>> * > >> >>> + * > >> >>> * @param repoClass The repo class. > >> >>> * @return {@code true} if Repository class has been added, > >> >>> {@code false} otherwise. > >> >>> */ > >> >>> - public void add(Class<?> repoClass) > >> >>> + public void add(Class<?> repoClass, BeanManager bm) > >> >>> { > >> >>> RepositoryEntity entityClass = > >> extractEntityMetaData(repoClass); > >> >>> - RepositoryComponent repo = new > RepositoryComponent(repoClass, > >> >>> entityClass); > >> >>> + RepositoryComponent repo = new > RepositoryComponent(repoClass, > >> >>> entityClass, bm); > >> >>> repos.put(repoClass, repo); > >> >>> } > >> >>> > >> >>> > >> >>> > >> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >> >>> > ---------------------------------------------------------------------- > >> >>> diff --git > >> >>> > >> > a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >> >>> > >> > b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >> >>> index f904bb2..1c70466 100644 > >> >>> --- > >> >>> > >> > a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >> >>> +++ > >> >>> > >> > b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >> >>> @@ -30,9 +30,8 @@ import org.junit.Test; > >> >>> > >> >>> public class QueryRootTest > >> >>> { > >> >>> - > >> >>> - private final RepositoryComponent repo = new > >> >>> RepositoryComponent(SimpleRepository.class, new > >> RepositoryEntity(Simple.class, > >> >>> Long.class)); > >> >>> - private final RepositoryComponent repoFetchBy = new > >> >>> RepositoryComponent(SimpleFetchRepository.class, new > >> >>> RepositoryEntity(Simple.class, Long.class)); > >> >>> + private final RepositoryComponent repo = new > >> >>> RepositoryComponent(SimpleRepository.class, new > >> RepositoryEntity(Simple.class, > >> >>> Long.class), null); > >> >>> + private final RepositoryComponent repoFetchBy = new > >> >>> RepositoryComponent(SimpleFetchRepository.class, new > >> >>> RepositoryEntity(Simple.class, Long.class), null); > >> >>> > >> >>> @Test > >> >>> public void should_create_simple_query() > >> >>> > >> >> > >> > > >> > > >> > > >> > > > > > > >