Hi everyone, This commit intends to ensure we support cases where an annotated type is deployed through scanning but also when calling event.addAnnotatedType() either with a null identifier or with no identifier. I ensured it does not bring any regression on deltaspike - to have a "complex" project - but I wonder if the impl is right. Concretely the logic in deployFromBeanAttributes is to check if for a scanned type we have an additional one matching the type, annotations and having the id ending with our default suffix. Strictly speaking it should likely be only about qualifiers (but this simple impl is enough and faster so thought it was better to start like that) but I also wonder if the suffix check is that great since id can be prefixed with extension fqn.
Wdyt? Original issue and some more question in comments available at https://issues.apache.org/jira/browse/OWB-1298 Romain ---------- Forwarded message --------- De : <rmannibu...@apache.org> Date: mar. 17 sept. 2019 à 12:10 Subject: [openwebbeans] branch master updated: OWB-1298 ensure we don't duplicate annotated types when possible To: comm...@openwebbeans.apache.org <comm...@openwebbeans.apache.org> This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwebbeans.git The following commit(s) were added to refs/heads/master by this push: new eb94a3a OWB-1298 ensure we don't duplicate annotated types when possible eb94a3a is described below commit eb94a3a27698471b7ebeced33d710b7f7558d131 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Tue Sep 17 12:10:06 2019 +0200 OWB-1298 ensure we don't duplicate annotated types when possible --- .../org/apache/webbeans/config/BeansDeployer.java | 26 +++++++++++++++++----- .../apache/webbeans/container/BeanManagerImpl.java | 21 ++++++++++++----- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java b/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java index 5a76fd8..99689fa 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java @@ -39,6 +39,7 @@ import org.apache.webbeans.component.creation.ObserverMethodsBuilder; import org.apache.webbeans.component.creation.ProducerFieldBeansBuilder; import org.apache.webbeans.component.creation.ProducerMethodBeansBuilder; import org.apache.webbeans.configurator.AnnotatedTypeConfiguratorImpl; +import org.apache.webbeans.container.AnnotatedTypeWrapper; import org.apache.webbeans.container.BeanManagerImpl; import org.apache.webbeans.container.InjectableBeanManager; import org.apache.webbeans.container.InjectionResolver; @@ -259,7 +260,9 @@ public class BeansDeployer List<AnnotatedType<?>> globalBdaAnnotatedTypes = annotatedTypesPerBda.get(defaultBeanArchiveInformation); // Deploy additional Annotated Types which got added via BeforeBeanDiscovery#addAnnotatedType - addAdditionalAnnotatedTypes(webBeansContext.getBeanManagerImpl().getAdditionalAnnotatedTypes(), globalBdaAnnotatedTypes); + final Collection<AnnotatedType<?>> additionalAnnotatedTypes = + webBeansContext.getBeanManagerImpl().getAdditionalAnnotatedTypes(); + addAdditionalAnnotatedTypes(additionalAnnotatedTypes, globalBdaAnnotatedTypes); for (List<AnnotatedType<?>> at : annotatedTypesPerBda.values()) { @@ -1493,7 +1496,7 @@ public class BeansDeployer * @param beanAttributesPerBda the AnnotatedTypes which got discovered so far and are not vetoed * @throws ClassNotFoundException if class not found */ - protected void deployFromBeanAttributes( Map<BeanArchiveInformation, Map<AnnotatedType<?>, ExtendedBeanAttributes<?>>> beanAttributesPerBda) + protected void deployFromBeanAttributes( Map<BeanArchiveInformation, Map<AnnotatedType<?>, ExtendedBeanAttributes<?>>> beanAttributesPerBda ) { logger.fine("Deploying configurations from class files has started."); @@ -1504,19 +1507,31 @@ public class BeansDeployer // Start from the class for (Map.Entry<AnnotatedType<?>, ExtendedBeanAttributes<?>> annotatedType : beanAttributesMap.entrySet()) { + final AnnotatedType<?> key = annotatedType.getKey(); + final Collection<? extends AnnotatedType<?>> userAnnotatedTypes = + bm.getUserAnnotatedTypes(key.getJavaClass()); + // if we have a matching AT (same type+annotations+default id) we skip it since we already deployed it + if (userAnnotatedTypes != null && userAnnotatedTypes.stream().anyMatch(it -> + it != key && + AnnotatedTypeWrapper.class.isInstance(it) && + AnnotatedTypeWrapper.class.cast(it).getId().endsWith(AnnotatedElementFactory.OWB_DEFAULT_KEY) && + it.getAnnotations().equals(key.getAnnotations()))) // strictly it is qualifiers only but faster + { + continue; + } try { - deploySingleAnnotatedType(annotatedType.getKey(), annotatedType.getValue(), beanAttributesMap); + deploySingleAnnotatedType(key, annotatedType.getValue(), beanAttributesMap); } catch (NoClassDefFoundError ncdfe) { - logger.info("Skipping deployment of Class " + annotatedType.getKey().getJavaClass() + "due to a NoClassDefFoundError: " + ncdfe.getMessage()); + logger.info("Skipping deployment of Class " + key.getJavaClass() + "due to a NoClassDefFoundError: " + ncdfe.getMessage()); } // if the implClass already gets processed as part of the // standard BDA scanning, then we don't need to 'additionally' // deploy it anymore. - bm.removeAdditionalAnnotatedType(annotatedType.getKey()); + bm.removeAdditionalAnnotatedType(key); } } @@ -1630,7 +1645,6 @@ public class BeansDeployer private void configureAlternatives(URL bdaLocation, List<String> alternatives, boolean isStereotype) { AlternativesManager manager = webBeansContext.getAlternativesManager(); - AnnotatedElementFactory annotatedElementFactory = webBeansContext.getAnnotatedElementFactory(); // the alternatives in this beans.xml // this gets used to detect multiple definitions of the diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java b/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java index f1d99c7..86953eb 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java @@ -1387,7 +1387,6 @@ public class BeanManagerImpl implements BeanManager, Referenceable } } - public List<ExternalScope> getAdditionalScopes() { return additionalScopes; @@ -1434,17 +1433,29 @@ public class BeanManagerImpl implements BeanManager, Referenceable return null; } - public <T> Iterable<AnnotatedType<T>> getAnnotatedTypes(Class<T> type) + public <T> Collection<AnnotatedType<T>> getUserAnnotatedTypes(Class<T> type) { - Collection<AnnotatedType<T>> types = new ArrayList<>(2); - types.add(annotatedElementFactory.getAnnotatedType(type)); - ConcurrentMap<String, AnnotatedType<?>> aTypes = additionalAnnotatedTypes.get(type); + final ConcurrentMap<String, AnnotatedType<?>> aTypes = additionalAnnotatedTypes.get(type); if (aTypes != null) { + Collection<AnnotatedType<T>> types = new ArrayList<>(2); for (AnnotatedType at : aTypes.values()) { types.add(at); } + return types; + } + return null; + } + + public <T> Iterable<AnnotatedType<T>> getAnnotatedTypes(Class<T> type) + { + final Collection<AnnotatedType<T>> types = new ArrayList<>(2); + types.add(annotatedElementFactory.getAnnotatedType(type)); + final Collection<AnnotatedType<T>> userAnnotatedTypes = getUserAnnotatedTypes(type); + if (userAnnotatedTypes != null) + { + types.addAll(userAnnotatedTypes); } return types; }