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);