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 2017/05/27 16:11:48 UTC

svn commit: r1796427 - in /openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src: main/java/org/apache/webbeans/arquillian/standalone/ test/java/org/apache/webbeans/arquillian/test/ test/java/org/apache/webbeans/arquillian/test/beans/

Author: struberg
Date: Sat May 27 16:11:48 2017
New Revision: 1796427

URL: http://svn.apache.org/viewvc?rev=1796427&view=rev
Log:
OWB-1183 enable implicit bean archive discovery for Arquillian

Added:
    openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianImplicitBdaJarDeploymentTest.java
      - copied, changed from r1796329, openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianJarDeploymentTest.java
    openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/NonCdiBean.java
      - copied, changed from r1796329, openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/SampleUser.java
Modified:
    openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbArquillianScannerService.java

Modified: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbArquillianScannerService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbArquillianScannerService.java?rev=1796427&r1=1796426&r2=1796427&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbArquillianScannerService.java (original)
+++ openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbArquillianScannerService.java Sat May 27 16:11:48 2017
@@ -18,6 +18,8 @@
  */
 package org.apache.webbeans.arquillian.standalone;
 
+import javax.enterprise.inject.spi.BeanManager;
+
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.spi.BDABeansXmlScanner;
 import org.apache.webbeans.spi.BeanArchiveService;
@@ -35,6 +37,7 @@ import org.jboss.shrinkwrap.api.spec.Jav
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLStreamHandler;
@@ -52,7 +55,9 @@ public class OwbArquillianScannerService
 
     private final boolean beansXmlBdaScanningEnabled;
     private final WebBeansContext webBeansContext;
-    private final BeanArchiveService archiveService;
+    private final BeanManager beanManager;
+    private final BeanArchiveService beanArchiveService;
+
 
     private Archive archive;
 
@@ -64,7 +69,8 @@ public class OwbArquillianScannerService
     {
         this.beansXmlBdaScanningEnabled = false;
         webBeansContext = WebBeansContext.getInstance();
-        archiveService = webBeansContext.getBeanArchiveService();
+        this.beanManager = webBeansContext.getBeanManagerImpl();
+        beanArchiveService = webBeansContext.getBeanArchiveService();
     }
 
     @Override
@@ -151,7 +157,7 @@ public class OwbArquillianScannerService
 
         if (metainfBeansXmlUrl != null || webBeansXmlUrl != null)
         {
-            final BeanArchiveService.BeanArchiveInformation info = archiveService.getBeanArchiveInformation(webBeansXmlUrl != null ? webBeansXmlUrl : metainfBeansXmlUrl);
+            final BeanArchiveService.BeanArchiveInformation info = beanArchiveService.getBeanArchiveInformation(webBeansXmlUrl != null ? webBeansXmlUrl : metainfBeansXmlUrl);
 
             // in this case we need to scan the WEB-INF/classses folder for .class files
             Map<ArchivePath, Node> classes = archive.getContent(Filters.include(WEB_INF_CLASS_FOLDER + ".*\\.class"));
@@ -188,17 +194,16 @@ public class OwbArquillianScannerService
 
         if (beansXmlUrl == null)
         {
-            // this is not a CDI archive
-            return;
+            // that means we switch to 'Implicit BDA' mode
+            beansXmlUrl = getBeanXmlUrl(archive, "/");
         }
 
-
         // otherwise we store it for later use
         beansXmls.add(beansXmlUrl);
 
-        // and now add all classes
+        // and now scan all classes those classes acording to their BDA info
         Map<ArchivePath, Node> classes = archive.getContent(Filters.include(".*\\.class"));
-        scanClasses(archiveService.getBeanArchiveInformation(beansXmlUrl), classes, null);
+        scanClasses(beanArchiveService.getBeanArchiveInformation(beansXmlUrl), classes, null);
     }
 
     /**
@@ -209,6 +214,12 @@ public class OwbArquillianScannerService
     private void scanClasses(final BeanArchiveService.BeanArchiveInformation info,
                              final Map<ArchivePath, Node> classes, String classBasePath)
     {
+        if (info != null && info.getBeanDiscoveryMode() == BeanArchiveService.BeanDiscoveryMode.NONE)
+        {
+            // this jar should not get scanned at all.
+            return;
+        }
+
         for (Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
         {
             String className = classEntry.getKey().get();
@@ -229,24 +240,51 @@ public class OwbArquillianScannerService
 
             className = className.replace('/', '.');
 
-            if (info != null && info.isClassExcluded(className))
-            {
-                continue;
-            }
-
-
+            Class<?> beanClass = null;
             try
             {
-                Class<?> beanClass = Class.forName(className);
-                beanClasses.add(beanClass);
+                beanClass = Class.forName(className);
             }
             catch (ClassNotFoundException cnfe)
             {
                 throw new RuntimeException("Could not scan class", cnfe);
             }
+
+            if (info != null && info.isClassExcluded(className))
+            {
+                continue;
+            }
+            if (info != null && info.getBeanDiscoveryMode() == BeanArchiveService.BeanDiscoveryMode.ANNOTATED)
+            {
+                // only classes with a 'Bean Defining Annotation should get included
+                boolean hasBeanDefiningAnnotation = false;
+                for (Annotation annotation : beanClass.getAnnotations())
+                {
+                    if (isBeanDefiningAnnotation(annotation))
+                    {
+                        hasBeanDefiningAnnotation = true;
+                        break;
+                    }
+                }
+                if (!hasBeanDefiningAnnotation)
+                {
+                    continue;
+                }
+            }
+
+            beanClasses.add(beanClass);
         }
     }
 
+    protected boolean isBeanDefiningAnnotation(Annotation annotation)
+    {
+        Class<? extends Annotation> annotationType = annotation.annotationType();
+        boolean isBeanAnnotation = beanManager.isScope(annotationType);
+        isBeanAnnotation = isBeanAnnotation || beanManager.isStereotype(annotationType);
+
+        return isBeanAnnotation;
+    }
+
     private URL getBeanXmlUrl(Archive archive, String beansXmlPath)
     {
         final Node beansXml = archive.get(beansXmlPath);

Copied: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianImplicitBdaJarDeploymentTest.java (from r1796329, openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianJarDeploymentTest.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianImplicitBdaJarDeploymentTest.java?p2=openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianImplicitBdaJarDeploymentTest.java&p1=openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianJarDeploymentTest.java&r1=1796329&r2=1796427&rev=1796427&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianJarDeploymentTest.java (original)
+++ openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/OwbArquillianImplicitBdaJarDeploymentTest.java Sat May 27 16:11:48 2017
@@ -18,39 +18,38 @@
  */
 package org.apache.webbeans.arquillian.test;
 
+import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Inject;
 
+import org.apache.webbeans.arquillian.test.beans.NonCdiBean;
 import org.apache.webbeans.arquillian.test.beans.SampleUser;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
-import org.jboss.shrinkwrap.api.asset.EmptyAsset;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
-
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 
 /**
- * This test verifies the deployment of a JAR packaging.
+ * This test verifies the deployment of a JAR packaging with implicit BDAs.
+ * This is if NO beans.xml is present!
  */
 @RunWith(Arquillian.class)
-public class OwbArquillianJarDeploymentTest
+public class OwbArquillianImplicitBdaJarDeploymentTest
 {
+    private @Inject SampleUser sampleUser;
 
-    @Inject
-    private SampleUser sampleUser;
-
+    private @Inject BeanManager bm;
 
     @Deployment
     public static JavaArchive deploy()
     {
         JavaArchive testJar = ShrinkWrap
-                .create(JavaArchive.class, "sampleUserTest.jar")
-                .addClass(OwbArquillianJarDeploymentTest.class)
-                .addPackage(SampleUser.class.getPackage())
-                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+                .create(JavaArchive.class, "sampleImplicitBdaTest.jar")
+                .addClass(OwbArquillianImplicitBdaJarDeploymentTest.class)
+                .addPackage(SampleUser.class.getPackage());
 
         return testJar;
     }
@@ -63,5 +62,8 @@ public class OwbArquillianJarDeploymentT
 
         sampleUser.setFirstName("Karl");
         Assert.assertEquals("Karl", sampleUser.getFirstName());
+
+        // but the NonCdiBean should not be picked up in an implicit BDA
+        Assert.assertEquals(0, bm.getBeans(NonCdiBean.class).size());
     }
 }

Copied: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/NonCdiBean.java (from r1796329, openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/SampleUser.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/NonCdiBean.java?p2=openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/NonCdiBean.java&p1=openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/SampleUser.java&r1=1796329&r2=1796427&rev=1796427&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/SampleUser.java (original)
+++ openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/test/java/org/apache/webbeans/arquillian/test/beans/NonCdiBean.java Sat May 27 16:11:48 2017
@@ -18,31 +18,22 @@
  */
 package org.apache.webbeans.arquillian.test.beans;
 
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.SessionScoped;
 import java.io.Serializable;
 
 /**
- * A sample User to get injected into an Arquillian test
+ * A class which doesn't use any CDI stuff.
  */
-@SessionScoped
-public class SampleUser implements Serializable
+public class NonCdiBean implements Serializable
 {
-    private String firstName;
+    private int i;
 
-    @PostConstruct
-    public void init()
+    public int getI()
     {
-        firstName = "Hans";
+        return i;
     }
 
-    public String getFirstName()
+    public void setI(int i)
     {
-        return firstName;
-    }
-
-    public void setFirstName(String firstName)
-    {
-        this.firstName = firstName;
+        this.i = i;
     }
 }