This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwebbeans.git
The following commit(s) were added to refs/heads/master by this push: new a6e47d6 [OWB-1363] prescanned cdi se scanner a6e47d6 is described below commit a6e47d6cf5dffb12c92783b25003fd26f2c42883 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Wed Dec 30 14:30:15 2020 +0100 [OWB-1363] prescanned cdi se scanner --- .../webbeans/corespi/scanner/xbean/CdiArchive.java | 2 +- .../corespi/scanner/xbean/OwbAnnotationFinder.java | 9 ++ .../se/PreScannedCDISeScannerService.java | 96 ++++++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java index b77aaf0..dfb1e11 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/CdiArchive.java @@ -104,7 +104,7 @@ public class CdiArchive implements Archive return delegate.iterator(); } - public final class FoundClasses + public static final class FoundClasses { private URL url; private Collection<String> classNames; diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java index 7dd86f4..1b4b13c 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/xbean/OwbAnnotationFinder.java @@ -20,6 +20,9 @@ package org.apache.webbeans.corespi.scanner.xbean; import org.apache.xbean.finder.AnnotationFinder; import org.apache.xbean.finder.archive.Archive; +import org.apache.xbean.finder.archive.ClassesArchive; + +import java.util.stream.Stream; /** * We just extend the default AnnotationFinder to get Access to the original ClassInfo @@ -37,6 +40,12 @@ public class OwbAnnotationFinder extends AnnotationFinder super(archive); } + public OwbAnnotationFinder(final Class<?>[] classes) + { + super(new ClassesArchive(/*empty since we want to read from reflection, not form resources*/)); + Stream.of(classes).forEach(super::readClassDef); + } + public ClassInfo getClassInfo(String className) { return classInfos.get(className); diff --git a/webbeans-se/src/main/java/org/apache/openwebbeans/se/PreScannedCDISeScannerService.java b/webbeans-se/src/main/java/org/apache/openwebbeans/se/PreScannedCDISeScannerService.java new file mode 100644 index 0000000..80130b0 --- /dev/null +++ b/webbeans-se/src/main/java/org/apache/openwebbeans/se/PreScannedCDISeScannerService.java @@ -0,0 +1,96 @@ +/* + * 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.openwebbeans.se; + +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.spi.BeanArchiveService; +import org.apache.webbeans.util.WebBeansUtil; +import org.apache.xbean.finder.AnnotationFinder; + +import java.net.URL; +import java.util.Map; +import java.util.stream.Stream; + +import static java.util.Collections.emptyMap; +import static java.util.stream.Collectors.toList; + +public class PreScannedCDISeScannerService extends CDISeScannerService +{ + @Override + protected AnnotationFinder initFinder() + { + if (finder != null) + { + return finder; + } + + // todo: support to read beanDeploymentUrls from the conf as well + // -> for now we use a full programmatic deployment (single in mem archive) + final WebBeansContext webBeansContext = webBeansContext(); + final OpenWebBeansConfiguration conf = webBeansContext.getOpenWebBeansConfiguration(); + final String confKeyBase = getClass().getName() + "."; + final String classes = conf.getProperty(confKeyBase + "classes"); + final ClassLoader loader = WebBeansUtil.getCurrentClassLoader(); + final Class<?>[] reflectClasses = Stream.of(classes.split(",")).map(it -> + { + try + { + return loader.loadClass(it); + } + catch (final ClassNotFoundException e) + { + throw new IllegalArgumentException(e); + } + }).toArray(Class[]::new); + final BeanArchiveService beanArchiveService = webBeansContext.getBeanArchiveService(); + archive = new CdiArchive( + beanArchiveService, WebBeansUtil.getCurrentClassLoader(), + emptyMap(), null, getAdditionalArchive()); + final Map.Entry<String, URL> deplUrl = getBeanDeploymentUrls().entrySet().iterator().next(); + archive.classesByUrl().put( + deplUrl.getKey(), + new CdiArchive.FoundClasses( + deplUrl.getValue(), + Stream.of(classes.split(",")).collect(toList()), + beanArchiveService.getBeanArchiveInformation(deplUrl.getValue()))); + finder = new OwbAnnotationFinder(reflectClasses); + return finder; + } + + @Override + public void classes(final Class<?>[] classes) + { + // no-op + } + + @Override + public void packages(final boolean recursive, final Class<?>[] markers) + { + // no-op + } + + @Override + public void packages(final boolean recursive, final Package[] packages) + { + // no-op + } +}