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()
> >>>
> >>
> >
> >
> >
>

Reply via email to