You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2026/07/04 15:34:20 UTC

(openwebbeans) branch main updated: OWB-1463 remove nested for loop resulting in a O(^2)

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/main by this push:
     new aa59630b4 OWB-1463 remove nested for loop resulting in a O(^2)
aa59630b4 is described below

commit aa59630b4458f8aff9d50c375279935e45f69a02
Author: Mark Struberg <st...@apache.org>
AuthorDate: Sat Jul 4 17:32:49 2026 +0200

    OWB-1463 remove nested for loop resulting in a O(^2)
    
    This change is a performance improvement and related to OWB-1298.
---
 .../org/apache/webbeans/config/BeansDeployer.java  |  9 +-------
 .../apache/webbeans/container/BeanManagerImpl.java | 25 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 8 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 34a03a675..94f5350ac 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,7 +39,6 @@ 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;
@@ -1631,14 +1630,8 @@ public class BeansDeployer
             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
+                if (bm.hasAdditionalDefaultAnnotatedType(key))
                 {
                     continue;
                 }
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 d2c140749..5d402c762 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
@@ -1577,6 +1577,31 @@ public class BeanManagerImpl implements BeanManager, Referenceable
         return null;
     }
 
+    public boolean hasAdditionalDefaultAnnotatedType(AnnotatedType<?> annotatedType)
+    {
+        final ConcurrentMap<String, AnnotatedType<?>> annotatedTypes = additionalAnnotatedTypes.get(annotatedType.getJavaClass());
+        if (annotatedTypes == null)
+        {
+            return false;
+        }
+
+        for (AnnotatedType<?> candidate : annotatedTypes.values())
+        {
+            if (candidate == annotatedType || !(candidate instanceof AnnotatedTypeWrapper))
+            {
+                continue;
+            }
+
+            AnnotatedTypeWrapper<?> wrapper = (AnnotatedTypeWrapper<?>) candidate;
+            if (wrapper.getId().endsWith(AnnotatedElementFactory.OWB_DEFAULT_KEY) &&
+                    candidate.getAnnotations().equals(annotatedType.getAnnotations())) // strictly it is qualifiers only but faster
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public <T> Iterable<AnnotatedType<T>> getAnnotatedTypes(Class<T> type)
     {
         final Collection<AnnotatedType<T>> types = new ArrayList<>(2);