Hi Mark Will it work on windows or /xxx will not match? ---------- Message transféré ---------- De : <[email protected]> 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... À : <[email protected]>
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);
