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 2014/02/09 23:23:28 UTC

svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Author: struberg
Date: Sun Feb  9 22:23:28 2014
New Revision: 1566452

URL: http://svn.apache.org/r1566452
Log:
OWB-928 improve scanning performance

We now take the annotation information from ASM and don't do a loadClass...getAnnotations anymore

Added:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java Sun Feb  9 22:23:28 2014
@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
 import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
 import org.apache.webbeans.exception.WebBeansDeploymentException;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.BDABeansXmlScanner;
 import org.apache.webbeans.spi.BeanArchiveService;
+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
 import org.apache.webbeans.spi.ScannerService;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.UrlSet;
@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
 import org.apache.xbean.finder.ClassLoaders;
 
 import java.io.IOException;
+import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
 
     protected ClassLoader loader;
     protected CdiArchive archive;
-    protected AnnotationFinder finder;
+    protected OwbAnnotationFinder finder;
     protected boolean isBDAScannerEnabled = false;
     protected BDABeansXmlScanner bdaBeansXmlScanner;
+    protected final WebBeansContext webBeansContext;
 
 
+    protected AbstractMetaDataDiscovery()
+    {
+        webBeansContext = WebBeansContext.getInstance();
+    }
 
     protected AnnotationFinder initFinder()
     {
@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
             return finder;
         }
 
-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
         if (beanArchiveService == null)
         {
             beanArchiveService = webBeansContext.getBeanArchiveService();
         }
 
-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(), beanArchiveService, WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
-        finder = new AnnotationFinder(archive);
+        archive = new CdiArchive(beanArchiveService, WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
+        finder = new OwbAnnotationFinder(archive);
 
         return finder;
     }
@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
                 path.contains("/idea_rt") ||
                 path.contains("/eclipse") ||
                 path.contains("/jcommander") ||
+                path.contains("/tomcat") ||
+                path.contains("/catalina") ||
+                path.contains("/jasper") ||
+                path.contains("/jsp-api") ||
+                path.contains("/myfaces-") ||
+                path.contains("/servlet-api") ||
+                path.contains("/javax") ||
+                path.contains("/annotation-api") ||
+                path.contains("/el-api") ||
+                path.contains("/mojarra") ||
                 path.contains("/openwebbeans-"))
             {
                 //X TODO this should be much more actually
@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
         // and also scan the bean archive!
         if (beanArchiveService == null)
         {
-            WebBeansContext webBeansContext = WebBeansContext.getInstance();
+
             beanArchiveService = webBeansContext.getBeanArchiveService();
         }
 
@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
     public Set<Class<?>> getBeanClasses()
     {
         final Set<Class<?>> classSet = new HashSet<Class<?>>();
-        for(String str : archive.getClasses())
+        for (CdiArchive.FoundClasses foundClasses : archive.classesByUrl().values())
         {
-            try
+            boolean scanModeAnnotated = BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
+            for(String className : foundClasses.getClassNames())
             {
-                Class<?> clazz = ClassUtil.getClassFromName(str);
-                if (clazz != null)
+                try
                 {
+                    if (scanModeAnnotated)
+                    {
+                        // in this case we need to find out whether we should keep this class in the Archive
+                        AnnotationFinder.ClassInfo classInfo = finder.getClassInfo(className);
+                        if (classInfo == null || !isBeanAnnotatedClass(classInfo))
+                        {
+                            continue;
+                        }
+                    }
 
-                    // try to provoke a NoClassDefFoundError exception which is thrown
-                    // if some dependencies of the class are missing
-                    clazz.getDeclaredFields();
-                    clazz.getDeclaredMethods();
+                    Class<?> clazz = ClassUtil.getClassFromName(className);
+                    if (clazz != null)
+                    {
+
+                        // try to provoke a NoClassDefFoundError exception which is thrown
+                        // if some dependencies of the class are missing
+                        clazz.getDeclaredFields();
+                        clazz.getDeclaredMethods();
 
-                    // we can add this class cause it has been loaded completely
-                    classSet.add(clazz);
+                        // we can add this class cause it has been loaded completely
+                        classSet.add(clazz);
 
+                    }
                 }
-            }
-            catch (NoClassDefFoundError e)
-            {
-                if (logger.isLoggable(Level.WARNING))
+                catch (NoClassDefFoundError e)
                 {
-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new Object[] { str, e.toString() });
+                    if (logger.isLoggable(Level.WARNING))
+                    {
+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018, new Object[] { className, e.toString() });
+                    }
                 }
             }
+
         }
 
         return classSet;
     }
 
+    /**
+     * This method is called for classes from bean archives with
+     * bean-discovery-mode 'annotated'.
+     *
+     * This method is intended to be overwritten in integration scenarios and e.g.
+     * allows to add other criterias for keeping the class.
+     *
+     * @param classInfo
+     * @return true if this class should be kept and further get picked up as CDI Bean
+     */
+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo classInfo)
+    {
+        // check whether this class has 'scope' annotations or a stereotype
+        for (AnnotationFinder.AnnotationInfo annotationInfo : classInfo.getAnnotations())
+        {
+            if (isBeanAnnotation(annotationInfo))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo annotationInfo)
+    {
+        String annotationName = annotationInfo.getName();
+
+        // TODO add caches
+
+        try
+        {
+            Class<? extends Annotation> annotationType = (Class<? extends Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
+            boolean isBeanAnnotation = webBeansContext.getBeanManagerImpl().isScope(annotationType);
+            isBeanAnnotation = isBeanAnnotation || webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
+
+            return isBeanAnnotation;
+        }
+        catch (ClassNotFoundException e)
+        {
+            return false;
+        }
+    }
+
 
     @Override
     public Set<URL> getBeanXmls()

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java Sun Feb  9 22:23:28 2014
@@ -18,11 +18,8 @@
  */
 package org.apache.webbeans.corespi.scanner.xbean;
 
-import java.lang.annotation.Annotation;
 import java.util.List;
-import java.util.Set;
 
-import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
 import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
 import org.apache.xbean.finder.filter.Filter;
@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
  */
 public class BeanArchiveFilter implements Filter
 {
-    private final ClassLoader loader;
-    private final BeanManagerImpl beanManager;
     private final BeanArchiveInformation beanArchiveInfo;
-    private final boolean scanAll;
     private final boolean scanNone;
-    private final boolean scanAnnotated;
 
     private List<String> urlClasses;
-    private Set<String> allClasses;
 
-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl beanManager, BeanArchiveInformation beanArchiveInfo, List<String> urlClasses, Set<String> allClasses)
+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo, List<String> urlClasses)
     {
-        this.loader = loader;
-        this.beanManager = beanManager;
         this.beanArchiveInfo = beanArchiveInfo;
         this.urlClasses = urlClasses;
-        this.allClasses = allClasses;
         BeanDiscoveryMode discoveryMode = beanArchiveInfo.getBeanDiscoveryMode();
 
-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
     }
 
     @Override
@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
             return false;
         }
 
-        if (scanAll)
-        {
-            urlClasses.add(name);
-            allClasses.add(name);
-            return true;
-        }
-
-        if (scanAnnotated)
-        {
-            try
-            {
-                Class clazz = Class.forName(name, false, loader);
-                if (!hasScopeAnnotation(clazz.getAnnotations()))
-                {
-                    return false;
-                }
-            }
-            catch (ClassNotFoundException cnfe)
-            {
-                // not a problem, just ignore this class
-                return false;
-            }
-            catch (NoClassDefFoundError ncdf)
-            {
-                // not a problem, just ignore this class
-                return false;
-            }
-
             urlClasses.add(name);
-            allClasses.add(name);
             return true;
-        }
-
-        return false;
     }
 
-    private boolean hasScopeAnnotation(Annotation[] annotations)
-    {
-        for (Annotation annotation : annotations)
-        {
-            if (beanManager.isScope(annotation.annotationType()))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java Sun Feb  9 22:23:28 2014
@@ -18,14 +18,12 @@
  */
 package org.apache.webbeans.corespi.scanner.xbean;
 
-import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.spi.BeanArchiveService;
+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
 import org.apache.xbean.finder.archive.Archive;
-import org.apache.xbean.finder.archive.ClassesArchive;
 import org.apache.xbean.finder.archive.ClasspathArchive;
 import org.apache.xbean.finder.archive.CompositeArchive;
 import org.apache.xbean.finder.archive.FilteredArchive;
-import org.apache.xbean.finder.filter.Filter;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -33,11 +31,9 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * this delegate pattern is interesting
@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
      */
     private final Map<String, FoundClasses> classesByUrl = new HashMap<String, FoundClasses>();
 
-    private final Set<String> allClasses = new HashSet<String>();
     private final Archive delegate;
 
-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
+    public CdiArchive(BeanArchiveService beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
     {
         final Collection<Archive> archives = new ArrayList<Archive>();
         for (final URL url : urls.values())
         {
             final List<String> urlClasses = new ArrayList<String>();
 
-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo = beanArchiveService.getBeanArchiveInformation(url);
+            BeanArchiveInformation beanArchiveInfo = beanArchiveService.getBeanArchiveInformation(url);
             final Archive archive = new FilteredArchive(ClasspathArchive.archive(loader, url),
-                    new BeanArchiveFilter(loader, beanManager, beanArchiveInfo, urlClasses, allClasses));
+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
 
-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url, urlClasses));
+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url, urlClasses, beanArchiveInfo));
             archives.add(archive);
         }
 
         delegate = new CompositeArchive(archives);
     }
 
-    public CdiArchive(final Collection<Class<?>> classList)
-    {
-        delegate = new FilteredArchive(new ClassesArchive(classList), new Filter()
-        {
-            @Override
-            public boolean accept(final String name)
-            {
-                allClasses.add(name);
-                return true;
-            }
-        });
-    }
-
-    public Set<String> getClasses()
-    {
-        return allClasses;
-    }
-
     public Map<String, FoundClasses> classesByUrl()
     {
         return classesByUrl;
@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
     {
         private URL url;
         private Collection<String> classNames;
+        private BeanArchiveInformation beanArchiveInfo;
 
-        public FoundClasses(URL url, Collection<String> classNames)
+        public FoundClasses(URL url, Collection<String> classNames, BeanArchiveInformation beanArchiveInfo)
         {
             this.url = url;
             this.classNames = classNames;
+            this.beanArchiveInfo = beanArchiveInfo;
         }
 
         public URL getUrl()
@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
             return url;
         }
 
+        public BeanArchiveInformation getBeanArchiveInfo()
+        {
+            return beanArchiveInfo;
+        }
+
         public Collection<String> getClassNames()
         {
             return classNames;

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java Sun Feb  9 22:23:28 2014
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.corespi.scanner.xbean;
+
+import org.apache.xbean.finder.AnnotationFinder;
+import org.apache.xbean.finder.archive.Archive;
+
+/**
+ * We just extend the default AnnotationFinder to get Access to the original ClassInfo
+ * for not having to call loadClass so often...
+ */
+public class OwbAnnotationFinder extends AnnotationFinder
+{
+    public OwbAnnotationFinder(Archive archive, boolean checkRuntimeAnnotation)
+    {
+        super(archive, checkRuntimeAnnotation);
+    }
+
+    public OwbAnnotationFinder(Archive archive)
+    {
+        super(archive);
+    }
+
+    public ClassInfo getClassInfo(String className)
+    {
+        return classInfos.get(className);
+    }
+
+}

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java Sun Feb  9 22:23:28 2014
@@ -19,14 +19,14 @@
 package org.apache.webbeans.lifecycle.test;
 
 import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
 import org.apache.webbeans.exception.WebBeansDeploymentException;
 import org.apache.webbeans.util.Asserts;
-import org.apache.xbean.finder.AnnotationFinder;
 
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Used by each test. 
@@ -35,15 +35,18 @@ import java.util.Collection;
  */
 public class OpenWebBeansTestMetaDataDiscoveryService extends AbstractMetaDataDiscovery
 {
+
+    private Collection<Class<?>> classes;
+
     public OpenWebBeansTestMetaDataDiscoveryService()
     {
-        
+        super();
     }
 
     @Override
     protected void configure()
     {
-        //Nothing we scan
+        // Nothing to scan, we add all our stuff manually...
     }
     
     /**
@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
      */
     public void deployClasses(Collection<Class<?>> classes)
     {
-        if(classes != null)
-        {
-            archive = new CdiArchive(classes);
-            finder = new AnnotationFinder(archive);
-        }
+        this.classes = classes;
     }
-    
+
+    @Override
+    public Set<Class<?>> getBeanClasses()
+    {
+        return new HashSet<Class<?>>(classes);
+    }
+
     /**
      * Those xmls will be scanned by container.
      * @param xmls beans xmls
@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
         
         addWebBeansXmlLocation(url);
     }
-    
 
 }

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java Sun Feb  9 22:23:28 2014
@@ -18,14 +18,11 @@
  */
 package org.apache.webbeans.web.scanner;
 
-import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.BeanArchiveService;
 import org.apache.webbeans.util.ExceptionUtil;
 import org.apache.webbeans.util.WebBeansUtil;
-import org.apache.xbean.finder.AnnotationFinder;
 
 import javax.servlet.ServletContext;
 import java.net.MalformedURLException;
@@ -50,17 +47,6 @@ public class WebScannerService extends A
     }
 
     @Override
-    protected AnnotationFinder initFinder()
-    {
-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
-        beanArchiveService = webbeansContext.getBeanArchiveService();
-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(), beanArchiveService, WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
-        finder = new AnnotationFinder(archive);
-
-        return finder;
-    }
-
-    @Override
     public void init(Object context)
     {
         super.init(context);



Re: Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Romain Manni-Bucau <rm...@gmail.com>.
yep, as soon as 1.2.2 is released I commit my fixes to get it
integrated with tomee (tcks are not broken :)) a,d then we see how to
share the common part
Romain Manni-Bucau
Twitter: @rmannibucau
Blog: http://rmannibucau.wordpress.com/
LinkedIn: http://fr.linkedin.com/in/rmannibucau
Github: https://github.com/rmannibucau



2014-02-10 10:45 GMT+01:00 Mark Struberg <st...@yahoo.de>:
> I thought about that as well. I need to dig a bit into the tomee codebase. I used quite a few tricks to get a good performance.
> What to do next?
> I'd say we focus on the owb-1.2.2 release for tomee 1.6.1 and then continue with integrating owb-2.0.0 in tomee.
>
> LieGrue,
> strub
>
>
>
>
>
> On Monday, 10 February 2014, 8:35, Romain Manni-Bucau <rm...@gmail.com> wrote:
>
> wonder if we could merge somehow openejb and openwebbeans scanning
>>filtering. OpenEJB/TomEE one is really nice and efficient (even if
>>sometimes code can seem a bit rough).
>>
>>Maybe something to finally put in XBean?
>>Romain Manni-Bucau
>>Twitter: @rmannibucau
>>Blog: http://rmannibucau.wordpress.com/
>>LinkedIn: http://fr.linkedin.com/in/rmannibucau
>>Github: https://github.com/rmannibucau
>>
>>
>>
>>2014-02-10 8:27 GMT+01:00 Mark Struberg <st...@yahoo.de>:
>>> It's basically a complete re-implementation of our scanning mechanism.
>>> We still provide and consume the same ScannerService SPI yet though.
>>>
>>> But I'm about to change this and try to introduce something more smart probably. Still thinking about it.
>>>
>>> LieGrue,
>>> strub
>>>
>>>
>>>
>>>
>>>
>>> On Monday, 10 February 2014, 8:24, Romain Manni-Bucau <rm...@gmail.com> wrote:
>>>
>>> Great, got a doubt after months without touching it, thks :)
>>>>Romain Manni-Bucau
>>>>Twitter: @rmannibucau
>>>>Blog: http://rmannibucau.wordpress.com/
>>>>LinkedIn: http://fr.linkedin.com/in/rmannibucau
>>>>Github: https://github.com/rmannibucau
>>>>
>>>>
>>>>
>>>>2014-02-10 8:09 GMT+01:00 Mark Struberg <st...@yahoo.de>:
>>>>> I also did test this on windows and it works.
>>>>> Reason is that thi are URL.toExternalPath, which always use forward slashes on all platforms to my knowledge.
>>>>>
>>>>> Now we have no single new URL(...) anymore in our code.
>>>>>
>>>>> LieGrue,
>>>>> strub
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Monday, 10 February 2014, 7:07, Romain Manni-Bucau <rm...@gmail.com> wrote:
>>>>>
>>>>> Hi Mark
>>>>>>
>>>>>>Will it work on windows or /xxx will not match?
>>>>>>---------- Message transféré ----------
>>>>>>De : <st...@apache.org>
>>>>>>Date : 9 févr. 2014 23:23
>>>>>>Objet : svn commit: r1566452 - in /openwebbeans/trunk:
>>>>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
>>>>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
>>>>>>webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
>>>>>>À : <co...@openwebbeans.apache.org>
>>>>>>
>>>>>>Author: struberg
>>>>>>Date: Sun Feb  9 22:23:28 2014
>>>>>>New Revision: 1566452
>>>>>>
>>>>>>URL: http://svn.apache.org/r1566452
>>>>>>Log:
>>>>>>OWB-928 improve scanning performance
>>>>>>
>>>>>>We now take the annotation information from ASM and don't do a
>>>>>>loadClass...getAnnotations anymore
>>>>>>
>>>>>>Added:
>>>>>>
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>>Modified:
>>>>>>
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>>
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>>
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>>
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>>
>>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>>
>>>>>>Modified:
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>>URL:
>>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>>==============================================================================
>>>>>>---
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>>(original)
>>>>>>+++
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>>Sun Feb  9 22:23:28 2014
>>>>>>@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
>>>>>>import org.apache.webbeans.config.OpenWebBeansConfiguration;
>>>>>>import org.apache.webbeans.config.WebBeansContext;
>>>>>>import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>>>+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
>>>>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>>>>import org.apache.webbeans.spi.BDABeansXmlScanner;
>>>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>>>>import org.apache.webbeans.spi.ScannerService;
>>>>>>import org.apache.webbeans.util.ClassUtil;
>>>>>>import org.apache.webbeans.util.UrlSet;
>>>>>>@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
>>>>>>import org.apache.xbean.finder.ClassLoaders;
>>>>>>
>>>>>>import java.io.IOException;
>>>>>>+import java.lang.annotation.Annotation;
>>>>>>import java.net.URL;
>>>>>>import java.util.Collections;
>>>>>>import java.util.Enumeration;
>>>>>>@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
>>>>>>
>>>>>>     protected ClassLoader loader;
>>>>>>     protected CdiArchive archive;
>>>>>>-    protected AnnotationFinder finder;
>>>>>>+    protected OwbAnnotationFinder finder;
>>>>>>     protected boolean isBDAScannerEnabled = false;
>>>>>>     protected BDABeansXmlScanner bdaBeansXmlScanner;
>>>>>>+    protected final WebBeansContext webBeansContext;
>>>>>>
>>>>>>
>>>>>>+    protected AbstractMetaDataDiscovery()
>>>>>>+    {
>>>>>>+        webBeansContext = WebBeansContext.getInstance();
>>>>>>+    }
>>>>>>
>>>>>>     protected AnnotationFinder initFinder()
>>>>>>     {
>>>>>>@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
>>>>>>             return finder;
>>>>>>         }
>>>>>>
>>>>>>-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
>>>>>>         if (beanArchiveService == null)
>>>>>>         {
>>>>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>>>>         }
>>>>>>
>>>>>>-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
>>>>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>>>>getBeanDeploymentUrls());
>>>>>>-        finder = new AnnotationFinder(archive);
>>>>>>+        archive = new CdiArchive(beanArchiveService,
>>>>>>WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
>>>>>>+        finder = new OwbAnnotationFinder(archive);
>>>>>>
>>>>>>         return finder;
>>>>>>     }
>>>>>>@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
>>>>>>                 path.contains("/idea_rt") ||
>>>>>>                 path.contains("/eclipse") ||
>>>>>>                 path.contains("/jcommander") ||
>>>>>>+                path.contains("/tomcat") ||
>>>>>>+                path.contains("/catalina") ||
>>>>>>+                path.contains("/jasper") ||
>>>>>>+                path.contains("/jsp-api") ||
>>>>>>+                path.contains("/myfaces-") ||
>>>>>>+                path.contains("/servlet-api") ||
>>>>>>+                path.contains("/javax") ||
>>>>>>+                path.contains("/annotation-api") ||
>>>>>>+                path.contains("/el-api") ||
>>>>>>+                path.contains("/mojarra") ||
>>>>>>                 path.contains("/openwebbeans-"))
>>>>>>             {
>>>>>>                 //X TODO this should be much more actually
>>>>>>@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
>>>>>>         // and also scan the bean archive!
>>>>>>         if (beanArchiveService == null)
>>>>>>         {
>>>>>>-            WebBeansContext webBeansContext =
>>>>>>WebBeansContext.getInstance();
>>>>>>+
>>>>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>>>>         }
>>>>>>
>>>>>>@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
>>>>>>     public Set<Class<?>> getBeanClasses()
>>>>>>     {
>>>>>>         final Set<Class<?>> classSet = new HashSet<Class<?>>();
>>>>>>-        for(String str : archive.getClasses())
>>>>>>+        for (CdiArchive.FoundClasses foundClasses :
>>>>>>archive.classesByUrl().values())
>>>>>>         {
>>>>>>-            try
>>>>>>+            boolean scanModeAnnotated =
>>>>>>BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
>>>>>>+            for(String className : foundClasses.getClassNames())
>>>>>>             {
>>>>>>-                Class<?> clazz = ClassUtil.getClassFromName(str);
>>>>>>-                if (clazz != null)
>>>>>>+                try
>>>>>>                 {
>>>>>>+                    if (scanModeAnnotated)
>>>>>>+                    {
>>>>>>+                        // in this case we need to find out whether we
>>>>>>should keep this class in the Archive
>>>>>>+                        AnnotationFinder.ClassInfo classInfo =
>>>>>>finder.getClassInfo(className);
>>>>>>+                        if (classInfo == null ||
>>>>>>!isBeanAnnotatedClass(classInfo))
>>>>>>+                        {
>>>>>>+                            continue;
>>>>>>+                        }
>>>>>>+                    }
>>>>>>
>>>>>>-                    // try to provoke a NoClassDefFoundError exception
>>>>>>which is thrown
>>>>>>-                    // if some dependencies of the class are missing
>>>>>>-                    clazz.getDeclaredFields();
>>>>>>-                    clazz.getDeclaredMethods();
>>>>>>+                    Class<?> clazz = ClassUtil.getClassFromName(className);
>>>>>>+                    if (clazz != null)
>>>>>>+                    {
>>>>>>+
>>>>>>+                        // try to provoke a NoClassDefFoundError exception
>>>>>>which is thrown
>>>>>>+                        // if some dependencies of the class are missing
>>>>>>+                        clazz.getDeclaredFields();
>>>>>>+                        clazz.getDeclaredMethods();
>>>>>>
>>>>>>-                    // we can add this class cause it has been loaded
>>>>>>completely
>>>>>>-                    classSet.add(clazz);
>>>>>>+                        // we can add this class cause it has been loaded
>>>>>>completely
>>>>>>+                        classSet.add(clazz);
>>>>>>
>>>>>>+                    }
>>>>>>                 }
>>>>>>-            }
>>>>>>-            catch (NoClassDefFoundError e)
>>>>>>-            {
>>>>>>-                if (logger.isLoggable(Level.WARNING))
>>>>>>+                catch (NoClassDefFoundError e)
>>>>>>                 {
>>>>>>-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
>>>>>>Object[] { str, e.toString() });
>>>>>>+                    if (logger.isLoggable(Level.WARNING))
>>>>>>+                    {
>>>>>>+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
>>>>>>new Object[] { className, e.toString() });
>>>>>>+                    }
>>>>>>                 }
>>>>>>             }
>>>>>>+
>>>>>>         }
>>>>>>
>>>>>>         return classSet;
>>>>>>     }
>>>>>>
>>>>>>+    /**
>>>>>>+     * This method is called for classes from bean archives with
>>>>>>+     * bean-discovery-mode 'annotated'.
>>>>>>+     *
>>>>>>+     * This method is intended to be overwritten in integration scenarios
>>>>>>and e.g.
>>>>>>+     * allows to add other criterias for keeping the class.
>>>>>>+     *
>>>>>>+     * @param classInfo
>>>>>>+     * @return true if this class should be kept and further get picked up
>>>>>>as CDI Bean
>>>>>>+     */
>>>>>>+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
>>>>>>classInfo)
>>>>>>+    {
>>>>>>+        // check whether this class has 'scope' annotations or a stereotype
>>>>>>+        for (AnnotationFinder.AnnotationInfo annotationInfo :
>>>>>>classInfo.getAnnotations())
>>>>>>+        {
>>>>>>+            if (isBeanAnnotation(annotationInfo))
>>>>>>+            {
>>>>>>+                return true;
>>>>>>+            }
>>>>>>+        }
>>>>>>+        return false;
>>>>>>+    }
>>>>>>+
>>>>>>+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
>>>>>>annotationInfo)
>>>>>>+    {
>>>>>>+        String annotationName = annotationInfo.getName();
>>>>>>+
>>>>>>+        // TODO add caches
>>>>>>+
>>>>>>+        try
>>>>>>+        {
>>>>>>+            Class<? extends Annotation> annotationType = (Class<? extends
>>>>>>Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
>>>>>>+            boolean isBeanAnnotation =
>>>>>>webBeansContext.getBeanManagerImpl().isScope(annotationType);
>>>>>>+            isBeanAnnotation = isBeanAnnotation ||
>>>>>>webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
>>>>>>+
>>>>>>+            return isBeanAnnotation;
>>>>>>+        }
>>>>>>+        catch (ClassNotFoundException e)
>>>>>>+        {
>>>>>>+            return false;
>>>>>>+        }
>>>>>>+    }
>>>>>>+
>>>>>>
>>>>>>     @Override
>>>>>>     public Set<URL> getBeanXmls()
>>>>>>
>>>>>>Modified:
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>>URL:
>>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>>==============================================================================
>>>>>>---
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>>(original)
>>>>>>+++
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>>Sun Feb  9 22:23:28 2014
>>>>>>@@ -18,11 +18,8 @@
>>>>>>  */
>>>>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>>>>
>>>>>>-import java.lang.annotation.Annotation;
>>>>>>import java.util.List;
>>>>>>-import java.util.Set;
>>>>>>
>>>>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>>>>import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>>>>import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>>>>import org.apache.xbean.finder.filter.Filter;
>>>>>>@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
>>>>>>  */
>>>>>>public class BeanArchiveFilter implements Filter
>>>>>>{
>>>>>>-    private final ClassLoader loader;
>>>>>>-    private final BeanManagerImpl beanManager;
>>>>>>     private final BeanArchiveInformation beanArchiveInfo;
>>>>>>-    private final boolean scanAll;
>>>>>>     private final boolean scanNone;
>>>>>>-    private final boolean scanAnnotated;
>>>>>>
>>>>>>     private List<String> urlClasses;
>>>>>>-    private Set<String> allClasses;
>>>>>>
>>>>>>-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
>>>>>>beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
>>>>>>urlClasses, Set<String> allClasses)
>>>>>>+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
>>>>>>List<String> urlClasses)
>>>>>>     {
>>>>>>-        this.loader = loader;
>>>>>>-        this.beanManager = beanManager;
>>>>>>         this.beanArchiveInfo = beanArchiveInfo;
>>>>>>         this.urlClasses = urlClasses;
>>>>>>-        this.allClasses = allClasses;
>>>>>>         BeanDiscoveryMode discoveryMode =
>>>>>>beanArchiveInfo.getBeanDiscoveryMode();
>>>>>>
>>>>>>-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
>>>>>>         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
>>>>>>-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
>>>>>>     }
>>>>>>
>>>>>>     @Override
>>>>>>@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
>>>>>>             return false;
>>>>>>         }
>>>>>>
>>>>>>-        if (scanAll)
>>>>>>-        {
>>>>>>-            urlClasses.add(name);
>>>>>>-            allClasses.add(name);
>>>>>>-            return true;
>>>>>>-        }
>>>>>>-
>>>>>>-        if (scanAnnotated)
>>>>>>-        {
>>>>>>-            try
>>>>>>-            {
>>>>>>-                Class clazz = Class.forName(name, false, loader);
>>>>>>-                if (!hasScopeAnnotation(clazz.getAnnotations()))
>>>>>>-                {
>>>>>>-                    return false;
>>>>>>-                }
>>>>>>-            }
>>>>>>-            catch (ClassNotFoundException cnfe)
>>>>>>-            {
>>>>>>-                // not a problem, just ignore this class
>>>>>>-                return false;
>>>>>>-            }
>>>>>>-            catch (NoClassDefFoundError ncdf)
>>>>>>-            {
>>>>>>-                // not a problem, just ignore this class
>>>>>>-                return false;
>>>>>>-            }
>>>>>>-
>>>>>>             urlClasses.add(name);
>>>>>>-            allClasses.add(name);
>>>>>>             return true;
>>>>>>-        }
>>>>>>-
>>>>>>-        return false;
>>>>>>     }
>>>>>>
>>>>>>-    private boolean hasScopeAnnotation(Annotation[] annotations)
>>>>>>-    {
>>>>>>-        for (Annotation annotation : annotations)
>>>>>>-        {
>>>>>>-            if (beanManager.isScope(annotation.annotationType()))
>>>>>>-            {
>>>>>>-                return true;
>>>>>>-            }
>>>>>>-        }
>>>>>>-        return false;
>>>>>>-    }
>>>>>>}
>>>>>>
>>>>>>Modified:
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>>URL:
>>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>>==============================================================================
>>>>>>---
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>>(original)
>>>>>>+++
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>>Sun Feb  9 22:23:28 2014
>>>>>>@@ -18,14 +18,12 @@
>>>>>>  */
>>>>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>>>>
>>>>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>>>>import org.apache.xbean.finder.archive.Archive;
>>>>>>-import org.apache.xbean.finder.archive.ClassesArchive;
>>>>>>import org.apache.xbean.finder.archive.ClasspathArchive;
>>>>>>import org.apache.xbean.finder.archive.CompositeArchive;
>>>>>>import org.apache.xbean.finder.archive.FilteredArchive;
>>>>>>-import org.apache.xbean.finder.filter.Filter;
>>>>>>
>>>>>>import java.io.IOException;
>>>>>>import java.io.InputStream;
>>>>>>@@ -33,11 +31,9 @@ import java.net.URL;
>>>>>>import java.util.ArrayList;
>>>>>>import java.util.Collection;
>>>>>>import java.util.HashMap;
>>>>>>-import java.util.HashSet;
>>>>>>import java.util.Iterator;
>>>>>>import java.util.List;
>>>>>>import java.util.Map;
>>>>>>-import java.util.Set;
>>>>>>
>>>>>>/**
>>>>>>  * this delegate pattern is interesting
>>>>>>@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
>>>>>>      */
>>>>>>     private final Map<String, FoundClasses> classesByUrl = new
>>>>>>HashMap<String, FoundClasses>();
>>>>>>
>>>>>>-    private final Set<String> allClasses = new HashSet<String>();
>>>>>>     private final Archive delegate;
>>>>>>
>>>>>>-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
>>>>>>beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
>>>>>>+    public CdiArchive(BeanArchiveService beanArchiveService, final
>>>>>>ClassLoader loader, final Map<String, URL> urls)
>>>>>>     {
>>>>>>         final Collection<Archive> archives = new ArrayList<Archive>();
>>>>>>         for (final URL url : urls.values())
>>>>>>         {
>>>>>>             final List<String> urlClasses = new ArrayList<String>();
>>>>>>
>>>>>>-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
>>>>>>beanArchiveService.getBeanArchiveInformation(url);
>>>>>>+            BeanArchiveInformation beanArchiveInfo =
>>>>>>beanArchiveService.getBeanArchiveInformation(url);
>>>>>>             final Archive archive = new
>>>>>>FilteredArchive(ClasspathArchive.archive(loader, url),
>>>>>>-                    new BeanArchiveFilter(loader, beanManager,
>>>>>>beanArchiveInfo, urlClasses, allClasses));
>>>>>>+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
>>>>>>
>>>>>>-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>>>>urlClasses));
>>>>>>+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>>>>urlClasses, beanArchiveInfo));
>>>>>>             archives.add(archive);
>>>>>>         }
>>>>>>
>>>>>>         delegate = new CompositeArchive(archives);
>>>>>>     }
>>>>>>
>>>>>>-    public CdiArchive(final Collection<Class<?>> classList)
>>>>>>-    {
>>>>>>-        delegate = new FilteredArchive(new ClassesArchive(classList), new
>>>>>>Filter()
>>>>>>-        {
>>>>>>-            @Override
>>>>>>-            public boolean accept(final String name)
>>>>>>-            {
>>>>>>-                allClasses.add(name);
>>>>>>-                return true;
>>>>>>-            }
>>>>>>-        });
>>>>>>-    }
>>>>>>-
>>>>>>-    public Set<String> getClasses()
>>>>>>-    {
>>>>>>-        return allClasses;
>>>>>>-    }
>>>>>>-
>>>>>>     public Map<String, FoundClasses> classesByUrl()
>>>>>>     {
>>>>>>         return classesByUrl;
>>>>>>@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
>>>>>>     {
>>>>>>         private URL url;
>>>>>>         private Collection<String> classNames;
>>>>>>+        private BeanArchiveInformation beanArchiveInfo;
>>>>>>
>>>>>>-        public FoundClasses(URL url, Collection<String> classNames)
>>>>>>+        public FoundClasses(URL url, Collection<String> classNames,
>>>>>>BeanArchiveInformation beanArchiveInfo)
>>>>>>         {
>>>>>>             this.url = url;
>>>>>>             this.classNames = classNames;
>>>>>>+            this.beanArchiveInfo = beanArchiveInfo;
>>>>>>         }
>>>>>>
>>>>>>         public URL getUrl()
>>>>>>@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
>>>>>>             return url;
>>>>>>         }
>>>>>>
>>>>>>+        public BeanArchiveInformation getBeanArchiveInfo()
>>>>>>+        {
>>>>>>+            return beanArchiveInfo;
>>>>>>+        }
>>>>>>+
>>>>>>         public Collection<String> getClassNames()
>>>>>>         {
>>>>>>             return classNames;
>>>>>>
>>>>>>Added:
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>>URL:
>>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
>>>>>>==============================================================================
>>>>>>---
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>>(added)
>>>>>>+++
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>>Sun Feb  9 22:23:28 2014
>>>>>>@@ -0,0 +1,45 @@
>>>>>>+/*
>>>>>>+ * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>+ * or more contributor license agreements. See the NOTICE file
>>>>>>+ * distributed with this work for additional information
>>>>>>+ * regarding copyright ownership. The ASF licenses this file
>>>>>>+ * to you under the Apache License, Version 2.0 (the
>>>>>>+ * "License"); you may not use this file except in compliance
>>>>>>+ * with the License. You may obtain a copy of the License at
>>>>>>+ *
>>>>>>+ * http://www.apache.org/licenses/LICENSE-2.0
>>>>>>+ *
>>>>>>+ * Unless required by applicable law or agreed to in writing,
>>>>>>+ * software distributed under the License is distributed on an
>>>>>>+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>+ * KIND, either express or implied. See the License for the
>>>>>>+ * specific language governing permissions and limitations
>>>>>>+ * under the License.
>>>>>>+ */
>>>>>>+package org.apache.webbeans.corespi.scanner.xbean;
>>>>>>+
>>>>>>+import org.apache.xbean.finder.AnnotationFinder;
>>>>>>+import org.apache.xbean.finder.archive.Archive;
>>>>>>+
>>>>>>+/**
>>>>>>+ * We just extend the default AnnotationFinder to get Access to the
>>>>>>original ClassInfo
>>>>>>+ * for not having to call loadClass so often...
>>>>>>+ */
>>>>>>+public class OwbAnnotationFinder extends AnnotationFinder
>>>>>>+{
>>>>>>+    public OwbAnnotationFinder(Archive archive, boolean
>>>>>>checkRuntimeAnnotation)
>>>>>>+    {
>>>>>>+        super(archive, checkRuntimeAnnotation);
>>>>>>+    }
>>>>>>+
>>>>>>+    public OwbAnnotationFinder(Archive archive)
>>>>>>+    {
>>>>>>+        super(archive);
>>>>>>+    }
>>>>>>+
>>>>>>+    public ClassInfo getClassInfo(String className)
>>>>>>+    {
>>>>>>+        return classInfos.get(className);
>>>>>>+    }
>>>>>>+
>>>>>>+}
>>>>>>
>>>>>>Modified:
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>>URL:
>>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>>==============================================================================
>>>>>>---
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>>(original)
>>>>>>+++
>>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>>Sun Feb  9 22:23:28 2014
>>>>>>@@ -19,14 +19,14 @@
>>>>>>package org.apache.webbeans.lifecycle.test;
>>>>>>
>>>>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>>>>import org.apache.webbeans.util.Asserts;
>>>>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>>>>
>>>>>>import java.net.MalformedURLException;
>>>>>>import java.net.URL;
>>>>>>import java.util.Collection;
>>>>>>+import java.util.HashSet;
>>>>>>+import java.util.Set;
>>>>>>
>>>>>>/**
>>>>>>  * Used by each test.
>>>>>>@@ -35,15 +35,18 @@ import java.util.Collection;
>>>>>>  */
>>>>>>public class OpenWebBeansTestMetaDataDiscoveryService extends
>>>>>>AbstractMetaDataDiscovery
>>>>>>{
>>>>>>+
>>>>>>+    private Collection<Class<?>> classes;
>>>>>>+
>>>>>>     public OpenWebBeansTestMetaDataDiscoveryService()
>>>>>>     {
>>>>>>-
>>>>>>+        super();
>>>>>>     }
>>>>>>
>>>>>>     @Override
>>>>>>     protected void configure()
>>>>>>     {
>>>>>>-        //Nothing we scan
>>>>>>+        // Nothing to scan, we add all our stuff manually...
>>>>>>     }
>>>>>>
>>>>>>     /**
>>>>>>@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
>>>>>>      */
>>>>>>     public void deployClasses(Collection<Class<?>> classes)
>>>>>>     {
>>>>>>-        if(classes != null)
>>>>>>-        {
>>>>>>-            archive = new CdiArchive(classes);
>>>>>>-            finder = new AnnotationFinder(archive);
>>>>>>-        }
>>>>>>+        this.classes = classes;
>>>>>>     }
>>>>>>-
>>>>>>+
>>>>>>+    @Override
>>>>>>+    public Set<Class<?>> getBeanClasses()
>>>>>>+    {
>>>>>>+        return new HashSet<Class<?>>(classes);
>>>>>>+    }
>>>>>>+
>>>>>>     /**
>>>>>>      * Those xmls will be scanned by container.
>>>>>>      * @param xmls beans xmls
>>>>>>@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
>>>>>>
>>>>>>         addWebBeansXmlLocation(url);
>>>>>>     }
>>>>>>-
>>>>>>
>>>>>>}
>>>>>>
>>>>>>Modified:
>>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>>URL:
>>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>>==============================================================================
>>>>>>---
>>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>>(original)
>>>>>>+++
>>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>>Sun Feb  9 22:23:28 2014
>>>>>>@@ -18,14 +18,11 @@
>>>>>>  */
>>>>>>package org.apache.webbeans.web.scanner;
>>>>>>
>>>>>>-import org.apache.webbeans.config.WebBeansContext;
>>>>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>>>import org.apache.webbeans.util.ExceptionUtil;
>>>>>>import org.apache.webbeans.util.WebBeansUtil;
>>>>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>>>>
>>>>>>import javax.servlet.ServletContext;
>>>>>>import java.net.MalformedURLException;
>>>>>>@@ -50,17 +47,6 @@ public class WebScannerService extends A
>>>>>>     }
>>>>>>
>>>>>>     @Override
>>>>>>-    protected AnnotationFinder initFinder()
>>>>>>-    {
>>>>>>-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
>>>>>>-        beanArchiveService = webbeansContext.getBeanArchiveService();
>>>>>>-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
>>>>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>>>>getBeanDeploymentUrls());
>>>>>>-        finder = new AnnotationFinder(archive);
>>>>>>-
>>>>>>-        return finder;
>>>>>>-    }
>>>>>>-
>>>>>>-    @Override
>>>>>>     public void init(Object context)
>>>>>>     {
>>>>>>         super.init(context);
>>>>>>
>>>>>>
>>>>
>>>>
>>
>>

Re: Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Mark Struberg <st...@yahoo.de>.
I thought about that as well. I need to dig a bit into the tomee codebase. I used quite a few tricks to get a good performance. 
What to do next? 
I'd say we focus on the owb-1.2.2 release for tomee 1.6.1 and then continue with integrating owb-2.0.0 in tomee.

LieGrue,
strub





On Monday, 10 February 2014, 8:35, Romain Manni-Bucau <rm...@gmail.com> wrote:
 
wonder if we could merge somehow openejb and openwebbeans scanning
>filtering. OpenEJB/TomEE one is really nice and efficient (even if
>sometimes code can seem a bit rough).
>
>Maybe something to finally put in XBean?
>Romain Manni-Bucau
>Twitter: @rmannibucau
>Blog: http://rmannibucau.wordpress.com/
>LinkedIn: http://fr.linkedin.com/in/rmannibucau
>Github: https://github.com/rmannibucau
>
>
>
>2014-02-10 8:27 GMT+01:00 Mark Struberg <st...@yahoo.de>:
>> It's basically a complete re-implementation of our scanning mechanism.
>> We still provide and consume the same ScannerService SPI yet though.
>>
>> But I'm about to change this and try to introduce something more smart probably. Still thinking about it.
>>
>> LieGrue,
>> strub
>>
>>
>>
>>
>>
>> On Monday, 10 February 2014, 8:24, Romain Manni-Bucau <rm...@gmail.com> wrote:
>>
>> Great, got a doubt after months without touching it, thks :)
>>>Romain Manni-Bucau
>>>Twitter: @rmannibucau
>>>Blog: http://rmannibucau.wordpress.com/
>>>LinkedIn: http://fr.linkedin.com/in/rmannibucau
>>>Github: https://github.com/rmannibucau
>>>
>>>
>>>
>>>2014-02-10 8:09 GMT+01:00 Mark Struberg <st...@yahoo.de>:
>>>> I also did test this on windows and it works.
>>>> Reason is that thi are URL.toExternalPath, which always use forward slashes on all platforms to my knowledge.
>>>>
>>>> Now we have no single new URL(...) anymore in our code.
>>>>
>>>> LieGrue,
>>>> strub
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Monday, 10 February 2014, 7:07, Romain Manni-Bucau <rm...@gmail.com> wrote:
>>>>
>>>> Hi Mark
>>>>>
>>>>>Will it work on windows or /xxx will not match?
>>>>>---------- Message transféré ----------
>>>>>De : <st...@apache.org>
>>>>>Date : 9 févr. 2014 23:23
>>>>>Objet : svn commit: r1566452 - in /openwebbeans/trunk:
>>>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
>>>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
>>>>>webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
>>>>>À : <co...@openwebbeans.apache.org>
>>>>>
>>>>>Author: struberg
>>>>>Date: Sun Feb  9 22:23:28 2014
>>>>>New Revision: 1566452
>>>>>
>>>>>URL: http://svn.apache.org/r1566452
>>>>>Log:
>>>>>OWB-928 improve scanning performance
>>>>>
>>>>>We now take the annotation information from ASM and don't do a
>>>>>loadClass...getAnnotations anymore
>>>>>
>>>>>Added:
>>>>>
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>Modified:
>>>>>
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>
>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>
>>>>>Modified:
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>URL:
>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>==============================================================================
>>>>>---
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>(original)
>>>>>+++
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>>Sun Feb  9 22:23:28 2014
>>>>>@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
>>>>>import org.apache.webbeans.config.OpenWebBeansConfiguration;
>>>>>import org.apache.webbeans.config.WebBeansContext;
>>>>>import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>>+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
>>>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>>>import org.apache.webbeans.spi.BDABeansXmlScanner;
>>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>>>import org.apache.webbeans.spi.ScannerService;
>>>>>import org.apache.webbeans.util.ClassUtil;
>>>>>import org.apache.webbeans.util.UrlSet;
>>>>>@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
>>>>>import org.apache.xbean.finder.ClassLoaders;
>>>>>
>>>>>import java.io.IOException;
>>>>>+import java.lang.annotation.Annotation;
>>>>>import java.net.URL;
>>>>>import java.util.Collections;
>>>>>import java.util.Enumeration;
>>>>>@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
>>>>>
>>>>>     protected ClassLoader loader;
>>>>>     protected CdiArchive archive;
>>>>>-    protected AnnotationFinder finder;
>>>>>+    protected OwbAnnotationFinder finder;
>>>>>     protected boolean isBDAScannerEnabled = false;
>>>>>     protected BDABeansXmlScanner bdaBeansXmlScanner;
>>>>>+    protected final WebBeansContext webBeansContext;
>>>>>
>>>>>
>>>>>+    protected AbstractMetaDataDiscovery()
>>>>>+    {
>>>>>+        webBeansContext = WebBeansContext.getInstance();
>>>>>+    }
>>>>>
>>>>>     protected AnnotationFinder initFinder()
>>>>>     {
>>>>>@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
>>>>>             return finder;
>>>>>         }
>>>>>
>>>>>-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
>>>>>         if (beanArchiveService == null)
>>>>>         {
>>>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>>>         }
>>>>>
>>>>>-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
>>>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>>>getBeanDeploymentUrls());
>>>>>-        finder = new AnnotationFinder(archive);
>>>>>+        archive = new CdiArchive(beanArchiveService,
>>>>>WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
>>>>>+        finder = new OwbAnnotationFinder(archive);
>>>>>
>>>>>         return finder;
>>>>>     }
>>>>>@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
>>>>>                 path.contains("/idea_rt") ||
>>>>>                 path.contains("/eclipse") ||
>>>>>                 path.contains("/jcommander") ||
>>>>>+                path.contains("/tomcat") ||
>>>>>+                path.contains("/catalina") ||
>>>>>+                path.contains("/jasper") ||
>>>>>+                path.contains("/jsp-api") ||
>>>>>+                path.contains("/myfaces-") ||
>>>>>+                path.contains("/servlet-api") ||
>>>>>+                path.contains("/javax") ||
>>>>>+                path.contains("/annotation-api") ||
>>>>>+                path.contains("/el-api") ||
>>>>>+                path.contains("/mojarra") ||
>>>>>                 path.contains("/openwebbeans-"))
>>>>>             {
>>>>>                 //X TODO this should be much more actually
>>>>>@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
>>>>>         // and also scan the bean archive!
>>>>>         if (beanArchiveService == null)
>>>>>         {
>>>>>-            WebBeansContext webBeansContext =
>>>>>WebBeansContext.getInstance();
>>>>>+
>>>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>>>         }
>>>>>
>>>>>@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
>>>>>     public Set<Class<?>> getBeanClasses()
>>>>>     {
>>>>>         final Set<Class<?>> classSet = new HashSet<Class<?>>();
>>>>>-        for(String str : archive.getClasses())
>>>>>+        for (CdiArchive.FoundClasses foundClasses :
>>>>>archive.classesByUrl().values())
>>>>>         {
>>>>>-            try
>>>>>+            boolean scanModeAnnotated =
>>>>>BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
>>>>>+            for(String className : foundClasses.getClassNames())
>>>>>             {
>>>>>-                Class<?> clazz = ClassUtil.getClassFromName(str);
>>>>>-                if (clazz != null)
>>>>>+                try
>>>>>                 {
>>>>>+                    if (scanModeAnnotated)
>>>>>+                    {
>>>>>+                        // in this case we need to find out whether we
>>>>>should keep this class in the Archive
>>>>>+                        AnnotationFinder.ClassInfo classInfo =
>>>>>finder.getClassInfo(className);
>>>>>+                        if (classInfo == null ||
>>>>>!isBeanAnnotatedClass(classInfo))
>>>>>+                        {
>>>>>+                            continue;
>>>>>+                        }
>>>>>+                    }
>>>>>
>>>>>-                    // try to provoke a NoClassDefFoundError exception
>>>>>which is thrown
>>>>>-                    // if some dependencies of the class are missing
>>>>>-                    clazz.getDeclaredFields();
>>>>>-                    clazz.getDeclaredMethods();
>>>>>+                    Class<?> clazz = ClassUtil.getClassFromName(className);
>>>>>+                    if (clazz != null)
>>>>>+                    {
>>>>>+
>>>>>+                        // try to provoke a NoClassDefFoundError exception
>>>>>which is thrown
>>>>>+                        // if some dependencies of the class are missing
>>>>>+                        clazz.getDeclaredFields();
>>>>>+                        clazz.getDeclaredMethods();
>>>>>
>>>>>-                    // we can add this class cause it has been loaded
>>>>>completely
>>>>>-                    classSet.add(clazz);
>>>>>+                        // we can add this class cause it has been loaded
>>>>>completely
>>>>>+                        classSet.add(clazz);
>>>>>
>>>>>+                    }
>>>>>                 }
>>>>>-            }
>>>>>-            catch (NoClassDefFoundError e)
>>>>>-            {
>>>>>-                if (logger.isLoggable(Level.WARNING))
>>>>>+                catch (NoClassDefFoundError e)
>>>>>                 {
>>>>>-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
>>>>>Object[] { str, e.toString() });
>>>>>+                    if (logger.isLoggable(Level.WARNING))
>>>>>+                    {
>>>>>+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
>>>>>new Object[] { className, e.toString() });
>>>>>+                    }
>>>>>                 }
>>>>>             }
>>>>>+
>>>>>         }
>>>>>
>>>>>         return classSet;
>>>>>     }
>>>>>
>>>>>+    /**
>>>>>+     * This method is called for classes from bean archives with
>>>>>+     * bean-discovery-mode 'annotated'.
>>>>>+     *
>>>>>+     * This method is intended to be overwritten in integration scenarios
>>>>>and e.g.
>>>>>+     * allows to add other criterias for keeping the class.
>>>>>+     *
>>>>>+     * @param classInfo
>>>>>+     * @return true if this class should be kept and further get picked up
>>>>>as CDI Bean
>>>>>+     */
>>>>>+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
>>>>>classInfo)
>>>>>+    {
>>>>>+        // check whether this class has 'scope' annotations or a stereotype
>>>>>+        for (AnnotationFinder.AnnotationInfo annotationInfo :
>>>>>classInfo.getAnnotations())
>>>>>+        {
>>>>>+            if (isBeanAnnotation(annotationInfo))
>>>>>+            {
>>>>>+                return true;
>>>>>+            }
>>>>>+        }
>>>>>+        return false;
>>>>>+    }
>>>>>+
>>>>>+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
>>>>>annotationInfo)
>>>>>+    {
>>>>>+        String annotationName = annotationInfo.getName();
>>>>>+
>>>>>+        // TODO add caches
>>>>>+
>>>>>+        try
>>>>>+        {
>>>>>+            Class<? extends Annotation> annotationType = (Class<? extends
>>>>>Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
>>>>>+            boolean isBeanAnnotation =
>>>>>webBeansContext.getBeanManagerImpl().isScope(annotationType);
>>>>>+            isBeanAnnotation = isBeanAnnotation ||
>>>>>webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
>>>>>+
>>>>>+            return isBeanAnnotation;
>>>>>+        }
>>>>>+        catch (ClassNotFoundException e)
>>>>>+        {
>>>>>+            return false;
>>>>>+        }
>>>>>+    }
>>>>>+
>>>>>
>>>>>     @Override
>>>>>     public Set<URL> getBeanXmls()
>>>>>
>>>>>Modified:
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>URL:
>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>==============================================================================
>>>>>---
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>(original)
>>>>>+++
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>>Sun Feb  9 22:23:28 2014
>>>>>@@ -18,11 +18,8 @@
>>>>>  */
>>>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>>>
>>>>>-import java.lang.annotation.Annotation;
>>>>>import java.util.List;
>>>>>-import java.util.Set;
>>>>>
>>>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>>>import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>>>import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>>>import org.apache.xbean.finder.filter.Filter;
>>>>>@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
>>>>>  */
>>>>>public class BeanArchiveFilter implements Filter
>>>>>{
>>>>>-    private final ClassLoader loader;
>>>>>-    private final BeanManagerImpl beanManager;
>>>>>     private final BeanArchiveInformation beanArchiveInfo;
>>>>>-    private final boolean scanAll;
>>>>>     private final boolean scanNone;
>>>>>-    private final boolean scanAnnotated;
>>>>>
>>>>>     private List<String> urlClasses;
>>>>>-    private Set<String> allClasses;
>>>>>
>>>>>-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
>>>>>beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
>>>>>urlClasses, Set<String> allClasses)
>>>>>+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
>>>>>List<String> urlClasses)
>>>>>     {
>>>>>-        this.loader = loader;
>>>>>-        this.beanManager = beanManager;
>>>>>         this.beanArchiveInfo = beanArchiveInfo;
>>>>>         this.urlClasses = urlClasses;
>>>>>-        this.allClasses = allClasses;
>>>>>         BeanDiscoveryMode discoveryMode =
>>>>>beanArchiveInfo.getBeanDiscoveryMode();
>>>>>
>>>>>-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
>>>>>         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
>>>>>-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
>>>>>     }
>>>>>
>>>>>     @Override
>>>>>@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
>>>>>             return false;
>>>>>         }
>>>>>
>>>>>-        if (scanAll)
>>>>>-        {
>>>>>-            urlClasses.add(name);
>>>>>-            allClasses.add(name);
>>>>>-            return true;
>>>>>-        }
>>>>>-
>>>>>-        if (scanAnnotated)
>>>>>-        {
>>>>>-            try
>>>>>-            {
>>>>>-                Class clazz = Class.forName(name, false, loader);
>>>>>-                if (!hasScopeAnnotation(clazz.getAnnotations()))
>>>>>-                {
>>>>>-                    return false;
>>>>>-                }
>>>>>-            }
>>>>>-            catch (ClassNotFoundException cnfe)
>>>>>-            {
>>>>>-                // not a problem, just ignore this class
>>>>>-                return false;
>>>>>-            }
>>>>>-            catch (NoClassDefFoundError ncdf)
>>>>>-            {
>>>>>-                // not a problem, just ignore this class
>>>>>-                return false;
>>>>>-            }
>>>>>-
>>>>>             urlClasses.add(name);
>>>>>-            allClasses.add(name);
>>>>>             return true;
>>>>>-        }
>>>>>-
>>>>>-        return false;
>>>>>     }
>>>>>
>>>>>-    private boolean hasScopeAnnotation(Annotation[] annotations)
>>>>>-    {
>>>>>-        for (Annotation annotation : annotations)
>>>>>-        {
>>>>>-            if (beanManager.isScope(annotation.annotationType()))
>>>>>-            {
>>>>>-                return true;
>>>>>-            }
>>>>>-        }
>>>>>-        return false;
>>>>>-    }
>>>>>}
>>>>>
>>>>>Modified:
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>URL:
>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>==============================================================================
>>>>>---
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>(original)
>>>>>+++
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>>Sun Feb  9 22:23:28 2014
>>>>>@@ -18,14 +18,12 @@
>>>>>  */
>>>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>>>
>>>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>>>import org.apache.xbean.finder.archive.Archive;
>>>>>-import org.apache.xbean.finder.archive.ClassesArchive;
>>>>>import org.apache.xbean.finder.archive.ClasspathArchive;
>>>>>import org.apache.xbean.finder.archive.CompositeArchive;
>>>>>import org.apache.xbean.finder.archive.FilteredArchive;
>>>>>-import org.apache.xbean.finder.filter.Filter;
>>>>>
>>>>>import java.io.IOException;
>>>>>import java.io.InputStream;
>>>>>@@ -33,11 +31,9 @@ import java.net.URL;
>>>>>import java.util.ArrayList;
>>>>>import java.util.Collection;
>>>>>import java.util.HashMap;
>>>>>-import java.util.HashSet;
>>>>>import java.util.Iterator;
>>>>>import java.util.List;
>>>>>import java.util.Map;
>>>>>-import java.util.Set;
>>>>>
>>>>>/**
>>>>>  * this delegate pattern is interesting
>>>>>@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
>>>>>      */
>>>>>     private final Map<String, FoundClasses> classesByUrl = new
>>>>>HashMap<String, FoundClasses>();
>>>>>
>>>>>-    private final Set<String> allClasses = new HashSet<String>();
>>>>>     private final Archive delegate;
>>>>>
>>>>>-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
>>>>>beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
>>>>>+    public CdiArchive(BeanArchiveService beanArchiveService, final
>>>>>ClassLoader loader, final Map<String, URL> urls)
>>>>>     {
>>>>>         final Collection<Archive> archives = new ArrayList<Archive>();
>>>>>         for (final URL url : urls.values())
>>>>>         {
>>>>>             final List<String> urlClasses = new ArrayList<String>();
>>>>>
>>>>>-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
>>>>>beanArchiveService.getBeanArchiveInformation(url);
>>>>>+            BeanArchiveInformation beanArchiveInfo =
>>>>>beanArchiveService.getBeanArchiveInformation(url);
>>>>>             final Archive archive = new
>>>>>FilteredArchive(ClasspathArchive.archive(loader, url),
>>>>>-                    new BeanArchiveFilter(loader, beanManager,
>>>>>beanArchiveInfo, urlClasses, allClasses));
>>>>>+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
>>>>>
>>>>>-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>>>urlClasses));
>>>>>+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>>>urlClasses, beanArchiveInfo));
>>>>>             archives.add(archive);
>>>>>         }
>>>>>
>>>>>         delegate = new CompositeArchive(archives);
>>>>>     }
>>>>>
>>>>>-    public CdiArchive(final Collection<Class<?>> classList)
>>>>>-    {
>>>>>-        delegate = new FilteredArchive(new ClassesArchive(classList), new
>>>>>Filter()
>>>>>-        {
>>>>>-            @Override
>>>>>-            public boolean accept(final String name)
>>>>>-            {
>>>>>-                allClasses.add(name);
>>>>>-                return true;
>>>>>-            }
>>>>>-        });
>>>>>-    }
>>>>>-
>>>>>-    public Set<String> getClasses()
>>>>>-    {
>>>>>-        return allClasses;
>>>>>-    }
>>>>>-
>>>>>     public Map<String, FoundClasses> classesByUrl()
>>>>>     {
>>>>>         return classesByUrl;
>>>>>@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
>>>>>     {
>>>>>         private URL url;
>>>>>         private Collection<String> classNames;
>>>>>+        private BeanArchiveInformation beanArchiveInfo;
>>>>>
>>>>>-        public FoundClasses(URL url, Collection<String> classNames)
>>>>>+        public FoundClasses(URL url, Collection<String> classNames,
>>>>>BeanArchiveInformation beanArchiveInfo)
>>>>>         {
>>>>>             this.url = url;
>>>>>             this.classNames = classNames;
>>>>>+            this.beanArchiveInfo = beanArchiveInfo;
>>>>>         }
>>>>>
>>>>>         public URL getUrl()
>>>>>@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
>>>>>             return url;
>>>>>         }
>>>>>
>>>>>+        public BeanArchiveInformation getBeanArchiveInfo()
>>>>>+        {
>>>>>+            return beanArchiveInfo;
>>>>>+        }
>>>>>+
>>>>>         public Collection<String> getClassNames()
>>>>>         {
>>>>>             return classNames;
>>>>>
>>>>>Added:
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>URL:
>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
>>>>>==============================================================================
>>>>>---
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>(added)
>>>>>+++
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>>Sun Feb  9 22:23:28 2014
>>>>>@@ -0,0 +1,45 @@
>>>>>+/*
>>>>>+ * Licensed to the Apache Software Foundation (ASF) under one
>>>>>+ * or more contributor license agreements. See the NOTICE file
>>>>>+ * distributed with this work for additional information
>>>>>+ * regarding copyright ownership. The ASF licenses this file
>>>>>+ * to you under the Apache License, Version 2.0 (the
>>>>>+ * "License"); you may not use this file except in compliance
>>>>>+ * with the License. You may obtain a copy of the License at
>>>>>+ *
>>>>>+ * http://www.apache.org/licenses/LICENSE-2.0
>>>>>+ *
>>>>>+ * Unless required by applicable law or agreed to in writing,
>>>>>+ * software distributed under the License is distributed on an
>>>>>+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>+ * KIND, either express or implied. See the License for the
>>>>>+ * specific language governing permissions and limitations
>>>>>+ * under the License.
>>>>>+ */
>>>>>+package org.apache.webbeans.corespi.scanner.xbean;
>>>>>+
>>>>>+import org.apache.xbean.finder.AnnotationFinder;
>>>>>+import org.apache.xbean.finder.archive.Archive;
>>>>>+
>>>>>+/**
>>>>>+ * We just extend the default AnnotationFinder to get Access to the
>>>>>original ClassInfo
>>>>>+ * for not having to call loadClass so often...
>>>>>+ */
>>>>>+public class OwbAnnotationFinder extends AnnotationFinder
>>>>>+{
>>>>>+    public OwbAnnotationFinder(Archive archive, boolean
>>>>>checkRuntimeAnnotation)
>>>>>+    {
>>>>>+        super(archive, checkRuntimeAnnotation);
>>>>>+    }
>>>>>+
>>>>>+    public OwbAnnotationFinder(Archive archive)
>>>>>+    {
>>>>>+        super(archive);
>>>>>+    }
>>>>>+
>>>>>+    public ClassInfo getClassInfo(String className)
>>>>>+    {
>>>>>+        return classInfos.get(className);
>>>>>+    }
>>>>>+
>>>>>+}
>>>>>
>>>>>Modified:
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>URL:
>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>==============================================================================
>>>>>---
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>(original)
>>>>>+++
>>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>>Sun Feb  9 22:23:28 2014
>>>>>@@ -19,14 +19,14 @@
>>>>>package org.apache.webbeans.lifecycle.test;
>>>>>
>>>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>>>import org.apache.webbeans.util.Asserts;
>>>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>>>
>>>>>import java.net.MalformedURLException;
>>>>>import java.net.URL;
>>>>>import java.util.Collection;
>>>>>+import java.util.HashSet;
>>>>>+import java.util.Set;
>>>>>
>>>>>/**
>>>>>  * Used by each test.
>>>>>@@ -35,15 +35,18 @@ import java.util.Collection;
>>>>>  */
>>>>>public class OpenWebBeansTestMetaDataDiscoveryService extends
>>>>>AbstractMetaDataDiscovery
>>>>>{
>>>>>+
>>>>>+    private Collection<Class<?>> classes;
>>>>>+
>>>>>     public OpenWebBeansTestMetaDataDiscoveryService()
>>>>>     {
>>>>>-
>>>>>+        super();
>>>>>     }
>>>>>
>>>>>     @Override
>>>>>     protected void configure()
>>>>>     {
>>>>>-        //Nothing we scan
>>>>>+        // Nothing to scan, we add all our stuff manually...
>>>>>     }
>>>>>
>>>>>     /**
>>>>>@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
>>>>>      */
>>>>>     public void deployClasses(Collection<Class<?>> classes)
>>>>>     {
>>>>>-        if(classes != null)
>>>>>-        {
>>>>>-            archive = new CdiArchive(classes);
>>>>>-            finder = new AnnotationFinder(archive);
>>>>>-        }
>>>>>+        this.classes = classes;
>>>>>     }
>>>>>-
>>>>>+
>>>>>+    @Override
>>>>>+    public Set<Class<?>> getBeanClasses()
>>>>>+    {
>>>>>+        return new HashSet<Class<?>>(classes);
>>>>>+    }
>>>>>+
>>>>>     /**
>>>>>      * Those xmls will be scanned by container.
>>>>>      * @param xmls beans xmls
>>>>>@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
>>>>>
>>>>>         addWebBeansXmlLocation(url);
>>>>>     }
>>>>>-
>>>>>
>>>>>}
>>>>>
>>>>>Modified:
>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>URL:
>>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>>==============================================================================
>>>>>---
>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>(original)
>>>>>+++
>>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>>Sun Feb  9 22:23:28 2014
>>>>>@@ -18,14 +18,11 @@
>>>>>  */
>>>>>package org.apache.webbeans.web.scanner;
>>>>>
>>>>>-import org.apache.webbeans.config.WebBeansContext;
>>>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>>import org.apache.webbeans.util.ExceptionUtil;
>>>>>import org.apache.webbeans.util.WebBeansUtil;
>>>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>>>
>>>>>import javax.servlet.ServletContext;
>>>>>import java.net.MalformedURLException;
>>>>>@@ -50,17 +47,6 @@ public class WebScannerService extends A
>>>>>     }
>>>>>
>>>>>     @Override
>>>>>-    protected AnnotationFinder initFinder()
>>>>>-    {
>>>>>-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
>>>>>-        beanArchiveService = webbeansContext.getBeanArchiveService();
>>>>>-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
>>>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>>>getBeanDeploymentUrls());
>>>>>-        finder = new AnnotationFinder(archive);
>>>>>-
>>>>>-        return finder;
>>>>>-    }
>>>>>-
>>>>>-    @Override
>>>>>     public void init(Object context)
>>>>>     {
>>>>>         super.init(context);
>>>>>
>>>>>
>>>
>>>
>
>

Re: Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Romain Manni-Bucau <rm...@gmail.com>.
wonder if we could merge somehow openejb and openwebbeans scanning
filtering. OpenEJB/TomEE one is really nice and efficient (even if
sometimes code can seem a bit rough).

Maybe something to finally put in XBean?
Romain Manni-Bucau
Twitter: @rmannibucau
Blog: http://rmannibucau.wordpress.com/
LinkedIn: http://fr.linkedin.com/in/rmannibucau
Github: https://github.com/rmannibucau



2014-02-10 8:27 GMT+01:00 Mark Struberg <st...@yahoo.de>:
> It's basically a complete re-implementation of our scanning mechanism.
> We still provide and consume the same ScannerService SPI yet though.
>
> But I'm about to change this and try to introduce something more smart probably. Still thinking about it.
>
> LieGrue,
> strub
>
>
>
>
>
> On Monday, 10 February 2014, 8:24, Romain Manni-Bucau <rm...@gmail.com> wrote:
>
> Great, got a doubt after months without touching it, thks :)
>>Romain Manni-Bucau
>>Twitter: @rmannibucau
>>Blog: http://rmannibucau.wordpress.com/
>>LinkedIn: http://fr.linkedin.com/in/rmannibucau
>>Github: https://github.com/rmannibucau
>>
>>
>>
>>2014-02-10 8:09 GMT+01:00 Mark Struberg <st...@yahoo.de>:
>>> I also did test this on windows and it works.
>>> Reason is that thi are URL.toExternalPath, which always use forward slashes on all platforms to my knowledge.
>>>
>>> Now we have no single new URL(...) anymore in our code.
>>>
>>> LieGrue,
>>> strub
>>>
>>>
>>>
>>>
>>>
>>> On Monday, 10 February 2014, 7:07, Romain Manni-Bucau <rm...@gmail.com> wrote:
>>>
>>> Hi Mark
>>>>
>>>>Will it work on windows or /xxx will not match?
>>>>---------- Message transféré ----------
>>>>De : <st...@apache.org>
>>>>Date : 9 févr. 2014 23:23
>>>>Objet : svn commit: r1566452 - in /openwebbeans/trunk:
>>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
>>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
>>>>webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
>>>>À : <co...@openwebbeans.apache.org>
>>>>
>>>>Author: struberg
>>>>Date: Sun Feb  9 22:23:28 2014
>>>>New Revision: 1566452
>>>>
>>>>URL: http://svn.apache.org/r1566452
>>>>Log:
>>>>OWB-928 improve scanning performance
>>>>
>>>>We now take the annotation information from ASM and don't do a
>>>>loadClass...getAnnotations anymore
>>>>
>>>>Added:
>>>>
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>Modified:
>>>>
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>
>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>
>>>>Modified:
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>URL:
>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>==============================================================================
>>>>---
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>(original)
>>>>+++
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>>Sun Feb  9 22:23:28 2014
>>>>@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
>>>>import org.apache.webbeans.config.OpenWebBeansConfiguration;
>>>>import org.apache.webbeans.config.WebBeansContext;
>>>>import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
>>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>>import org.apache.webbeans.spi.BDABeansXmlScanner;
>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>>import org.apache.webbeans.spi.ScannerService;
>>>>import org.apache.webbeans.util.ClassUtil;
>>>>import org.apache.webbeans.util.UrlSet;
>>>>@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
>>>>import org.apache.xbean.finder.ClassLoaders;
>>>>
>>>>import java.io.IOException;
>>>>+import java.lang.annotation.Annotation;
>>>>import java.net.URL;
>>>>import java.util.Collections;
>>>>import java.util.Enumeration;
>>>>@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
>>>>
>>>>     protected ClassLoader loader;
>>>>     protected CdiArchive archive;
>>>>-    protected AnnotationFinder finder;
>>>>+    protected OwbAnnotationFinder finder;
>>>>     protected boolean isBDAScannerEnabled = false;
>>>>     protected BDABeansXmlScanner bdaBeansXmlScanner;
>>>>+    protected final WebBeansContext webBeansContext;
>>>>
>>>>
>>>>+    protected AbstractMetaDataDiscovery()
>>>>+    {
>>>>+        webBeansContext = WebBeansContext.getInstance();
>>>>+    }
>>>>
>>>>     protected AnnotationFinder initFinder()
>>>>     {
>>>>@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
>>>>             return finder;
>>>>         }
>>>>
>>>>-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
>>>>         if (beanArchiveService == null)
>>>>         {
>>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>>         }
>>>>
>>>>-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
>>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>>getBeanDeploymentUrls());
>>>>-        finder = new AnnotationFinder(archive);
>>>>+        archive = new CdiArchive(beanArchiveService,
>>>>WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
>>>>+        finder = new OwbAnnotationFinder(archive);
>>>>
>>>>         return finder;
>>>>     }
>>>>@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
>>>>                 path.contains("/idea_rt") ||
>>>>                 path.contains("/eclipse") ||
>>>>                 path.contains("/jcommander") ||
>>>>+                path.contains("/tomcat") ||
>>>>+                path.contains("/catalina") ||
>>>>+                path.contains("/jasper") ||
>>>>+                path.contains("/jsp-api") ||
>>>>+                path.contains("/myfaces-") ||
>>>>+                path.contains("/servlet-api") ||
>>>>+                path.contains("/javax") ||
>>>>+                path.contains("/annotation-api") ||
>>>>+                path.contains("/el-api") ||
>>>>+                path.contains("/mojarra") ||
>>>>                 path.contains("/openwebbeans-"))
>>>>             {
>>>>                 //X TODO this should be much more actually
>>>>@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
>>>>         // and also scan the bean archive!
>>>>         if (beanArchiveService == null)
>>>>         {
>>>>-            WebBeansContext webBeansContext =
>>>>WebBeansContext.getInstance();
>>>>+
>>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>>         }
>>>>
>>>>@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
>>>>     public Set<Class<?>> getBeanClasses()
>>>>     {
>>>>         final Set<Class<?>> classSet = new HashSet<Class<?>>();
>>>>-        for(String str : archive.getClasses())
>>>>+        for (CdiArchive.FoundClasses foundClasses :
>>>>archive.classesByUrl().values())
>>>>         {
>>>>-            try
>>>>+            boolean scanModeAnnotated =
>>>>BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
>>>>+            for(String className : foundClasses.getClassNames())
>>>>             {
>>>>-                Class<?> clazz = ClassUtil.getClassFromName(str);
>>>>-                if (clazz != null)
>>>>+                try
>>>>                 {
>>>>+                    if (scanModeAnnotated)
>>>>+                    {
>>>>+                        // in this case we need to find out whether we
>>>>should keep this class in the Archive
>>>>+                        AnnotationFinder.ClassInfo classInfo =
>>>>finder.getClassInfo(className);
>>>>+                        if (classInfo == null ||
>>>>!isBeanAnnotatedClass(classInfo))
>>>>+                        {
>>>>+                            continue;
>>>>+                        }
>>>>+                    }
>>>>
>>>>-                    // try to provoke a NoClassDefFoundError exception
>>>>which is thrown
>>>>-                    // if some dependencies of the class are missing
>>>>-                    clazz.getDeclaredFields();
>>>>-                    clazz.getDeclaredMethods();
>>>>+                    Class<?> clazz = ClassUtil.getClassFromName(className);
>>>>+                    if (clazz != null)
>>>>+                    {
>>>>+
>>>>+                        // try to provoke a NoClassDefFoundError exception
>>>>which is thrown
>>>>+                        // if some dependencies of the class are missing
>>>>+                        clazz.getDeclaredFields();
>>>>+                        clazz.getDeclaredMethods();
>>>>
>>>>-                    // we can add this class cause it has been loaded
>>>>completely
>>>>-                    classSet.add(clazz);
>>>>+                        // we can add this class cause it has been loaded
>>>>completely
>>>>+                        classSet.add(clazz);
>>>>
>>>>+                    }
>>>>                 }
>>>>-            }
>>>>-            catch (NoClassDefFoundError e)
>>>>-            {
>>>>-                if (logger.isLoggable(Level.WARNING))
>>>>+                catch (NoClassDefFoundError e)
>>>>                 {
>>>>-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
>>>>Object[] { str, e.toString() });
>>>>+                    if (logger.isLoggable(Level.WARNING))
>>>>+                    {
>>>>+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
>>>>new Object[] { className, e.toString() });
>>>>+                    }
>>>>                 }
>>>>             }
>>>>+
>>>>         }
>>>>
>>>>         return classSet;
>>>>     }
>>>>
>>>>+    /**
>>>>+     * This method is called for classes from bean archives with
>>>>+     * bean-discovery-mode 'annotated'.
>>>>+     *
>>>>+     * This method is intended to be overwritten in integration scenarios
>>>>and e.g.
>>>>+     * allows to add other criterias for keeping the class.
>>>>+     *
>>>>+     * @param classInfo
>>>>+     * @return true if this class should be kept and further get picked up
>>>>as CDI Bean
>>>>+     */
>>>>+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
>>>>classInfo)
>>>>+    {
>>>>+        // check whether this class has 'scope' annotations or a stereotype
>>>>+        for (AnnotationFinder.AnnotationInfo annotationInfo :
>>>>classInfo.getAnnotations())
>>>>+        {
>>>>+            if (isBeanAnnotation(annotationInfo))
>>>>+            {
>>>>+                return true;
>>>>+            }
>>>>+        }
>>>>+        return false;
>>>>+    }
>>>>+
>>>>+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
>>>>annotationInfo)
>>>>+    {
>>>>+        String annotationName = annotationInfo.getName();
>>>>+
>>>>+        // TODO add caches
>>>>+
>>>>+        try
>>>>+        {
>>>>+            Class<? extends Annotation> annotationType = (Class<? extends
>>>>Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
>>>>+            boolean isBeanAnnotation =
>>>>webBeansContext.getBeanManagerImpl().isScope(annotationType);
>>>>+            isBeanAnnotation = isBeanAnnotation ||
>>>>webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
>>>>+
>>>>+            return isBeanAnnotation;
>>>>+        }
>>>>+        catch (ClassNotFoundException e)
>>>>+        {
>>>>+            return false;
>>>>+        }
>>>>+    }
>>>>+
>>>>
>>>>     @Override
>>>>     public Set<URL> getBeanXmls()
>>>>
>>>>Modified:
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>URL:
>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>==============================================================================
>>>>---
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>(original)
>>>>+++
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>>Sun Feb  9 22:23:28 2014
>>>>@@ -18,11 +18,8 @@
>>>>  */
>>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>>
>>>>-import java.lang.annotation.Annotation;
>>>>import java.util.List;
>>>>-import java.util.Set;
>>>>
>>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>>import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>>import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>>import org.apache.xbean.finder.filter.Filter;
>>>>@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
>>>>  */
>>>>public class BeanArchiveFilter implements Filter
>>>>{
>>>>-    private final ClassLoader loader;
>>>>-    private final BeanManagerImpl beanManager;
>>>>     private final BeanArchiveInformation beanArchiveInfo;
>>>>-    private final boolean scanAll;
>>>>     private final boolean scanNone;
>>>>-    private final boolean scanAnnotated;
>>>>
>>>>     private List<String> urlClasses;
>>>>-    private Set<String> allClasses;
>>>>
>>>>-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
>>>>beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
>>>>urlClasses, Set<String> allClasses)
>>>>+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
>>>>List<String> urlClasses)
>>>>     {
>>>>-        this.loader = loader;
>>>>-        this.beanManager = beanManager;
>>>>         this.beanArchiveInfo = beanArchiveInfo;
>>>>         this.urlClasses = urlClasses;
>>>>-        this.allClasses = allClasses;
>>>>         BeanDiscoveryMode discoveryMode =
>>>>beanArchiveInfo.getBeanDiscoveryMode();
>>>>
>>>>-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
>>>>         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
>>>>-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
>>>>     }
>>>>
>>>>     @Override
>>>>@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
>>>>             return false;
>>>>         }
>>>>
>>>>-        if (scanAll)
>>>>-        {
>>>>-            urlClasses.add(name);
>>>>-            allClasses.add(name);
>>>>-            return true;
>>>>-        }
>>>>-
>>>>-        if (scanAnnotated)
>>>>-        {
>>>>-            try
>>>>-            {
>>>>-                Class clazz = Class.forName(name, false, loader);
>>>>-                if (!hasScopeAnnotation(clazz.getAnnotations()))
>>>>-                {
>>>>-                    return false;
>>>>-                }
>>>>-            }
>>>>-            catch (ClassNotFoundException cnfe)
>>>>-            {
>>>>-                // not a problem, just ignore this class
>>>>-                return false;
>>>>-            }
>>>>-            catch (NoClassDefFoundError ncdf)
>>>>-            {
>>>>-                // not a problem, just ignore this class
>>>>-                return false;
>>>>-            }
>>>>-
>>>>             urlClasses.add(name);
>>>>-            allClasses.add(name);
>>>>             return true;
>>>>-        }
>>>>-
>>>>-        return false;
>>>>     }
>>>>
>>>>-    private boolean hasScopeAnnotation(Annotation[] annotations)
>>>>-    {
>>>>-        for (Annotation annotation : annotations)
>>>>-        {
>>>>-            if (beanManager.isScope(annotation.annotationType()))
>>>>-            {
>>>>-                return true;
>>>>-            }
>>>>-        }
>>>>-        return false;
>>>>-    }
>>>>}
>>>>
>>>>Modified:
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>URL:
>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>==============================================================================
>>>>---
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>(original)
>>>>+++
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>>Sun Feb  9 22:23:28 2014
>>>>@@ -18,14 +18,12 @@
>>>>  */
>>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>>
>>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>>import org.apache.xbean.finder.archive.Archive;
>>>>-import org.apache.xbean.finder.archive.ClassesArchive;
>>>>import org.apache.xbean.finder.archive.ClasspathArchive;
>>>>import org.apache.xbean.finder.archive.CompositeArchive;
>>>>import org.apache.xbean.finder.archive.FilteredArchive;
>>>>-import org.apache.xbean.finder.filter.Filter;
>>>>
>>>>import java.io.IOException;
>>>>import java.io.InputStream;
>>>>@@ -33,11 +31,9 @@ import java.net.URL;
>>>>import java.util.ArrayList;
>>>>import java.util.Collection;
>>>>import java.util.HashMap;
>>>>-import java.util.HashSet;
>>>>import java.util.Iterator;
>>>>import java.util.List;
>>>>import java.util.Map;
>>>>-import java.util.Set;
>>>>
>>>>/**
>>>>  * this delegate pattern is interesting
>>>>@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
>>>>      */
>>>>     private final Map<String, FoundClasses> classesByUrl = new
>>>>HashMap<String, FoundClasses>();
>>>>
>>>>-    private final Set<String> allClasses = new HashSet<String>();
>>>>     private final Archive delegate;
>>>>
>>>>-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
>>>>beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
>>>>+    public CdiArchive(BeanArchiveService beanArchiveService, final
>>>>ClassLoader loader, final Map<String, URL> urls)
>>>>     {
>>>>         final Collection<Archive> archives = new ArrayList<Archive>();
>>>>         for (final URL url : urls.values())
>>>>         {
>>>>             final List<String> urlClasses = new ArrayList<String>();
>>>>
>>>>-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
>>>>beanArchiveService.getBeanArchiveInformation(url);
>>>>+            BeanArchiveInformation beanArchiveInfo =
>>>>beanArchiveService.getBeanArchiveInformation(url);
>>>>             final Archive archive = new
>>>>FilteredArchive(ClasspathArchive.archive(loader, url),
>>>>-                    new BeanArchiveFilter(loader, beanManager,
>>>>beanArchiveInfo, urlClasses, allClasses));
>>>>+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
>>>>
>>>>-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>>urlClasses));
>>>>+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>>urlClasses, beanArchiveInfo));
>>>>             archives.add(archive);
>>>>         }
>>>>
>>>>         delegate = new CompositeArchive(archives);
>>>>     }
>>>>
>>>>-    public CdiArchive(final Collection<Class<?>> classList)
>>>>-    {
>>>>-        delegate = new FilteredArchive(new ClassesArchive(classList), new
>>>>Filter()
>>>>-        {
>>>>-            @Override
>>>>-            public boolean accept(final String name)
>>>>-            {
>>>>-                allClasses.add(name);
>>>>-                return true;
>>>>-            }
>>>>-        });
>>>>-    }
>>>>-
>>>>-    public Set<String> getClasses()
>>>>-    {
>>>>-        return allClasses;
>>>>-    }
>>>>-
>>>>     public Map<String, FoundClasses> classesByUrl()
>>>>     {
>>>>         return classesByUrl;
>>>>@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
>>>>     {
>>>>         private URL url;
>>>>         private Collection<String> classNames;
>>>>+        private BeanArchiveInformation beanArchiveInfo;
>>>>
>>>>-        public FoundClasses(URL url, Collection<String> classNames)
>>>>+        public FoundClasses(URL url, Collection<String> classNames,
>>>>BeanArchiveInformation beanArchiveInfo)
>>>>         {
>>>>             this.url = url;
>>>>             this.classNames = classNames;
>>>>+            this.beanArchiveInfo = beanArchiveInfo;
>>>>         }
>>>>
>>>>         public URL getUrl()
>>>>@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
>>>>             return url;
>>>>         }
>>>>
>>>>+        public BeanArchiveInformation getBeanArchiveInfo()
>>>>+        {
>>>>+            return beanArchiveInfo;
>>>>+        }
>>>>+
>>>>         public Collection<String> getClassNames()
>>>>         {
>>>>             return classNames;
>>>>
>>>>Added:
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>URL:
>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
>>>>==============================================================================
>>>>---
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>(added)
>>>>+++
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>>Sun Feb  9 22:23:28 2014
>>>>@@ -0,0 +1,45 @@
>>>>+/*
>>>>+ * Licensed to the Apache Software Foundation (ASF) under one
>>>>+ * or more contributor license agreements. See the NOTICE file
>>>>+ * distributed with this work for additional information
>>>>+ * regarding copyright ownership. The ASF licenses this file
>>>>+ * to you under the Apache License, Version 2.0 (the
>>>>+ * "License"); you may not use this file except in compliance
>>>>+ * with the License. You may obtain a copy of the License at
>>>>+ *
>>>>+ * http://www.apache.org/licenses/LICENSE-2.0
>>>>+ *
>>>>+ * Unless required by applicable law or agreed to in writing,
>>>>+ * software distributed under the License is distributed on an
>>>>+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>+ * KIND, either express or implied. See the License for the
>>>>+ * specific language governing permissions and limitations
>>>>+ * under the License.
>>>>+ */
>>>>+package org.apache.webbeans.corespi.scanner.xbean;
>>>>+
>>>>+import org.apache.xbean.finder.AnnotationFinder;
>>>>+import org.apache.xbean.finder.archive.Archive;
>>>>+
>>>>+/**
>>>>+ * We just extend the default AnnotationFinder to get Access to the
>>>>original ClassInfo
>>>>+ * for not having to call loadClass so often...
>>>>+ */
>>>>+public class OwbAnnotationFinder extends AnnotationFinder
>>>>+{
>>>>+    public OwbAnnotationFinder(Archive archive, boolean
>>>>checkRuntimeAnnotation)
>>>>+    {
>>>>+        super(archive, checkRuntimeAnnotation);
>>>>+    }
>>>>+
>>>>+    public OwbAnnotationFinder(Archive archive)
>>>>+    {
>>>>+        super(archive);
>>>>+    }
>>>>+
>>>>+    public ClassInfo getClassInfo(String className)
>>>>+    {
>>>>+        return classInfos.get(className);
>>>>+    }
>>>>+
>>>>+}
>>>>
>>>>Modified:
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>URL:
>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>==============================================================================
>>>>---
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>(original)
>>>>+++
>>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>>Sun Feb  9 22:23:28 2014
>>>>@@ -19,14 +19,14 @@
>>>>package org.apache.webbeans.lifecycle.test;
>>>>
>>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>>import org.apache.webbeans.util.Asserts;
>>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>>
>>>>import java.net.MalformedURLException;
>>>>import java.net.URL;
>>>>import java.util.Collection;
>>>>+import java.util.HashSet;
>>>>+import java.util.Set;
>>>>
>>>>/**
>>>>  * Used by each test.
>>>>@@ -35,15 +35,18 @@ import java.util.Collection;
>>>>  */
>>>>public class OpenWebBeansTestMetaDataDiscoveryService extends
>>>>AbstractMetaDataDiscovery
>>>>{
>>>>+
>>>>+    private Collection<Class<?>> classes;
>>>>+
>>>>     public OpenWebBeansTestMetaDataDiscoveryService()
>>>>     {
>>>>-
>>>>+        super();
>>>>     }
>>>>
>>>>     @Override
>>>>     protected void configure()
>>>>     {
>>>>-        //Nothing we scan
>>>>+        // Nothing to scan, we add all our stuff manually...
>>>>     }
>>>>
>>>>     /**
>>>>@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
>>>>      */
>>>>     public void deployClasses(Collection<Class<?>> classes)
>>>>     {
>>>>-        if(classes != null)
>>>>-        {
>>>>-            archive = new CdiArchive(classes);
>>>>-            finder = new AnnotationFinder(archive);
>>>>-        }
>>>>+        this.classes = classes;
>>>>     }
>>>>-
>>>>+
>>>>+    @Override
>>>>+    public Set<Class<?>> getBeanClasses()
>>>>+    {
>>>>+        return new HashSet<Class<?>>(classes);
>>>>+    }
>>>>+
>>>>     /**
>>>>      * Those xmls will be scanned by container.
>>>>      * @param xmls beans xmls
>>>>@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
>>>>
>>>>         addWebBeansXmlLocation(url);
>>>>     }
>>>>-
>>>>
>>>>}
>>>>
>>>>Modified:
>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>URL:
>>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>>==============================================================================
>>>>---
>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>(original)
>>>>+++
>>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>>Sun Feb  9 22:23:28 2014
>>>>@@ -18,14 +18,11 @@
>>>>  */
>>>>package org.apache.webbeans.web.scanner;
>>>>
>>>>-import org.apache.webbeans.config.WebBeansContext;
>>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>>import org.apache.webbeans.util.ExceptionUtil;
>>>>import org.apache.webbeans.util.WebBeansUtil;
>>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>>
>>>>import javax.servlet.ServletContext;
>>>>import java.net.MalformedURLException;
>>>>@@ -50,17 +47,6 @@ public class WebScannerService extends A
>>>>     }
>>>>
>>>>     @Override
>>>>-    protected AnnotationFinder initFinder()
>>>>-    {
>>>>-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
>>>>-        beanArchiveService = webbeansContext.getBeanArchiveService();
>>>>-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
>>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>>getBeanDeploymentUrls());
>>>>-        finder = new AnnotationFinder(archive);
>>>>-
>>>>-        return finder;
>>>>-    }
>>>>-
>>>>-    @Override
>>>>     public void init(Object context)
>>>>     {
>>>>         super.init(context);
>>>>
>>>>
>>
>>

Re: Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Mark Struberg <st...@yahoo.de>.
It's basically a complete re-implementation of our scanning mechanism.
We still provide and consume the same ScannerService SPI yet though.

But I'm about to change this and try to introduce something more smart probably. Still thinking about it.

LieGrue,
strub





On Monday, 10 February 2014, 8:24, Romain Manni-Bucau <rm...@gmail.com> wrote:
 
Great, got a doubt after months without touching it, thks :)
>Romain Manni-Bucau
>Twitter: @rmannibucau
>Blog: http://rmannibucau.wordpress.com/
>LinkedIn: http://fr.linkedin.com/in/rmannibucau
>Github: https://github.com/rmannibucau
>
>
>
>2014-02-10 8:09 GMT+01:00 Mark Struberg <st...@yahoo.de>:
>> I also did test this on windows and it works.
>> Reason is that thi are URL.toExternalPath, which always use forward slashes on all platforms to my knowledge.
>>
>> Now we have no single new URL(...) anymore in our code.
>>
>> LieGrue,
>> strub
>>
>>
>>
>>
>>
>> On Monday, 10 February 2014, 7:07, Romain Manni-Bucau <rm...@gmail.com> wrote:
>>
>> Hi Mark
>>>
>>>Will it work on windows or /xxx will not match?
>>>---------- Message transféré ----------
>>>De : <st...@apache.org>
>>>Date : 9 févr. 2014 23:23
>>>Objet : svn commit: r1566452 - in /openwebbeans/trunk:
>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
>>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
>>>webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
>>>À : <co...@openwebbeans.apache.org>
>>>
>>>Author: struberg
>>>Date: Sun Feb  9 22:23:28 2014
>>>New Revision: 1566452
>>>
>>>URL: http://svn.apache.org/r1566452
>>>Log:
>>>OWB-928 improve scanning performance
>>>
>>>We now take the annotation information from ASM and don't do a
>>>loadClass...getAnnotations anymore
>>>
>>>Added:
>>>
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>Modified:
>>>
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>
>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>
>>>Modified:
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>URL:
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>==============================================================================
>>>---
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>(original)
>>>+++
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>>Sun Feb  9 22:23:28 2014
>>>@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
>>>import org.apache.webbeans.config.OpenWebBeansConfiguration;
>>>import org.apache.webbeans.config.WebBeansContext;
>>>import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>import org.apache.webbeans.spi.BDABeansXmlScanner;
>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>import org.apache.webbeans.spi.ScannerService;
>>>import org.apache.webbeans.util.ClassUtil;
>>>import org.apache.webbeans.util.UrlSet;
>>>@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
>>>import org.apache.xbean.finder.ClassLoaders;
>>>
>>>import java.io.IOException;
>>>+import java.lang.annotation.Annotation;
>>>import java.net.URL;
>>>import java.util.Collections;
>>>import java.util.Enumeration;
>>>@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
>>>
>>>     protected ClassLoader loader;
>>>     protected CdiArchive archive;
>>>-    protected AnnotationFinder finder;
>>>+    protected OwbAnnotationFinder finder;
>>>     protected boolean isBDAScannerEnabled = false;
>>>     protected BDABeansXmlScanner bdaBeansXmlScanner;
>>>+    protected final WebBeansContext webBeansContext;
>>>
>>>
>>>+    protected AbstractMetaDataDiscovery()
>>>+    {
>>>+        webBeansContext = WebBeansContext.getInstance();
>>>+    }
>>>
>>>     protected AnnotationFinder initFinder()
>>>     {
>>>@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
>>>             return finder;
>>>         }
>>>
>>>-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
>>>         if (beanArchiveService == null)
>>>         {
>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>         }
>>>
>>>-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>getBeanDeploymentUrls());
>>>-        finder = new AnnotationFinder(archive);
>>>+        archive = new CdiArchive(beanArchiveService,
>>>WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
>>>+        finder = new OwbAnnotationFinder(archive);
>>>
>>>         return finder;
>>>     }
>>>@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
>>>                 path.contains("/idea_rt") ||
>>>                 path.contains("/eclipse") ||
>>>                 path.contains("/jcommander") ||
>>>+                path.contains("/tomcat") ||
>>>+                path.contains("/catalina") ||
>>>+                path.contains("/jasper") ||
>>>+                path.contains("/jsp-api") ||
>>>+                path.contains("/myfaces-") ||
>>>+                path.contains("/servlet-api") ||
>>>+                path.contains("/javax") ||
>>>+                path.contains("/annotation-api") ||
>>>+                path.contains("/el-api") ||
>>>+                path.contains("/mojarra") ||
>>>                 path.contains("/openwebbeans-"))
>>>             {
>>>                 //X TODO this should be much more actually
>>>@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
>>>         // and also scan the bean archive!
>>>         if (beanArchiveService == null)
>>>         {
>>>-            WebBeansContext webBeansContext =
>>>WebBeansContext.getInstance();
>>>+
>>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>>         }
>>>
>>>@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
>>>     public Set<Class<?>> getBeanClasses()
>>>     {
>>>         final Set<Class<?>> classSet = new HashSet<Class<?>>();
>>>-        for(String str : archive.getClasses())
>>>+        for (CdiArchive.FoundClasses foundClasses :
>>>archive.classesByUrl().values())
>>>         {
>>>-            try
>>>+            boolean scanModeAnnotated =
>>>BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
>>>+            for(String className : foundClasses.getClassNames())
>>>             {
>>>-                Class<?> clazz = ClassUtil.getClassFromName(str);
>>>-                if (clazz != null)
>>>+                try
>>>                 {
>>>+                    if (scanModeAnnotated)
>>>+                    {
>>>+                        // in this case we need to find out whether we
>>>should keep this class in the Archive
>>>+                        AnnotationFinder.ClassInfo classInfo =
>>>finder.getClassInfo(className);
>>>+                        if (classInfo == null ||
>>>!isBeanAnnotatedClass(classInfo))
>>>+                        {
>>>+                            continue;
>>>+                        }
>>>+                    }
>>>
>>>-                    // try to provoke a NoClassDefFoundError exception
>>>which is thrown
>>>-                    // if some dependencies of the class are missing
>>>-                    clazz.getDeclaredFields();
>>>-                    clazz.getDeclaredMethods();
>>>+                    Class<?> clazz = ClassUtil.getClassFromName(className);
>>>+                    if (clazz != null)
>>>+                    {
>>>+
>>>+                        // try to provoke a NoClassDefFoundError exception
>>>which is thrown
>>>+                        // if some dependencies of the class are missing
>>>+                        clazz.getDeclaredFields();
>>>+                        clazz.getDeclaredMethods();
>>>
>>>-                    // we can add this class cause it has been loaded
>>>completely
>>>-                    classSet.add(clazz);
>>>+                        // we can add this class cause it has been loaded
>>>completely
>>>+                        classSet.add(clazz);
>>>
>>>+                    }
>>>                 }
>>>-            }
>>>-            catch (NoClassDefFoundError e)
>>>-            {
>>>-                if (logger.isLoggable(Level.WARNING))
>>>+                catch (NoClassDefFoundError e)
>>>                 {
>>>-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
>>>Object[] { str, e.toString() });
>>>+                    if (logger.isLoggable(Level.WARNING))
>>>+                    {
>>>+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
>>>new Object[] { className, e.toString() });
>>>+                    }
>>>                 }
>>>             }
>>>+
>>>         }
>>>
>>>         return classSet;
>>>     }
>>>
>>>+    /**
>>>+     * This method is called for classes from bean archives with
>>>+     * bean-discovery-mode 'annotated'.
>>>+     *
>>>+     * This method is intended to be overwritten in integration scenarios
>>>and e.g.
>>>+     * allows to add other criterias for keeping the class.
>>>+     *
>>>+     * @param classInfo
>>>+     * @return true if this class should be kept and further get picked up
>>>as CDI Bean
>>>+     */
>>>+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
>>>classInfo)
>>>+    {
>>>+        // check whether this class has 'scope' annotations or a stereotype
>>>+        for (AnnotationFinder.AnnotationInfo annotationInfo :
>>>classInfo.getAnnotations())
>>>+        {
>>>+            if (isBeanAnnotation(annotationInfo))
>>>+            {
>>>+                return true;
>>>+            }
>>>+        }
>>>+        return false;
>>>+    }
>>>+
>>>+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
>>>annotationInfo)
>>>+    {
>>>+        String annotationName = annotationInfo.getName();
>>>+
>>>+        // TODO add caches
>>>+
>>>+        try
>>>+        {
>>>+            Class<? extends Annotation> annotationType = (Class<? extends
>>>Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
>>>+            boolean isBeanAnnotation =
>>>webBeansContext.getBeanManagerImpl().isScope(annotationType);
>>>+            isBeanAnnotation = isBeanAnnotation ||
>>>webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
>>>+
>>>+            return isBeanAnnotation;
>>>+        }
>>>+        catch (ClassNotFoundException e)
>>>+        {
>>>+            return false;
>>>+        }
>>>+    }
>>>+
>>>
>>>     @Override
>>>     public Set<URL> getBeanXmls()
>>>
>>>Modified:
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>URL:
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>==============================================================================
>>>---
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>(original)
>>>+++
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>>Sun Feb  9 22:23:28 2014
>>>@@ -18,11 +18,8 @@
>>>  */
>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>
>>>-import java.lang.annotation.Annotation;
>>>import java.util.List;
>>>-import java.util.Set;
>>>
>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>>import org.apache.xbean.finder.filter.Filter;
>>>@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
>>>  */
>>>public class BeanArchiveFilter implements Filter
>>>{
>>>-    private final ClassLoader loader;
>>>-    private final BeanManagerImpl beanManager;
>>>     private final BeanArchiveInformation beanArchiveInfo;
>>>-    private final boolean scanAll;
>>>     private final boolean scanNone;
>>>-    private final boolean scanAnnotated;
>>>
>>>     private List<String> urlClasses;
>>>-    private Set<String> allClasses;
>>>
>>>-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
>>>beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
>>>urlClasses, Set<String> allClasses)
>>>+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
>>>List<String> urlClasses)
>>>     {
>>>-        this.loader = loader;
>>>-        this.beanManager = beanManager;
>>>         this.beanArchiveInfo = beanArchiveInfo;
>>>         this.urlClasses = urlClasses;
>>>-        this.allClasses = allClasses;
>>>         BeanDiscoveryMode discoveryMode =
>>>beanArchiveInfo.getBeanDiscoveryMode();
>>>
>>>-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
>>>         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
>>>-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
>>>     }
>>>
>>>     @Override
>>>@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
>>>             return false;
>>>         }
>>>
>>>-        if (scanAll)
>>>-        {
>>>-            urlClasses.add(name);
>>>-            allClasses.add(name);
>>>-            return true;
>>>-        }
>>>-
>>>-        if (scanAnnotated)
>>>-        {
>>>-            try
>>>-            {
>>>-                Class clazz = Class.forName(name, false, loader);
>>>-                if (!hasScopeAnnotation(clazz.getAnnotations()))
>>>-                {
>>>-                    return false;
>>>-                }
>>>-            }
>>>-            catch (ClassNotFoundException cnfe)
>>>-            {
>>>-                // not a problem, just ignore this class
>>>-                return false;
>>>-            }
>>>-            catch (NoClassDefFoundError ncdf)
>>>-            {
>>>-                // not a problem, just ignore this class
>>>-                return false;
>>>-            }
>>>-
>>>             urlClasses.add(name);
>>>-            allClasses.add(name);
>>>             return true;
>>>-        }
>>>-
>>>-        return false;
>>>     }
>>>
>>>-    private boolean hasScopeAnnotation(Annotation[] annotations)
>>>-    {
>>>-        for (Annotation annotation : annotations)
>>>-        {
>>>-            if (beanManager.isScope(annotation.annotationType()))
>>>-            {
>>>-                return true;
>>>-            }
>>>-        }
>>>-        return false;
>>>-    }
>>>}
>>>
>>>Modified:
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>URL:
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>==============================================================================
>>>---
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>(original)
>>>+++
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>>Sun Feb  9 22:23:28 2014
>>>@@ -18,14 +18,12 @@
>>>  */
>>>package org.apache.webbeans.corespi.scanner.xbean;
>>>
>>>-import org.apache.webbeans.container.BeanManagerImpl;
>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>>import org.apache.xbean.finder.archive.Archive;
>>>-import org.apache.xbean.finder.archive.ClassesArchive;
>>>import org.apache.xbean.finder.archive.ClasspathArchive;
>>>import org.apache.xbean.finder.archive.CompositeArchive;
>>>import org.apache.xbean.finder.archive.FilteredArchive;
>>>-import org.apache.xbean.finder.filter.Filter;
>>>
>>>import java.io.IOException;
>>>import java.io.InputStream;
>>>@@ -33,11 +31,9 @@ import java.net.URL;
>>>import java.util.ArrayList;
>>>import java.util.Collection;
>>>import java.util.HashMap;
>>>-import java.util.HashSet;
>>>import java.util.Iterator;
>>>import java.util.List;
>>>import java.util.Map;
>>>-import java.util.Set;
>>>
>>>/**
>>>  * this delegate pattern is interesting
>>>@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
>>>      */
>>>     private final Map<String, FoundClasses> classesByUrl = new
>>>HashMap<String, FoundClasses>();
>>>
>>>-    private final Set<String> allClasses = new HashSet<String>();
>>>     private final Archive delegate;
>>>
>>>-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
>>>beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
>>>+    public CdiArchive(BeanArchiveService beanArchiveService, final
>>>ClassLoader loader, final Map<String, URL> urls)
>>>     {
>>>         final Collection<Archive> archives = new ArrayList<Archive>();
>>>         for (final URL url : urls.values())
>>>         {
>>>             final List<String> urlClasses = new ArrayList<String>();
>>>
>>>-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
>>>beanArchiveService.getBeanArchiveInformation(url);
>>>+            BeanArchiveInformation beanArchiveInfo =
>>>beanArchiveService.getBeanArchiveInformation(url);
>>>             final Archive archive = new
>>>FilteredArchive(ClasspathArchive.archive(loader, url),
>>>-                    new BeanArchiveFilter(loader, beanManager,
>>>beanArchiveInfo, urlClasses, allClasses));
>>>+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
>>>
>>>-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>urlClasses));
>>>+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>>urlClasses, beanArchiveInfo));
>>>             archives.add(archive);
>>>         }
>>>
>>>         delegate = new CompositeArchive(archives);
>>>     }
>>>
>>>-    public CdiArchive(final Collection<Class<?>> classList)
>>>-    {
>>>-        delegate = new FilteredArchive(new ClassesArchive(classList), new
>>>Filter()
>>>-        {
>>>-            @Override
>>>-            public boolean accept(final String name)
>>>-            {
>>>-                allClasses.add(name);
>>>-                return true;
>>>-            }
>>>-        });
>>>-    }
>>>-
>>>-    public Set<String> getClasses()
>>>-    {
>>>-        return allClasses;
>>>-    }
>>>-
>>>     public Map<String, FoundClasses> classesByUrl()
>>>     {
>>>         return classesByUrl;
>>>@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
>>>     {
>>>         private URL url;
>>>         private Collection<String> classNames;
>>>+        private BeanArchiveInformation beanArchiveInfo;
>>>
>>>-        public FoundClasses(URL url, Collection<String> classNames)
>>>+        public FoundClasses(URL url, Collection<String> classNames,
>>>BeanArchiveInformation beanArchiveInfo)
>>>         {
>>>             this.url = url;
>>>             this.classNames = classNames;
>>>+            this.beanArchiveInfo = beanArchiveInfo;
>>>         }
>>>
>>>         public URL getUrl()
>>>@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
>>>             return url;
>>>         }
>>>
>>>+        public BeanArchiveInformation getBeanArchiveInfo()
>>>+        {
>>>+            return beanArchiveInfo;
>>>+        }
>>>+
>>>         public Collection<String> getClassNames()
>>>         {
>>>             return classNames;
>>>
>>>Added:
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>URL:
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
>>>==============================================================================
>>>---
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>(added)
>>>+++
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>>Sun Feb  9 22:23:28 2014
>>>@@ -0,0 +1,45 @@
>>>+/*
>>>+ * Licensed to the Apache Software Foundation (ASF) under one
>>>+ * or more contributor license agreements. See the NOTICE file
>>>+ * distributed with this work for additional information
>>>+ * regarding copyright ownership. The ASF licenses this file
>>>+ * to you under the Apache License, Version 2.0 (the
>>>+ * "License"); you may not use this file except in compliance
>>>+ * with the License. You may obtain a copy of the License at
>>>+ *
>>>+ * http://www.apache.org/licenses/LICENSE-2.0
>>>+ *
>>>+ * Unless required by applicable law or agreed to in writing,
>>>+ * software distributed under the License is distributed on an
>>>+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>+ * KIND, either express or implied. See the License for the
>>>+ * specific language governing permissions and limitations
>>>+ * under the License.
>>>+ */
>>>+package org.apache.webbeans.corespi.scanner.xbean;
>>>+
>>>+import org.apache.xbean.finder.AnnotationFinder;
>>>+import org.apache.xbean.finder.archive.Archive;
>>>+
>>>+/**
>>>+ * We just extend the default AnnotationFinder to get Access to the
>>>original ClassInfo
>>>+ * for not having to call loadClass so often...
>>>+ */
>>>+public class OwbAnnotationFinder extends AnnotationFinder
>>>+{
>>>+    public OwbAnnotationFinder(Archive archive, boolean
>>>checkRuntimeAnnotation)
>>>+    {
>>>+        super(archive, checkRuntimeAnnotation);
>>>+    }
>>>+
>>>+    public OwbAnnotationFinder(Archive archive)
>>>+    {
>>>+        super(archive);
>>>+    }
>>>+
>>>+    public ClassInfo getClassInfo(String className)
>>>+    {
>>>+        return classInfos.get(className);
>>>+    }
>>>+
>>>+}
>>>
>>>Modified:
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>URL:
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>==============================================================================
>>>---
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>(original)
>>>+++
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>>Sun Feb  9 22:23:28 2014
>>>@@ -19,14 +19,14 @@
>>>package org.apache.webbeans.lifecycle.test;
>>>
>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>>import org.apache.webbeans.util.Asserts;
>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>
>>>import java.net.MalformedURLException;
>>>import java.net.URL;
>>>import java.util.Collection;
>>>+import java.util.HashSet;
>>>+import java.util.Set;
>>>
>>>/**
>>>  * Used by each test.
>>>@@ -35,15 +35,18 @@ import java.util.Collection;
>>>  */
>>>public class OpenWebBeansTestMetaDataDiscoveryService extends
>>>AbstractMetaDataDiscovery
>>>{
>>>+
>>>+    private Collection<Class<?>> classes;
>>>+
>>>     public OpenWebBeansTestMetaDataDiscoveryService()
>>>     {
>>>-
>>>+        super();
>>>     }
>>>
>>>     @Override
>>>     protected void configure()
>>>     {
>>>-        //Nothing we scan
>>>+        // Nothing to scan, we add all our stuff manually...
>>>     }
>>>
>>>     /**
>>>@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
>>>      */
>>>     public void deployClasses(Collection<Class<?>> classes)
>>>     {
>>>-        if(classes != null)
>>>-        {
>>>-            archive = new CdiArchive(classes);
>>>-            finder = new AnnotationFinder(archive);
>>>-        }
>>>+        this.classes = classes;
>>>     }
>>>-
>>>+
>>>+    @Override
>>>+    public Set<Class<?>> getBeanClasses()
>>>+    {
>>>+        return new HashSet<Class<?>>(classes);
>>>+    }
>>>+
>>>     /**
>>>      * Those xmls will be scanned by container.
>>>      * @param xmls beans xmls
>>>@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
>>>
>>>         addWebBeansXmlLocation(url);
>>>     }
>>>-
>>>
>>>}
>>>
>>>Modified:
>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>URL:
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>>==============================================================================
>>>---
>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>(original)
>>>+++
>>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>>Sun Feb  9 22:23:28 2014
>>>@@ -18,14 +18,11 @@
>>>  */
>>>package org.apache.webbeans.web.scanner;
>>>
>>>-import org.apache.webbeans.config.WebBeansContext;
>>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>>import org.apache.webbeans.spi.BeanArchiveService;
>>>import org.apache.webbeans.util.ExceptionUtil;
>>>import org.apache.webbeans.util.WebBeansUtil;
>>>-import org.apache.xbean.finder.AnnotationFinder;
>>>
>>>import javax.servlet.ServletContext;
>>>import java.net.MalformedURLException;
>>>@@ -50,17 +47,6 @@ public class WebScannerService extends A
>>>     }
>>>
>>>     @Override
>>>-    protected AnnotationFinder initFinder()
>>>-    {
>>>-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
>>>-        beanArchiveService = webbeansContext.getBeanArchiveService();
>>>-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
>>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>>getBeanDeploymentUrls());
>>>-        finder = new AnnotationFinder(archive);
>>>-
>>>-        return finder;
>>>-    }
>>>-
>>>-    @Override
>>>     public void init(Object context)
>>>     {
>>>         super.init(context);
>>>
>>>
>
>

Re: Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Romain Manni-Bucau <rm...@gmail.com>.
Great, got a doubt after months without touching it, thks :)
Romain Manni-Bucau
Twitter: @rmannibucau
Blog: http://rmannibucau.wordpress.com/
LinkedIn: http://fr.linkedin.com/in/rmannibucau
Github: https://github.com/rmannibucau



2014-02-10 8:09 GMT+01:00 Mark Struberg <st...@yahoo.de>:
> I also did test this on windows and it works.
> Reason is that thi are URL.toExternalPath, which always use forward slashes on all platforms to my knowledge.
>
> Now we have no single new URL(...) anymore in our code.
>
> LieGrue,
> strub
>
>
>
>
>
> On Monday, 10 February 2014, 7:07, Romain Manni-Bucau <rm...@gmail.com> wrote:
>
> Hi Mark
>>
>>Will it work on windows or /xxx will not match?
>>---------- Message transféré ----------
>>De : <st...@apache.org>
>>Date : 9 févr. 2014 23:23
>>Objet : svn commit: r1566452 - in /openwebbeans/trunk:
>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
>>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
>>webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
>>À : <co...@openwebbeans.apache.org>
>>
>>Author: struberg
>>Date: Sun Feb  9 22:23:28 2014
>>New Revision: 1566452
>>
>>URL: http://svn.apache.org/r1566452
>>Log:
>>OWB-928 improve scanning performance
>>
>>We now take the annotation information from ASM and don't do a
>>loadClass...getAnnotations anymore
>>
>>Added:
>>
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>Modified:
>>
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>
>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>
>>Modified:
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>URL:
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>==============================================================================
>>---
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>(original)
>>+++
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>>Sun Feb  9 22:23:28 2014
>>@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
>>import org.apache.webbeans.config.OpenWebBeansConfiguration;
>>import org.apache.webbeans.config.WebBeansContext;
>>import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>import org.apache.webbeans.spi.BDABeansXmlScanner;
>>import org.apache.webbeans.spi.BeanArchiveService;
>>+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>import org.apache.webbeans.spi.ScannerService;
>>import org.apache.webbeans.util.ClassUtil;
>>import org.apache.webbeans.util.UrlSet;
>>@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
>>import org.apache.xbean.finder.ClassLoaders;
>>
>>import java.io.IOException;
>>+import java.lang.annotation.Annotation;
>>import java.net.URL;
>>import java.util.Collections;
>>import java.util.Enumeration;
>>@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
>>
>>     protected ClassLoader loader;
>>     protected CdiArchive archive;
>>-    protected AnnotationFinder finder;
>>+    protected OwbAnnotationFinder finder;
>>     protected boolean isBDAScannerEnabled = false;
>>     protected BDABeansXmlScanner bdaBeansXmlScanner;
>>+    protected final WebBeansContext webBeansContext;
>>
>>
>>+    protected AbstractMetaDataDiscovery()
>>+    {
>>+        webBeansContext = WebBeansContext.getInstance();
>>+    }
>>
>>     protected AnnotationFinder initFinder()
>>     {
>>@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
>>             return finder;
>>         }
>>
>>-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
>>         if (beanArchiveService == null)
>>         {
>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>         }
>>
>>-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>getBeanDeploymentUrls());
>>-        finder = new AnnotationFinder(archive);
>>+        archive = new CdiArchive(beanArchiveService,
>>WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
>>+        finder = new OwbAnnotationFinder(archive);
>>
>>         return finder;
>>     }
>>@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
>>                 path.contains("/idea_rt") ||
>>                 path.contains("/eclipse") ||
>>                 path.contains("/jcommander") ||
>>+                path.contains("/tomcat") ||
>>+                path.contains("/catalina") ||
>>+                path.contains("/jasper") ||
>>+                path.contains("/jsp-api") ||
>>+                path.contains("/myfaces-") ||
>>+                path.contains("/servlet-api") ||
>>+                path.contains("/javax") ||
>>+                path.contains("/annotation-api") ||
>>+                path.contains("/el-api") ||
>>+                path.contains("/mojarra") ||
>>                 path.contains("/openwebbeans-"))
>>             {
>>                 //X TODO this should be much more actually
>>@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
>>         // and also scan the bean archive!
>>         if (beanArchiveService == null)
>>         {
>>-            WebBeansContext webBeansContext =
>>WebBeansContext.getInstance();
>>+
>>             beanArchiveService = webBeansContext.getBeanArchiveService();
>>         }
>>
>>@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
>>     public Set<Class<?>> getBeanClasses()
>>     {
>>         final Set<Class<?>> classSet = new HashSet<Class<?>>();
>>-        for(String str : archive.getClasses())
>>+        for (CdiArchive.FoundClasses foundClasses :
>>archive.classesByUrl().values())
>>         {
>>-            try
>>+            boolean scanModeAnnotated =
>>BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
>>+            for(String className : foundClasses.getClassNames())
>>             {
>>-                Class<?> clazz = ClassUtil.getClassFromName(str);
>>-                if (clazz != null)
>>+                try
>>                 {
>>+                    if (scanModeAnnotated)
>>+                    {
>>+                        // in this case we need to find out whether we
>>should keep this class in the Archive
>>+                        AnnotationFinder.ClassInfo classInfo =
>>finder.getClassInfo(className);
>>+                        if (classInfo == null ||
>>!isBeanAnnotatedClass(classInfo))
>>+                        {
>>+                            continue;
>>+                        }
>>+                    }
>>
>>-                    // try to provoke a NoClassDefFoundError exception
>>which is thrown
>>-                    // if some dependencies of the class are missing
>>-                    clazz.getDeclaredFields();
>>-                    clazz.getDeclaredMethods();
>>+                    Class<?> clazz = ClassUtil.getClassFromName(className);
>>+                    if (clazz != null)
>>+                    {
>>+
>>+                        // try to provoke a NoClassDefFoundError exception
>>which is thrown
>>+                        // if some dependencies of the class are missing
>>+                        clazz.getDeclaredFields();
>>+                        clazz.getDeclaredMethods();
>>
>>-                    // we can add this class cause it has been loaded
>>completely
>>-                    classSet.add(clazz);
>>+                        // we can add this class cause it has been loaded
>>completely
>>+                        classSet.add(clazz);
>>
>>+                    }
>>                 }
>>-            }
>>-            catch (NoClassDefFoundError e)
>>-            {
>>-                if (logger.isLoggable(Level.WARNING))
>>+                catch (NoClassDefFoundError e)
>>                 {
>>-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
>>Object[] { str, e.toString() });
>>+                    if (logger.isLoggable(Level.WARNING))
>>+                    {
>>+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
>>new Object[] { className, e.toString() });
>>+                    }
>>                 }
>>             }
>>+
>>         }
>>
>>         return classSet;
>>     }
>>
>>+    /**
>>+     * This method is called for classes from bean archives with
>>+     * bean-discovery-mode 'annotated'.
>>+     *
>>+     * This method is intended to be overwritten in integration scenarios
>>and e.g.
>>+     * allows to add other criterias for keeping the class.
>>+     *
>>+     * @param classInfo
>>+     * @return true if this class should be kept and further get picked up
>>as CDI Bean
>>+     */
>>+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
>>classInfo)
>>+    {
>>+        // check whether this class has 'scope' annotations or a stereotype
>>+        for (AnnotationFinder.AnnotationInfo annotationInfo :
>>classInfo.getAnnotations())
>>+        {
>>+            if (isBeanAnnotation(annotationInfo))
>>+            {
>>+                return true;
>>+            }
>>+        }
>>+        return false;
>>+    }
>>+
>>+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
>>annotationInfo)
>>+    {
>>+        String annotationName = annotationInfo.getName();
>>+
>>+        // TODO add caches
>>+
>>+        try
>>+        {
>>+            Class<? extends Annotation> annotationType = (Class<? extends
>>Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
>>+            boolean isBeanAnnotation =
>>webBeansContext.getBeanManagerImpl().isScope(annotationType);
>>+            isBeanAnnotation = isBeanAnnotation ||
>>webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
>>+
>>+            return isBeanAnnotation;
>>+        }
>>+        catch (ClassNotFoundException e)
>>+        {
>>+            return false;
>>+        }
>>+    }
>>+
>>
>>     @Override
>>     public Set<URL> getBeanXmls()
>>
>>Modified:
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>URL:
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>==============================================================================
>>---
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>(original)
>>+++
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>>Sun Feb  9 22:23:28 2014
>>@@ -18,11 +18,8 @@
>>  */
>>package org.apache.webbeans.corespi.scanner.xbean;
>>
>>-import java.lang.annotation.Annotation;
>>import java.util.List;
>>-import java.util.Set;
>>
>>-import org.apache.webbeans.container.BeanManagerImpl;
>>import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>>import org.apache.xbean.finder.filter.Filter;
>>@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
>>  */
>>public class BeanArchiveFilter implements Filter
>>{
>>-    private final ClassLoader loader;
>>-    private final BeanManagerImpl beanManager;
>>     private final BeanArchiveInformation beanArchiveInfo;
>>-    private final boolean scanAll;
>>     private final boolean scanNone;
>>-    private final boolean scanAnnotated;
>>
>>     private List<String> urlClasses;
>>-    private Set<String> allClasses;
>>
>>-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
>>beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
>>urlClasses, Set<String> allClasses)
>>+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
>>List<String> urlClasses)
>>     {
>>-        this.loader = loader;
>>-        this.beanManager = beanManager;
>>         this.beanArchiveInfo = beanArchiveInfo;
>>         this.urlClasses = urlClasses;
>>-        this.allClasses = allClasses;
>>         BeanDiscoveryMode discoveryMode =
>>beanArchiveInfo.getBeanDiscoveryMode();
>>
>>-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
>>         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
>>-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
>>     }
>>
>>     @Override
>>@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
>>             return false;
>>         }
>>
>>-        if (scanAll)
>>-        {
>>-            urlClasses.add(name);
>>-            allClasses.add(name);
>>-            return true;
>>-        }
>>-
>>-        if (scanAnnotated)
>>-        {
>>-            try
>>-            {
>>-                Class clazz = Class.forName(name, false, loader);
>>-                if (!hasScopeAnnotation(clazz.getAnnotations()))
>>-                {
>>-                    return false;
>>-                }
>>-            }
>>-            catch (ClassNotFoundException cnfe)
>>-            {
>>-                // not a problem, just ignore this class
>>-                return false;
>>-            }
>>-            catch (NoClassDefFoundError ncdf)
>>-            {
>>-                // not a problem, just ignore this class
>>-                return false;
>>-            }
>>-
>>             urlClasses.add(name);
>>-            allClasses.add(name);
>>             return true;
>>-        }
>>-
>>-        return false;
>>     }
>>
>>-    private boolean hasScopeAnnotation(Annotation[] annotations)
>>-    {
>>-        for (Annotation annotation : annotations)
>>-        {
>>-            if (beanManager.isScope(annotation.annotationType()))
>>-            {
>>-                return true;
>>-            }
>>-        }
>>-        return false;
>>-    }
>>}
>>
>>Modified:
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>URL:
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>==============================================================================
>>---
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>(original)
>>+++
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>>Sun Feb  9 22:23:28 2014
>>@@ -18,14 +18,12 @@
>>  */
>>package org.apache.webbeans.corespi.scanner.xbean;
>>
>>-import org.apache.webbeans.container.BeanManagerImpl;
>>import org.apache.webbeans.spi.BeanArchiveService;
>>+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>>import org.apache.xbean.finder.archive.Archive;
>>-import org.apache.xbean.finder.archive.ClassesArchive;
>>import org.apache.xbean.finder.archive.ClasspathArchive;
>>import org.apache.xbean.finder.archive.CompositeArchive;
>>import org.apache.xbean.finder.archive.FilteredArchive;
>>-import org.apache.xbean.finder.filter.Filter;
>>
>>import java.io.IOException;
>>import java.io.InputStream;
>>@@ -33,11 +31,9 @@ import java.net.URL;
>>import java.util.ArrayList;
>>import java.util.Collection;
>>import java.util.HashMap;
>>-import java.util.HashSet;
>>import java.util.Iterator;
>>import java.util.List;
>>import java.util.Map;
>>-import java.util.Set;
>>
>>/**
>>  * this delegate pattern is interesting
>>@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
>>      */
>>     private final Map<String, FoundClasses> classesByUrl = new
>>HashMap<String, FoundClasses>();
>>
>>-    private final Set<String> allClasses = new HashSet<String>();
>>     private final Archive delegate;
>>
>>-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
>>beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
>>+    public CdiArchive(BeanArchiveService beanArchiveService, final
>>ClassLoader loader, final Map<String, URL> urls)
>>     {
>>         final Collection<Archive> archives = new ArrayList<Archive>();
>>         for (final URL url : urls.values())
>>         {
>>             final List<String> urlClasses = new ArrayList<String>();
>>
>>-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
>>beanArchiveService.getBeanArchiveInformation(url);
>>+            BeanArchiveInformation beanArchiveInfo =
>>beanArchiveService.getBeanArchiveInformation(url);
>>             final Archive archive = new
>>FilteredArchive(ClasspathArchive.archive(loader, url),
>>-                    new BeanArchiveFilter(loader, beanManager,
>>beanArchiveInfo, urlClasses, allClasses));
>>+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
>>
>>-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>urlClasses));
>>+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>>urlClasses, beanArchiveInfo));
>>             archives.add(archive);
>>         }
>>
>>         delegate = new CompositeArchive(archives);
>>     }
>>
>>-    public CdiArchive(final Collection<Class<?>> classList)
>>-    {
>>-        delegate = new FilteredArchive(new ClassesArchive(classList), new
>>Filter()
>>-        {
>>-            @Override
>>-            public boolean accept(final String name)
>>-            {
>>-                allClasses.add(name);
>>-                return true;
>>-            }
>>-        });
>>-    }
>>-
>>-    public Set<String> getClasses()
>>-    {
>>-        return allClasses;
>>-    }
>>-
>>     public Map<String, FoundClasses> classesByUrl()
>>     {
>>         return classesByUrl;
>>@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
>>     {
>>         private URL url;
>>         private Collection<String> classNames;
>>+        private BeanArchiveInformation beanArchiveInfo;
>>
>>-        public FoundClasses(URL url, Collection<String> classNames)
>>+        public FoundClasses(URL url, Collection<String> classNames,
>>BeanArchiveInformation beanArchiveInfo)
>>         {
>>             this.url = url;
>>             this.classNames = classNames;
>>+            this.beanArchiveInfo = beanArchiveInfo;
>>         }
>>
>>         public URL getUrl()
>>@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
>>             return url;
>>         }
>>
>>+        public BeanArchiveInformation getBeanArchiveInfo()
>>+        {
>>+            return beanArchiveInfo;
>>+        }
>>+
>>         public Collection<String> getClassNames()
>>         {
>>             return classNames;
>>
>>Added:
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>URL:
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
>>==============================================================================
>>---
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>(added)
>>+++
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>>Sun Feb  9 22:23:28 2014
>>@@ -0,0 +1,45 @@
>>+/*
>>+ * Licensed to the Apache Software Foundation (ASF) under one
>>+ * or more contributor license agreements. See the NOTICE file
>>+ * distributed with this work for additional information
>>+ * regarding copyright ownership. The ASF licenses this file
>>+ * to you under the Apache License, Version 2.0 (the
>>+ * "License"); you may not use this file except in compliance
>>+ * with the License. You may obtain a copy of the License at
>>+ *
>>+ * http://www.apache.org/licenses/LICENSE-2.0
>>+ *
>>+ * Unless required by applicable law or agreed to in writing,
>>+ * software distributed under the License is distributed on an
>>+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>+ * KIND, either express or implied. See the License for the
>>+ * specific language governing permissions and limitations
>>+ * under the License.
>>+ */
>>+package org.apache.webbeans.corespi.scanner.xbean;
>>+
>>+import org.apache.xbean.finder.AnnotationFinder;
>>+import org.apache.xbean.finder.archive.Archive;
>>+
>>+/**
>>+ * We just extend the default AnnotationFinder to get Access to the
>>original ClassInfo
>>+ * for not having to call loadClass so often...
>>+ */
>>+public class OwbAnnotationFinder extends AnnotationFinder
>>+{
>>+    public OwbAnnotationFinder(Archive archive, boolean
>>checkRuntimeAnnotation)
>>+    {
>>+        super(archive, checkRuntimeAnnotation);
>>+    }
>>+
>>+    public OwbAnnotationFinder(Archive archive)
>>+    {
>>+        super(archive);
>>+    }
>>+
>>+    public ClassInfo getClassInfo(String className)
>>+    {
>>+        return classInfos.get(className);
>>+    }
>>+
>>+}
>>
>>Modified:
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>URL:
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>==============================================================================
>>---
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>(original)
>>+++
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>>Sun Feb  9 22:23:28 2014
>>@@ -19,14 +19,14 @@
>>package org.apache.webbeans.lifecycle.test;
>>
>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>import org.apache.webbeans.exception.WebBeansDeploymentException;
>>import org.apache.webbeans.util.Asserts;
>>-import org.apache.xbean.finder.AnnotationFinder;
>>
>>import java.net.MalformedURLException;
>>import java.net.URL;
>>import java.util.Collection;
>>+import java.util.HashSet;
>>+import java.util.Set;
>>
>>/**
>>  * Used by each test.
>>@@ -35,15 +35,18 @@ import java.util.Collection;
>>  */
>>public class OpenWebBeansTestMetaDataDiscoveryService extends
>>AbstractMetaDataDiscovery
>>{
>>+
>>+    private Collection<Class<?>> classes;
>>+
>>     public OpenWebBeansTestMetaDataDiscoveryService()
>>     {
>>-
>>+        super();
>>     }
>>
>>     @Override
>>     protected void configure()
>>     {
>>-        //Nothing we scan
>>+        // Nothing to scan, we add all our stuff manually...
>>     }
>>
>>     /**
>>@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
>>      */
>>     public void deployClasses(Collection<Class<?>> classes)
>>     {
>>-        if(classes != null)
>>-        {
>>-            archive = new CdiArchive(classes);
>>-            finder = new AnnotationFinder(archive);
>>-        }
>>+        this.classes = classes;
>>     }
>>-
>>+
>>+    @Override
>>+    public Set<Class<?>> getBeanClasses()
>>+    {
>>+        return new HashSet<Class<?>>(classes);
>>+    }
>>+
>>     /**
>>      * Those xmls will be scanned by container.
>>      * @param xmls beans xmls
>>@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
>>
>>         addWebBeansXmlLocation(url);
>>     }
>>-
>>
>>}
>>
>>Modified:
>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>URL:
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>>==============================================================================
>>---
>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>(original)
>>+++
>>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>>Sun Feb  9 22:23:28 2014
>>@@ -18,14 +18,11 @@
>>  */
>>package org.apache.webbeans.web.scanner;
>>
>>-import org.apache.webbeans.config.WebBeansContext;
>>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>>import org.apache.webbeans.spi.BeanArchiveService;
>>import org.apache.webbeans.util.ExceptionUtil;
>>import org.apache.webbeans.util.WebBeansUtil;
>>-import org.apache.xbean.finder.AnnotationFinder;
>>
>>import javax.servlet.ServletContext;
>>import java.net.MalformedURLException;
>>@@ -50,17 +47,6 @@ public class WebScannerService extends A
>>     }
>>
>>     @Override
>>-    protected AnnotationFinder initFinder()
>>-    {
>>-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
>>-        beanArchiveService = webbeansContext.getBeanArchiveService();
>>-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
>>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>>getBeanDeploymentUrls());
>>-        finder = new AnnotationFinder(archive);
>>-
>>-        return finder;
>>-    }
>>-
>>-    @Override
>>     public void init(Object context)
>>     {
>>         super.init(context);
>>
>>

Re: Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Mark Struberg <st...@yahoo.de>.
I also did test this on windows and it works.
Reason is that thi are URL.toExternalPath, which always use forward slashes on all platforms to my knowledge.

Now we have no single new URL(...) anymore in our code.

LieGrue,
strub





On Monday, 10 February 2014, 7:07, Romain Manni-Bucau <rm...@gmail.com> wrote:
 
Hi Mark
>
>Will it work on windows or /xxx will not match?
>---------- Message transféré ----------
>De : <st...@apache.org>
>Date : 9 févr. 2014 23:23
>Objet : svn commit: r1566452 - in /openwebbeans/trunk:
>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
>webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
>webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
>À : <co...@openwebbeans.apache.org>
>
>Author: struberg
>Date: Sun Feb  9 22:23:28 2014
>New Revision: 1566452
>
>URL: http://svn.apache.org/r1566452
>Log:
>OWB-928 improve scanning performance
>
>We now take the annotation information from ASM and don't do a
>loadClass...getAnnotations anymore
>
>Added:
>
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>Modified:
>
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>
>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>
>Modified:
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>URL:
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>==============================================================================
>---
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>(original)
>+++
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
>Sun Feb  9 22:23:28 2014
>@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
>import org.apache.webbeans.config.OpenWebBeansConfiguration;
>import org.apache.webbeans.config.WebBeansContext;
>import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
>import org.apache.webbeans.exception.WebBeansDeploymentException;
>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>import org.apache.webbeans.spi.BDABeansXmlScanner;
>import org.apache.webbeans.spi.BeanArchiveService;
>+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>import org.apache.webbeans.spi.ScannerService;
>import org.apache.webbeans.util.ClassUtil;
>import org.apache.webbeans.util.UrlSet;
>@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
>import org.apache.xbean.finder.ClassLoaders;
>
>import java.io.IOException;
>+import java.lang.annotation.Annotation;
>import java.net.URL;
>import java.util.Collections;
>import java.util.Enumeration;
>@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi
>
>     protected ClassLoader loader;
>     protected CdiArchive archive;
>-    protected AnnotationFinder finder;
>+    protected OwbAnnotationFinder finder;
>     protected boolean isBDAScannerEnabled = false;
>     protected BDABeansXmlScanner bdaBeansXmlScanner;
>+    protected final WebBeansContext webBeansContext;
>
>
>+    protected AbstractMetaDataDiscovery()
>+    {
>+        webBeansContext = WebBeansContext.getInstance();
>+    }
>
>     protected AnnotationFinder initFinder()
>     {
>@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
>             return finder;
>         }
>
>-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
>         if (beanArchiveService == null)
>         {
>             beanArchiveService = webBeansContext.getBeanArchiveService();
>         }
>
>-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>getBeanDeploymentUrls());
>-        finder = new AnnotationFinder(archive);
>+        archive = new CdiArchive(beanArchiveService,
>WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
>+        finder = new OwbAnnotationFinder(archive);
>
>         return finder;
>     }
>@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
>                 path.contains("/idea_rt") ||
>                 path.contains("/eclipse") ||
>                 path.contains("/jcommander") ||
>+                path.contains("/tomcat") ||
>+                path.contains("/catalina") ||
>+                path.contains("/jasper") ||
>+                path.contains("/jsp-api") ||
>+                path.contains("/myfaces-") ||
>+                path.contains("/servlet-api") ||
>+                path.contains("/javax") ||
>+                path.contains("/annotation-api") ||
>+                path.contains("/el-api") ||
>+                path.contains("/mojarra") ||
>                 path.contains("/openwebbeans-"))
>             {
>                 //X TODO this should be much more actually
>@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
>         // and also scan the bean archive!
>         if (beanArchiveService == null)
>         {
>-            WebBeansContext webBeansContext =
>WebBeansContext.getInstance();
>+
>             beanArchiveService = webBeansContext.getBeanArchiveService();
>         }
>
>@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
>     public Set<Class<?>> getBeanClasses()
>     {
>         final Set<Class<?>> classSet = new HashSet<Class<?>>();
>-        for(String str : archive.getClasses())
>+        for (CdiArchive.FoundClasses foundClasses :
>archive.classesByUrl().values())
>         {
>-            try
>+            boolean scanModeAnnotated =
>BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
>+            for(String className : foundClasses.getClassNames())
>             {
>-                Class<?> clazz = ClassUtil.getClassFromName(str);
>-                if (clazz != null)
>+                try
>                 {
>+                    if (scanModeAnnotated)
>+                    {
>+                        // in this case we need to find out whether we
>should keep this class in the Archive
>+                        AnnotationFinder.ClassInfo classInfo =
>finder.getClassInfo(className);
>+                        if (classInfo == null ||
>!isBeanAnnotatedClass(classInfo))
>+                        {
>+                            continue;
>+                        }
>+                    }
>
>-                    // try to provoke a NoClassDefFoundError exception
>which is thrown
>-                    // if some dependencies of the class are missing
>-                    clazz.getDeclaredFields();
>-                    clazz.getDeclaredMethods();
>+                    Class<?> clazz = ClassUtil.getClassFromName(className);
>+                    if (clazz != null)
>+                    {
>+
>+                        // try to provoke a NoClassDefFoundError exception
>which is thrown
>+                        // if some dependencies of the class are missing
>+                        clazz.getDeclaredFields();
>+                        clazz.getDeclaredMethods();
>
>-                    // we can add this class cause it has been loaded
>completely
>-                    classSet.add(clazz);
>+                        // we can add this class cause it has been loaded
>completely
>+                        classSet.add(clazz);
>
>+                    }
>                 }
>-            }
>-            catch (NoClassDefFoundError e)
>-            {
>-                if (logger.isLoggable(Level.WARNING))
>+                catch (NoClassDefFoundError e)
>                 {
>-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
>Object[] { str, e.toString() });
>+                    if (logger.isLoggable(Level.WARNING))
>+                    {
>+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
>new Object[] { className, e.toString() });
>+                    }
>                 }
>             }
>+
>         }
>
>         return classSet;
>     }
>
>+    /**
>+     * This method is called for classes from bean archives with
>+     * bean-discovery-mode 'annotated'.
>+     *
>+     * This method is intended to be overwritten in integration scenarios
>and e.g.
>+     * allows to add other criterias for keeping the class.
>+     *
>+     * @param classInfo
>+     * @return true if this class should be kept and further get picked up
>as CDI Bean
>+     */
>+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
>classInfo)
>+    {
>+        // check whether this class has 'scope' annotations or a stereotype
>+        for (AnnotationFinder.AnnotationInfo annotationInfo :
>classInfo.getAnnotations())
>+        {
>+            if (isBeanAnnotation(annotationInfo))
>+            {
>+                return true;
>+            }
>+        }
>+        return false;
>+    }
>+
>+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
>annotationInfo)
>+    {
>+        String annotationName = annotationInfo.getName();
>+
>+        // TODO add caches
>+
>+        try
>+        {
>+            Class<? extends Annotation> annotationType = (Class<? extends
>Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
>+            boolean isBeanAnnotation =
>webBeansContext.getBeanManagerImpl().isScope(annotationType);
>+            isBeanAnnotation = isBeanAnnotation ||
>webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
>+
>+            return isBeanAnnotation;
>+        }
>+        catch (ClassNotFoundException e)
>+        {
>+            return false;
>+        }
>+    }
>+
>
>     @Override
>     public Set<URL> getBeanXmls()
>
>Modified:
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>URL:
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>==============================================================================
>---
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>(original)
>+++
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
>Sun Feb  9 22:23:28 2014
>@@ -18,11 +18,8 @@
>  */
>package org.apache.webbeans.corespi.scanner.xbean;
>
>-import java.lang.annotation.Annotation;
>import java.util.List;
>-import java.util.Set;
>
>-import org.apache.webbeans.container.BeanManagerImpl;
>import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
>import org.apache.xbean.finder.filter.Filter;
>@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
>  */
>public class BeanArchiveFilter implements Filter
>{
>-    private final ClassLoader loader;
>-    private final BeanManagerImpl beanManager;
>     private final BeanArchiveInformation beanArchiveInfo;
>-    private final boolean scanAll;
>     private final boolean scanNone;
>-    private final boolean scanAnnotated;
>
>     private List<String> urlClasses;
>-    private Set<String> allClasses;
>
>-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
>beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
>urlClasses, Set<String> allClasses)
>+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
>List<String> urlClasses)
>     {
>-        this.loader = loader;
>-        this.beanManager = beanManager;
>         this.beanArchiveInfo = beanArchiveInfo;
>         this.urlClasses = urlClasses;
>-        this.allClasses = allClasses;
>         BeanDiscoveryMode discoveryMode =
>beanArchiveInfo.getBeanDiscoveryMode();
>
>-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
>         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
>-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
>     }
>
>     @Override
>@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
>             return false;
>         }
>
>-        if (scanAll)
>-        {
>-            urlClasses.add(name);
>-            allClasses.add(name);
>-            return true;
>-        }
>-
>-        if (scanAnnotated)
>-        {
>-            try
>-            {
>-                Class clazz = Class.forName(name, false, loader);
>-                if (!hasScopeAnnotation(clazz.getAnnotations()))
>-                {
>-                    return false;
>-                }
>-            }
>-            catch (ClassNotFoundException cnfe)
>-            {
>-                // not a problem, just ignore this class
>-                return false;
>-            }
>-            catch (NoClassDefFoundError ncdf)
>-            {
>-                // not a problem, just ignore this class
>-                return false;
>-            }
>-
>             urlClasses.add(name);
>-            allClasses.add(name);
>             return true;
>-        }
>-
>-        return false;
>     }
>
>-    private boolean hasScopeAnnotation(Annotation[] annotations)
>-    {
>-        for (Annotation annotation : annotations)
>-        {
>-            if (beanManager.isScope(annotation.annotationType()))
>-            {
>-                return true;
>-            }
>-        }
>-        return false;
>-    }
>}
>
>Modified:
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>URL:
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>==============================================================================
>---
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>(original)
>+++
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
>Sun Feb  9 22:23:28 2014
>@@ -18,14 +18,12 @@
>  */
>package org.apache.webbeans.corespi.scanner.xbean;
>
>-import org.apache.webbeans.container.BeanManagerImpl;
>import org.apache.webbeans.spi.BeanArchiveService;
>+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
>import org.apache.xbean.finder.archive.Archive;
>-import org.apache.xbean.finder.archive.ClassesArchive;
>import org.apache.xbean.finder.archive.ClasspathArchive;
>import org.apache.xbean.finder.archive.CompositeArchive;
>import org.apache.xbean.finder.archive.FilteredArchive;
>-import org.apache.xbean.finder.filter.Filter;
>
>import java.io.IOException;
>import java.io.InputStream;
>@@ -33,11 +31,9 @@ import java.net.URL;
>import java.util.ArrayList;
>import java.util.Collection;
>import java.util.HashMap;
>-import java.util.HashSet;
>import java.util.Iterator;
>import java.util.List;
>import java.util.Map;
>-import java.util.Set;
>
>/**
>  * this delegate pattern is interesting
>@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
>      */
>     private final Map<String, FoundClasses> classesByUrl = new
>HashMap<String, FoundClasses>();
>
>-    private final Set<String> allClasses = new HashSet<String>();
>     private final Archive delegate;
>
>-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
>beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
>+    public CdiArchive(BeanArchiveService beanArchiveService, final
>ClassLoader loader, final Map<String, URL> urls)
>     {
>         final Collection<Archive> archives = new ArrayList<Archive>();
>         for (final URL url : urls.values())
>         {
>             final List<String> urlClasses = new ArrayList<String>();
>
>-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
>beanArchiveService.getBeanArchiveInformation(url);
>+            BeanArchiveInformation beanArchiveInfo =
>beanArchiveService.getBeanArchiveInformation(url);
>             final Archive archive = new
>FilteredArchive(ClasspathArchive.archive(loader, url),
>-                    new BeanArchiveFilter(loader, beanManager,
>beanArchiveInfo, urlClasses, allClasses));
>+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));
>
>-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>urlClasses));
>+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
>urlClasses, beanArchiveInfo));
>             archives.add(archive);
>         }
>
>         delegate = new CompositeArchive(archives);
>     }
>
>-    public CdiArchive(final Collection<Class<?>> classList)
>-    {
>-        delegate = new FilteredArchive(new ClassesArchive(classList), new
>Filter()
>-        {
>-            @Override
>-            public boolean accept(final String name)
>-            {
>-                allClasses.add(name);
>-                return true;
>-            }
>-        });
>-    }
>-
>-    public Set<String> getClasses()
>-    {
>-        return allClasses;
>-    }
>-
>     public Map<String, FoundClasses> classesByUrl()
>     {
>         return classesByUrl;
>@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
>     {
>         private URL url;
>         private Collection<String> classNames;
>+        private BeanArchiveInformation beanArchiveInfo;
>
>-        public FoundClasses(URL url, Collection<String> classNames)
>+        public FoundClasses(URL url, Collection<String> classNames,
>BeanArchiveInformation beanArchiveInfo)
>         {
>             this.url = url;
>             this.classNames = classNames;
>+            this.beanArchiveInfo = beanArchiveInfo;
>         }
>
>         public URL getUrl()
>@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
>             return url;
>         }
>
>+        public BeanArchiveInformation getBeanArchiveInfo()
>+        {
>+            return beanArchiveInfo;
>+        }
>+
>         public Collection<String> getClassNames()
>         {
>             return classNames;
>
>Added:
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>URL:
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
>==============================================================================
>---
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>(added)
>+++
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
>Sun Feb  9 22:23:28 2014
>@@ -0,0 +1,45 @@
>+/*
>+ * Licensed to the Apache Software Foundation (ASF) under one
>+ * or more contributor license agreements. See the NOTICE file
>+ * distributed with this work for additional information
>+ * regarding copyright ownership. The ASF licenses this file
>+ * to you under the Apache License, Version 2.0 (the
>+ * "License"); you may not use this file except in compliance
>+ * with the License. You may obtain a copy of the License at
>+ *
>+ * http://www.apache.org/licenses/LICENSE-2.0
>+ *
>+ * Unless required by applicable law or agreed to in writing,
>+ * software distributed under the License is distributed on an
>+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>+ * KIND, either express or implied. See the License for the
>+ * specific language governing permissions and limitations
>+ * under the License.
>+ */
>+package org.apache.webbeans.corespi.scanner.xbean;
>+
>+import org.apache.xbean.finder.AnnotationFinder;
>+import org.apache.xbean.finder.archive.Archive;
>+
>+/**
>+ * We just extend the default AnnotationFinder to get Access to the
>original ClassInfo
>+ * for not having to call loadClass so often...
>+ */
>+public class OwbAnnotationFinder extends AnnotationFinder
>+{
>+    public OwbAnnotationFinder(Archive archive, boolean
>checkRuntimeAnnotation)
>+    {
>+        super(archive, checkRuntimeAnnotation);
>+    }
>+
>+    public OwbAnnotationFinder(Archive archive)
>+    {
>+        super(archive);
>+    }
>+
>+    public ClassInfo getClassInfo(String className)
>+    {
>+        return classInfos.get(className);
>+    }
>+
>+}
>
>Modified:
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>URL:
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>==============================================================================
>---
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>(original)
>+++
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
>Sun Feb  9 22:23:28 2014
>@@ -19,14 +19,14 @@
>package org.apache.webbeans.lifecycle.test;
>
>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>import org.apache.webbeans.exception.WebBeansDeploymentException;
>import org.apache.webbeans.util.Asserts;
>-import org.apache.xbean.finder.AnnotationFinder;
>
>import java.net.MalformedURLException;
>import java.net.URL;
>import java.util.Collection;
>+import java.util.HashSet;
>+import java.util.Set;
>
>/**
>  * Used by each test.
>@@ -35,15 +35,18 @@ import java.util.Collection;
>  */
>public class OpenWebBeansTestMetaDataDiscoveryService extends
>AbstractMetaDataDiscovery
>{
>+
>+    private Collection<Class<?>> classes;
>+
>     public OpenWebBeansTestMetaDataDiscoveryService()
>     {
>-
>+        super();
>     }
>
>     @Override
>     protected void configure()
>     {
>-        //Nothing we scan
>+        // Nothing to scan, we add all our stuff manually...
>     }
>
>     /**
>@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
>      */
>     public void deployClasses(Collection<Class<?>> classes)
>     {
>-        if(classes != null)
>-        {
>-            archive = new CdiArchive(classes);
>-            finder = new AnnotationFinder(archive);
>-        }
>+        this.classes = classes;
>     }
>-
>+
>+    @Override
>+    public Set<Class<?>> getBeanClasses()
>+    {
>+        return new HashSet<Class<?>>(classes);
>+    }
>+
>     /**
>      * Those xmls will be scanned by container.
>      * @param xmls beans xmls
>@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis
>
>         addWebBeansXmlLocation(url);
>     }
>-
>
>}
>
>Modified:
>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>URL:
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
>==============================================================================
>---
>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>(original)
>+++
>openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
>Sun Feb  9 22:23:28 2014
>@@ -18,14 +18,11 @@
>  */
>package org.apache.webbeans.web.scanner;
>
>-import org.apache.webbeans.config.WebBeansContext;
>import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
>-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
>import org.apache.webbeans.logger.WebBeansLoggerFacade;
>import org.apache.webbeans.spi.BeanArchiveService;
>import org.apache.webbeans.util.ExceptionUtil;
>import org.apache.webbeans.util.WebBeansUtil;
>-import org.apache.xbean.finder.AnnotationFinder;
>
>import javax.servlet.ServletContext;
>import java.net.MalformedURLException;
>@@ -50,17 +47,6 @@ public class WebScannerService extends A
>     }
>
>     @Override
>-    protected AnnotationFinder initFinder()
>-    {
>-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
>-        beanArchiveService = webbeansContext.getBeanArchiveService();
>-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
>beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
>getBeanDeploymentUrls());
>-        finder = new AnnotationFinder(archive);
>-
>-        return finder;
>-    }
>-
>-    @Override
>     public void init(Object context)
>     {
>         super.init(context);
>
>

Fwd: svn commit: r1566452 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/ webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/ webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...

Posted by Romain Manni-Bucau <rm...@gmail.com>.
Hi Mark

Will it work on windows or /xxx will not match?
---------- Message transféré ----------
De : <st...@apache.org>
Date : 9 févr. 2014 23:23
Objet : svn commit: r1566452 - in /openwebbeans/trunk:
webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/
webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/
webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/ webbe...
À : <co...@openwebbeans.apache.org>

Author: struberg
Date: Sun Feb  9 22:23:28 2014
New Revision: 1566452

URL: http://svn.apache.org/r1566452
Log:
OWB-928 improve scanning performance

We now take the annotation information from ASM and don't do a
loadClass...getAnnotations anymore

Added:

openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
Modified:

openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java

openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java

openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java

openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java

openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java

Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
Sun Feb  9 22:23:28 2014
@@ -23,10 +23,12 @@ import org.apache.webbeans.config.OWBLog
 import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
 import org.apache.webbeans.exception.WebBeansDeploymentException;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.BDABeansXmlScanner;
 import org.apache.webbeans.spi.BeanArchiveService;
+import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
 import org.apache.webbeans.spi.ScannerService;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.UrlSet;
@@ -35,6 +37,7 @@ import org.apache.xbean.finder.Annotatio
 import org.apache.xbean.finder.ClassLoaders;

 import java.io.IOException;
+import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -75,11 +78,16 @@ public abstract class AbstractMetaDataDi

     protected ClassLoader loader;
     protected CdiArchive archive;
-    protected AnnotationFinder finder;
+    protected OwbAnnotationFinder finder;
     protected boolean isBDAScannerEnabled = false;
     protected BDABeansXmlScanner bdaBeansXmlScanner;
+    protected final WebBeansContext webBeansContext;


+    protected AbstractMetaDataDiscovery()
+    {
+        webBeansContext = WebBeansContext.getInstance();
+    }

     protected AnnotationFinder initFinder()
     {
@@ -88,14 +96,13 @@ public abstract class AbstractMetaDataDi
             return finder;
         }

-        WebBeansContext webBeansContext = WebBeansContext.getInstance();
         if (beanArchiveService == null)
         {
             beanArchiveService = webBeansContext.getBeanArchiveService();
         }

-        archive = new CdiArchive(webBeansContext.getBeanManagerImpl(),
beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
getBeanDeploymentUrls());
-        finder = new AnnotationFinder(archive);
+        archive = new CdiArchive(beanArchiveService,
WebBeansUtil.getCurrentClassLoader(), getBeanDeploymentUrls());
+        finder = new OwbAnnotationFinder(archive);

         return finder;
     }
@@ -250,6 +257,16 @@ public abstract class AbstractMetaDataDi
                 path.contains("/idea_rt") ||
                 path.contains("/eclipse") ||
                 path.contains("/jcommander") ||
+                path.contains("/tomcat") ||
+                path.contains("/catalina") ||
+                path.contains("/jasper") ||
+                path.contains("/jsp-api") ||
+                path.contains("/myfaces-") ||
+                path.contains("/servlet-api") ||
+                path.contains("/javax") ||
+                path.contains("/annotation-api") ||
+                path.contains("/el-api") ||
+                path.contains("/mojarra") ||
                 path.contains("/openwebbeans-"))
             {
                 //X TODO this should be much more actually
@@ -316,7 +333,7 @@ public abstract class AbstractMetaDataDi
         // and also scan the bean archive!
         if (beanArchiveService == null)
         {
-            WebBeansContext webBeansContext =
WebBeansContext.getInstance();
+
             beanArchiveService = webBeansContext.getBeanArchiveService();
         }

@@ -330,36 +347,94 @@ public abstract class AbstractMetaDataDi
     public Set<Class<?>> getBeanClasses()
     {
         final Set<Class<?>> classSet = new HashSet<Class<?>>();
-        for(String str : archive.getClasses())
+        for (CdiArchive.FoundClasses foundClasses :
archive.classesByUrl().values())
         {
-            try
+            boolean scanModeAnnotated =
BeanDiscoveryMode.ANNOTATED.equals(foundClasses.getBeanArchiveInfo().getBeanDiscoveryMode());
+            for(String className : foundClasses.getClassNames())
             {
-                Class<?> clazz = ClassUtil.getClassFromName(str);
-                if (clazz != null)
+                try
                 {
+                    if (scanModeAnnotated)
+                    {
+                        // in this case we need to find out whether we
should keep this class in the Archive
+                        AnnotationFinder.ClassInfo classInfo =
finder.getClassInfo(className);
+                        if (classInfo == null ||
!isBeanAnnotatedClass(classInfo))
+                        {
+                            continue;
+                        }
+                    }

-                    // try to provoke a NoClassDefFoundError exception
which is thrown
-                    // if some dependencies of the class are missing
-                    clazz.getDeclaredFields();
-                    clazz.getDeclaredMethods();
+                    Class<?> clazz = ClassUtil.getClassFromName(className);
+                    if (clazz != null)
+                    {
+
+                        // try to provoke a NoClassDefFoundError exception
which is thrown
+                        // if some dependencies of the class are missing
+                        clazz.getDeclaredFields();
+                        clazz.getDeclaredMethods();

-                    // we can add this class cause it has been loaded
completely
-                    classSet.add(clazz);
+                        // we can add this class cause it has been loaded
completely
+                        classSet.add(clazz);

+                    }
                 }
-            }
-            catch (NoClassDefFoundError e)
-            {
-                if (logger.isLoggable(Level.WARNING))
+                catch (NoClassDefFoundError e)
                 {
-                    logger.log(Level.WARNING, OWBLogConst.WARN_0018, new
Object[] { str, e.toString() });
+                    if (logger.isLoggable(Level.WARNING))
+                    {
+                        logger.log(Level.WARNING, OWBLogConst.WARN_0018,
new Object[] { className, e.toString() });
+                    }
                 }
             }
+
         }

         return classSet;
     }

+    /**
+     * This method is called for classes from bean archives with
+     * bean-discovery-mode 'annotated'.
+     *
+     * This method is intended to be overwritten in integration scenarios
and e.g.
+     * allows to add other criterias for keeping the class.
+     *
+     * @param classInfo
+     * @return true if this class should be kept and further get picked up
as CDI Bean
+     */
+    protected boolean isBeanAnnotatedClass(AnnotationFinder.ClassInfo
classInfo)
+    {
+        // check whether this class has 'scope' annotations or a stereotype
+        for (AnnotationFinder.AnnotationInfo annotationInfo :
classInfo.getAnnotations())
+        {
+            if (isBeanAnnotation(annotationInfo))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected boolean isBeanAnnotation(AnnotationFinder.AnnotationInfo
annotationInfo)
+    {
+        String annotationName = annotationInfo.getName();
+
+        // TODO add caches
+
+        try
+        {
+            Class<? extends Annotation> annotationType = (Class<? extends
Annotation>) WebBeansUtil.getCurrentClassLoader().loadClass(annotationName);
+            boolean isBeanAnnotation =
webBeansContext.getBeanManagerImpl().isScope(annotationType);
+            isBeanAnnotation = isBeanAnnotation ||
webBeansContext.getBeanManagerImpl().isStereotype(annotationType);
+
+            return isBeanAnnotation;
+        }
+        catch (ClassNotFoundException e)
+        {
+            return false;
+        }
+    }
+

     @Override
     public Set<URL> getBeanXmls()

Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/BeanArchiveFilter.java
Sun Feb  9 22:23:28 2014
@@ -18,11 +18,8 @@
  */
 package org.apache.webbeans.corespi.scanner.xbean;

-import java.lang.annotation.Annotation;
 import java.util.List;
-import java.util.Set;

-import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
 import org.apache.webbeans.spi.BeanArchiveService.BeanDiscoveryMode;
 import org.apache.xbean.finder.filter.Filter;
@@ -32,28 +29,18 @@ import org.apache.xbean.finder.filter.Fi
  */
 public class BeanArchiveFilter implements Filter
 {
-    private final ClassLoader loader;
-    private final BeanManagerImpl beanManager;
     private final BeanArchiveInformation beanArchiveInfo;
-    private final boolean scanAll;
     private final boolean scanNone;
-    private final boolean scanAnnotated;

     private List<String> urlClasses;
-    private Set<String> allClasses;

-    public BeanArchiveFilter(ClassLoader loader, BeanManagerImpl
beanManager, BeanArchiveInformation beanArchiveInfo, List<String>
urlClasses, Set<String> allClasses)
+    public BeanArchiveFilter(BeanArchiveInformation beanArchiveInfo,
List<String> urlClasses)
     {
-        this.loader = loader;
-        this.beanManager = beanManager;
         this.beanArchiveInfo = beanArchiveInfo;
         this.urlClasses = urlClasses;
-        this.allClasses = allClasses;
         BeanDiscoveryMode discoveryMode =
beanArchiveInfo.getBeanDiscoveryMode();

-        scanAll = BeanDiscoveryMode.ALL.equals(discoveryMode);
         scanNone = BeanDiscoveryMode.NONE.equals(discoveryMode);
-        scanAnnotated = BeanDiscoveryMode.ANNOTATED.equals(discoveryMode);
     }

     @Override
@@ -69,51 +56,8 @@ public class BeanArchiveFilter implement
             return false;
         }

-        if (scanAll)
-        {
-            urlClasses.add(name);
-            allClasses.add(name);
-            return true;
-        }
-
-        if (scanAnnotated)
-        {
-            try
-            {
-                Class clazz = Class.forName(name, false, loader);
-                if (!hasScopeAnnotation(clazz.getAnnotations()))
-                {
-                    return false;
-                }
-            }
-            catch (ClassNotFoundException cnfe)
-            {
-                // not a problem, just ignore this class
-                return false;
-            }
-            catch (NoClassDefFoundError ncdf)
-            {
-                // not a problem, just ignore this class
-                return false;
-            }
-
             urlClasses.add(name);
-            allClasses.add(name);
             return true;
-        }
-
-        return false;
     }

-    private boolean hasScopeAnnotation(Annotation[] annotations)
-    {
-        for (Annotation annotation : annotations)
-        {
-            if (beanManager.isScope(annotation.annotationType()))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
 }

Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java
Sun Feb  9 22:23:28 2014
@@ -18,14 +18,12 @@
  */
 package org.apache.webbeans.corespi.scanner.xbean;

-import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.spi.BeanArchiveService;
+import org.apache.webbeans.spi.BeanArchiveService.BeanArchiveInformation;
 import org.apache.xbean.finder.archive.Archive;
-import org.apache.xbean.finder.archive.ClassesArchive;
 import org.apache.xbean.finder.archive.ClasspathArchive;
 import org.apache.xbean.finder.archive.CompositeArchive;
 import org.apache.xbean.finder.archive.FilteredArchive;
-import org.apache.xbean.finder.filter.Filter;

 import java.io.IOException;
 import java.io.InputStream;
@@ -33,11 +31,9 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;

 /**
  * this delegate pattern is interesting
@@ -53,45 +49,26 @@ public class CdiArchive implements Archi
      */
     private final Map<String, FoundClasses> classesByUrl = new
HashMap<String, FoundClasses>();

-    private final Set<String> allClasses = new HashSet<String>();
     private final Archive delegate;

-    public CdiArchive(BeanManagerImpl beanManager, BeanArchiveService
beanArchiveService, final ClassLoader loader, final Map<String, URL> urls)
+    public CdiArchive(BeanArchiveService beanArchiveService, final
ClassLoader loader, final Map<String, URL> urls)
     {
         final Collection<Archive> archives = new ArrayList<Archive>();
         for (final URL url : urls.values())
         {
             final List<String> urlClasses = new ArrayList<String>();

-            BeanArchiveService.BeanArchiveInformation beanArchiveInfo =
beanArchiveService.getBeanArchiveInformation(url);
+            BeanArchiveInformation beanArchiveInfo =
beanArchiveService.getBeanArchiveInformation(url);
             final Archive archive = new
FilteredArchive(ClasspathArchive.archive(loader, url),
-                    new BeanArchiveFilter(loader, beanManager,
beanArchiveInfo, urlClasses, allClasses));
+                    new BeanArchiveFilter(beanArchiveInfo, urlClasses));

-            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
urlClasses));
+            classesByUrl.put(url.toExternalForm(), new FoundClasses(url,
urlClasses, beanArchiveInfo));
             archives.add(archive);
         }

         delegate = new CompositeArchive(archives);
     }

-    public CdiArchive(final Collection<Class<?>> classList)
-    {
-        delegate = new FilteredArchive(new ClassesArchive(classList), new
Filter()
-        {
-            @Override
-            public boolean accept(final String name)
-            {
-                allClasses.add(name);
-                return true;
-            }
-        });
-    }
-
-    public Set<String> getClasses()
-    {
-        return allClasses;
-    }
-
     public Map<String, FoundClasses> classesByUrl()
     {
         return classesByUrl;
@@ -119,11 +96,13 @@ public class CdiArchive implements Archi
     {
         private URL url;
         private Collection<String> classNames;
+        private BeanArchiveInformation beanArchiveInfo;

-        public FoundClasses(URL url, Collection<String> classNames)
+        public FoundClasses(URL url, Collection<String> classNames,
BeanArchiveInformation beanArchiveInfo)
         {
             this.url = url;
             this.classNames = classNames;
+            this.beanArchiveInfo = beanArchiveInfo;
         }

         public URL getUrl()
@@ -131,6 +110,11 @@ public class CdiArchive implements Archi
             return url;
         }

+        public BeanArchiveInformation getBeanArchiveInfo()
+        {
+            return beanArchiveInfo;
+        }
+
         public Collection<String> getClassNames()
         {
             return classNames;

Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java?rev=1566452&view=auto
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
(added)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java
Sun Feb  9 22:23:28 2014
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.corespi.scanner.xbean;
+
+import org.apache.xbean.finder.AnnotationFinder;
+import org.apache.xbean.finder.archive.Archive;
+
+/**
+ * We just extend the default AnnotationFinder to get Access to the
original ClassInfo
+ * for not having to call loadClass so often...
+ */
+public class OwbAnnotationFinder extends AnnotationFinder
+{
+    public OwbAnnotationFinder(Archive archive, boolean
checkRuntimeAnnotation)
+    {
+        super(archive, checkRuntimeAnnotation);
+    }
+
+    public OwbAnnotationFinder(Archive archive)
+    {
+        super(archive);
+    }
+
+    public ClassInfo getClassInfo(String className)
+    {
+        return classInfos.get(className);
+    }
+
+}

Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/test/OpenWebBeansTestMetaDataDiscoveryService.java
Sun Feb  9 22:23:28 2014
@@ -19,14 +19,14 @@
 package org.apache.webbeans.lifecycle.test;

 import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
 import org.apache.webbeans.exception.WebBeansDeploymentException;
 import org.apache.webbeans.util.Asserts;
-import org.apache.xbean.finder.AnnotationFinder;

 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;

 /**
  * Used by each test.
@@ -35,15 +35,18 @@ import java.util.Collection;
  */
 public class OpenWebBeansTestMetaDataDiscoveryService extends
AbstractMetaDataDiscovery
 {
+
+    private Collection<Class<?>> classes;
+
     public OpenWebBeansTestMetaDataDiscoveryService()
     {
-
+        super();
     }

     @Override
     protected void configure()
     {
-        //Nothing we scan
+        // Nothing to scan, we add all our stuff manually...
     }

     /**
@@ -52,13 +55,15 @@ public class OpenWebBeansTestMetaDataDis
      */
     public void deployClasses(Collection<Class<?>> classes)
     {
-        if(classes != null)
-        {
-            archive = new CdiArchive(classes);
-            finder = new AnnotationFinder(archive);
-        }
+        this.classes = classes;
     }
-
+
+    @Override
+    public Set<Class<?>> getBeanClasses()
+    {
+        return new HashSet<Class<?>>(classes);
+    }
+
     /**
      * Those xmls will be scanned by container.
      * @param xmls beans xmls
@@ -91,6 +96,5 @@ public class OpenWebBeansTestMetaDataDis

         addWebBeansXmlLocation(url);
     }
-

 }

Modified:
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java?rev=1566452&r1=1566451&r2=1566452&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
(original)
+++
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/scanner/WebScannerService.java
Sun Feb  9 22:23:28 2014
@@ -18,14 +18,11 @@
  */
 package org.apache.webbeans.web.scanner;

-import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
-import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.BeanArchiveService;
 import org.apache.webbeans.util.ExceptionUtil;
 import org.apache.webbeans.util.WebBeansUtil;
-import org.apache.xbean.finder.AnnotationFinder;

 import javax.servlet.ServletContext;
 import java.net.MalformedURLException;
@@ -50,17 +47,6 @@ public class WebScannerService extends A
     }

     @Override
-    protected AnnotationFinder initFinder()
-    {
-        WebBeansContext webbeansContext = WebBeansContext.getInstance();
-        beanArchiveService = webbeansContext.getBeanArchiveService();
-        archive = new CdiArchive(webbeansContext.getBeanManagerImpl(),
beanArchiveService, WebBeansUtil.getCurrentClassLoader(),
getBeanDeploymentUrls());
-        finder = new AnnotationFinder(archive);
-
-        return finder;
-    }
-
-    @Override
     public void init(Object context)
     {
         super.init(context);