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 <[email protected]> wrote: 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); > >
