You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by st...@apache.org on 2018/01/31 23:22:18 UTC

tomee git commit: TOMEE-2167 add trim support for beans.xml

Repository: tomee
Updated Branches:
  refs/heads/fb_tomee8 99206eb8c -> 74b2cad62


TOMEE-2167 add trim support for beans.xml


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/74b2cad6
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/74b2cad6
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/74b2cad6

Branch: refs/heads/fb_tomee8
Commit: 74b2cad6297c75061f82196f5b9c5ebe05b255fd
Parents: 99206eb
Author: Mark Struberg <st...@apache.org>
Authored: Thu Feb 1 00:20:15 2018 +0100
Committer: Mark Struberg <st...@apache.org>
Committed: Thu Feb 1 00:20:15 2018 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/BeansInfo.java    |  1 +
 .../java/org/apache/openejb/cdi/CdiScanner.java | 74 ++++++++++++++++----
 .../openejb/cdi/OpenEJBBeanInfoService.java     |  5 +-
 .../apache/openejb/config/DeploymentLoader.java | 11 ++-
 .../apache/openejb/config/ReadDescriptors.java  | 11 ++-
 5 files changed, 83 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/74b2cad6/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
index b3f9dea..2cc4697 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BeansInfo.java
@@ -50,6 +50,7 @@ public class BeansInfo extends InfoObject {
         public final List<String> alternatives = new LinkedList<>();
         public final List<String> stereotypeAlternatives = new LinkedList<>();
         public String discoveryMode;
+        public boolean trim;
         public URI uri;
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/74b2cad6/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
index 68975e1..882e3d1 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
@@ -38,8 +38,9 @@ import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.intercept.InterceptorsManager;
 import org.apache.webbeans.spi.BDABeansXmlScanner;
+import org.apache.webbeans.spi.BdaScannerService;
 import org.apache.webbeans.spi.BeanArchiveService;
-import org.apache.webbeans.spi.ScannerService;
+import org.apache.webbeans.xml.DefaultBeanArchiveInformation;
 
 import javax.decorator.Decorator;
 import java.lang.annotation.Annotation;
@@ -59,7 +60,7 @@ import static java.util.Arrays.asList;
 /**
  * @version $Rev:$ $Date:$
  */
-public class CdiScanner implements ScannerService {
+public class CdiScanner implements BdaScannerService {
     public static final String OPENEJB_CDI_FILTER_CLASSLOADER = "openejb.cdi.filter.classloader";
 
     private static final Class<?>[] TRANSACTIONAL_INTERCEPTORS = new Class<?>[]{
@@ -67,7 +68,6 @@ public class CdiScanner implements ScannerService {
         RequiredInterceptor.class, RequiredNewInterceptor.class, SupportsInterceptor.class
     };
 
-    private final Set<Class<?>> classes = new HashSet<>();
     private final Set<Class<?>> startupClasses = new HashSet<>();
     private final Set<URL> beansXml = new HashSet<>();
     private final boolean logDebug;
@@ -75,8 +75,25 @@ public class CdiScanner implements ScannerService {
     private WebBeansContext webBeansContext;
     private ClassLoader containerLoader;
 
+    /**
+     * This BdaInfo is used for all manually added beans in this scanner.
+     */
+    private final DefaultBeanArchiveInformation tomeeBeanArchiveInformation;
+
+
+    /**
+     * for having proper scan mode 'SCOPED'/trim support we need to know which bean class
+     * has which beans.xml.
+     */
+    private Map<BeanArchiveService.BeanArchiveInformation, Set<Class<?>>> beanClassesPerBda = new HashMap<>();
+
+
     public CdiScanner() {
         logDebug = "true".equals(SystemInstance.get().getProperty("openejb.cdi.noclassdeffound.log", "false"));
+
+        tomeeBeanArchiveInformation = new DefaultBeanArchiveInformation("tomee");
+        tomeeBeanArchiveInformation.setBeanDiscoveryMode(BeanArchiveService.BeanDiscoveryMode.ALL);
+
     }
 
     public void setContext(final WebBeansContext webBeansContext) {
@@ -105,6 +122,7 @@ public class CdiScanner implements ScannerService {
 
         // app beans
         for (final EjbJarInfo ejbJar : appInfo.ejbJars) {
+            Set<Class<?>> classes = new HashSet<>();
             final BeansInfo beans = ejbJar.beans;
 
             if (beans == null || "false".equalsIgnoreCase(ejbJar.properties.getProperty("openejb.cdi.activated"))) {
@@ -194,10 +212,20 @@ public class CdiScanner implements ScannerService {
                     logger.info("    " + c);
                 }
             }
+
+           if (!classes.isEmpty()) {
+                addClasses(tomeeBeanArchiveInformation, classes);
+           }
         }
     }
 
-    private void addClasses(final Collection<String> list, final ClassLoader loader) {
+    private void addClasses(BeanArchiveService.BeanArchiveInformation bdaInfo, final Collection<String> list, final ClassLoader loader) {
+        Set<Class<?>> classes = beanClassesPerBda.get(bdaInfo);
+        if (classes == null) {
+            classes = new HashSet<>();
+            beanClassesPerBda.put(bdaInfo, classes);
+        }
+
         for (final String s : list) {
             final Class<?> load = load(s, loader);
             if (load != null) {
@@ -205,10 +233,25 @@ public class CdiScanner implements ScannerService {
             }
         }
     }
-    private BeanArchiveService.BeanArchiveInformation handleBda(final StartupObject startupObject, final ClassLoader classLoader,final ClassLoaderComparator comparator,
-                           final BeansInfo beans, final ClassLoader scl, final boolean filterByClassLoader,
-                           final BeanArchiveService beanArchiveService, final boolean openejb,
-                           final BeansInfo.BDAInfo bda) {
+    private void addClasses(BeanArchiveService.BeanArchiveInformation bdaInfo, final Collection<Class<?>> list) {
+        Set<Class<?>> classes = beanClassesPerBda.get(bdaInfo);
+        if (classes == null) {
+            classes = new HashSet<>();
+            beanClassesPerBda.put(bdaInfo, classes);
+        }
+
+        classes.addAll(list);
+    }
+
+    @Override
+    public Map<BeanArchiveService.BeanArchiveInformation, Set<Class<?>>> getBeanClassesPerBda() {
+        return beanClassesPerBda;
+    }
+
+    private BeanArchiveService.BeanArchiveInformation handleBda(final StartupObject startupObject, final ClassLoader classLoader, final ClassLoaderComparator comparator,
+                                                                final BeansInfo beans, final ClassLoader scl, final boolean filterByClassLoader,
+                                                                final BeanArchiveService beanArchiveService, final boolean openejb,
+                                                                final BeansInfo.BDAInfo bda) {
         BeanArchiveService.BeanArchiveInformation information;
         if (openejb) {
             final OpenEJBBeanInfoService beanInfoService = OpenEJBBeanInfoService.class.cast(beanArchiveService);
@@ -226,10 +269,10 @@ public class CdiScanner implements ScannerService {
                 throw new IllegalStateException(e);
             }
         }
-        addClasses(information.getAlternativeClasses(), classLoader);
-        addClasses(information.getDecorators(), classLoader);
-        addClasses(information.getInterceptors(), classLoader);
-        addClasses(information.getAlternativeStereotypes(), classLoader);
+        addClasses(information, information.getAlternativeClasses(), classLoader);
+        addClasses(information, information.getDecorators(), classLoader);
+        addClasses(information, information.getInterceptors(), classLoader);
+        addClasses(information, information.getAlternativeStereotypes(), classLoader);
 
         final boolean scanModeAnnotated = BeanArchiveService.BeanDiscoveryMode.ANNOTATED.equals(information.getBeanDiscoveryMode());
         final boolean noScan = BeanArchiveService.BeanDiscoveryMode.NONE.equals(information.getBeanDiscoveryMode());
@@ -247,6 +290,7 @@ public class CdiScanner implements ScannerService {
                 }
             }
 
+            Set<Class<?>> classes = new HashSet<>(bda.managedClasses.size());
             for (final String name : bda.managedClasses) {
                 if (information.isClassExcluded(name)) {
                     continue;
@@ -278,6 +322,8 @@ public class CdiScanner implements ScannerService {
                     }
                 }
             }
+
+            addClasses(information, classes);
         }
 
         return information;
@@ -348,12 +394,12 @@ public class CdiScanner implements ScannerService {
 
     @Override
     public Set<Class<?>> getBeanClasses() {
-        return classes;
+        return Collections.EMPTY_SET;
     }
 
     @Override
     public void release() {
-        classes.clear();
+        beanClassesPerBda.clear();
     }
 
     public Set<Class<?>> getStartupClasses() {

http://git-wip-us.apache.org/repos/asf/tomee/blob/74b2cad6/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
index 1f6210b..964baf5 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBBeanInfoService.java
@@ -37,10 +37,13 @@ public class OpenEJBBeanInfoService implements BeanArchiveService {
     }
 
     public DefaultBeanArchiveInformation createBeanArchiveInformation(final BeansInfo.BDAInfo bda, final BeansInfo info, final ClassLoader loader) {
-        final String mode = bda.discoveryMode == null? "ALL" : bda.discoveryMode;
+        String mode = bda.discoveryMode == null? "ALL" : bda.discoveryMode;
         if (info != null && info.version != null && !"1.0".equals(info.version) && info.discoveryMode == null) {
             throw new WebBeansConfigurationException("beans.xml with version 1.1 and higher must declare a bean-discovery-mode!");
         }
+        if ("ALL".equalsIgnoreCase(mode) && bda.trim) {
+            mode = "TRIM";
+        }
 
         final DefaultBeanArchiveInformation information = new DefaultBeanArchiveInformation(bda.uri.toASCIIString());
         information.setVersion(info == null ? "1.1" : info.version);

http://git-wip-us.apache.org/repos/asf/tomee/blob/74b2cad6/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
index 1135c07..30645e0 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
@@ -1206,8 +1206,15 @@ public class DeploymentLoader implements DeploymentFilterable {
         // check is done here since later we lost the data of the origin
         ReadDescriptors.checkDuplicatedByBeansXml(beans, current);
 
-        final String beanDiscoveryMode = beans.getBeanDiscoveryMode();
-        current.getDiscoveryByUrl().put(url, beanDiscoveryMode == null ? "ALL" : beanDiscoveryMode);
+        String beanDiscoveryMode = beans.getBeanDiscoveryMode();
+        if (beanDiscoveryMode == null) {
+            beanDiscoveryMode = "ALL";
+        }
+        else if ("ALL".equalsIgnoreCase(beanDiscoveryMode) && beans.isTrim()) {
+            beanDiscoveryMode = "TRIM";
+        }
+
+        current.getDiscoveryByUrl().put(url, beanDiscoveryMode);
     }
 
     private void addBeansXmls(final AppModule appModule) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/74b2cad6/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
index b3942a0..e8aad41 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
@@ -533,8 +533,15 @@ public class ReadDescriptors implements DynamicDeployer {
         // check is done here since later we lost the data of the origin
         ReadDescriptors.checkDuplicatedByBeansXml(beans, current);
 
-        final String beanDiscoveryMode = beans.getBeanDiscoveryMode();
-        current.getDiscoveryByUrl().put(url, beanDiscoveryMode == null ? "ALL" : beanDiscoveryMode);
+        String beanDiscoveryMode = beans.getBeanDiscoveryMode();
+        if (beanDiscoveryMode == null) {
+            beanDiscoveryMode = "ALL";
+        }
+        else if ("ALL".equalsIgnoreCase(beanDiscoveryMode) && beans.isTrim()) {
+            beanDiscoveryMode = "TRIM";
+        }
+
+        current.getDiscoveryByUrl().put(url, beanDiscoveryMode);
         return current;
     }