[aries-cdi] 03/03: [ARIES-2020] basic Discovery optimizations
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/aries-cdi.git commit 2d071cbc932da248f56d937aa913890870c69d70 Author: Romain Manni-Bucau AuthorDate: Fri Oct 30 11:20:34 2020 +0100 [ARIES-2020] basic Discovery optimizations --- .../internal/annotated/AnnotatedImpl.java | 26 ++- .../internal/annotated/CachingAnnotated.java | 29 .../container/internal/container/Discovery.java| 44 ++- .../cdi/container/internal/util/Annotates.java | 85 ++ .../aries/cdi/container/internal/util/Maps.java| 19 - .../cdi/container/internal/util/AnnotatesTest.java | 39 ++ .../org/apache/aries/cdi/test/cases/TrimTests.java | 6 +- .../java/org/apache/aries/cdi/test/tb17/A.java | 1 - 8 files changed, 172 insertions(+), 77 deletions(-) diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/AnnotatedImpl.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/AnnotatedImpl.java index 463fc05..f7c498b 100644 --- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/AnnotatedImpl.java +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/AnnotatedImpl.java @@ -20,18 +20,22 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; import java.util.Arrays; +import java.util.List; import java.util.Set; import javax.enterprise.inject.spi.Annotated; import org.apache.aries.cdi.container.internal.util.Reflection; -public class AnnotatedImpl implements Annotated { +public class AnnotatedImpl implements CachingAnnotated { private final Type _baseType; private final AnnotatedElement _annotatedElement; private final Set _typeClosure; + private Class beanScope; + private List collectedAnnotations; + public AnnotatedImpl(final Type baseType, final AnnotatedElement annotatedElement) { _baseType = baseType; _annotatedElement = annotatedElement; @@ -39,6 +43,26 @@ public class AnnotatedImpl implements Annotated { } @Override + public List getCollectedAnnotations() { + return collectedAnnotations; + } + + @Override + public void setCollectedAnnotations(final List collectedAnnotations) { + this.collectedAnnotations = collectedAnnotations; + } + + @Override + public Class getBeanScope() { + return beanScope; + } + + @Override + public void setBeanScope(Class beanScope) { + this.beanScope = beanScope; + } + + @Override public Type getBaseType() { return _baseType; } diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/CachingAnnotated.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/CachingAnnotated.java new file mode 100644 index 000..9de0236 --- /dev/null +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/CachingAnnotated.java @@ -0,0 +1,29 @@ +/** + * Licensed 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.aries.cdi.container.internal.annotated; + +import javax.enterprise.inject.spi.Annotated; +import java.lang.annotation.Annotation; +import java.util.List; + +// because Discovery run should be free and not cost as much as a CDI starts we try to reduce its cost by caching meta +public interface CachingAnnotated extends Annotated { +// tested early and generally later too so cache it +Class getBeanScope(); +void setBeanScope(Class value); + +// used in all "tests" so worth a cache +List getCollectedAnnotations(); +void setCollectedAnnotations(List annotations); +} diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java index 07f56b6..71f8d18 100644 --- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java @@ -20,6 +20,7 @@ import java.lang.reflect.Type; import
[aries-cdi] branch master updated (9242268 -> 2d071cb)
This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a change to branch master in repository https://gitbox.apache.org/repos/asf/aries-cdi.git. from 9242268 [ARIES-2017] reduce unsafe warnings for owb impl new 08ebf6c [ARIES-2018] don't create document builder and xpath if no beans.xml is seen new e2521fa [ARIES-2019] basic @Vetoed handling new 2d071cb [ARIES-2020] basic Discovery optimizations The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "add" were already present in the repository and have only been added to this reference. Summary of changes: .../internal/annotated/AnnotatedImpl.java | 26 ++- ...otatedMethodImpl.java => CachingAnnotated.java} | 26 +++ .../container/internal/container/Discovery.java| 83 ++--- .../internal/model/BeansModelBuilder.java | 7 ++ .../cdi/container/internal/util/Annotates.java | 85 ++ .../aries/cdi/container/internal/util/Maps.java| 19 - .../cdi/container/internal/util/AnnotatesTest.java | 39 +- .../org/apache/aries/cdi/test/cases/TrimTests.java | 6 +- .../java/org/apache/aries/cdi/test/tb17/A.java | 1 - 9 files changed, 161 insertions(+), 131 deletions(-) copy cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/annotated/{AnnotatedMethodImpl.java => CachingAnnotated.java} (51%) copy cdi-itests/src/main/java/org/apache/aries/cdi/test/tb8/ContainerBean.java => cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/util/AnnotatesTest.java (52%)
[aries-cdi] 01/03: [ARIES-2018] don't create document builder and xpath if no beans.xml is seen
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/aries-cdi.git commit 08ebf6c474f1ec1d99fd8bed38b461c8b7806b0b Author: Romain Manni-Bucau AuthorDate: Fri Oct 30 09:40:31 2020 +0100 [ARIES-2018] don't create document builder and xpath if no beans.xml is seen --- .../container/internal/container/Discovery.java| 37 -- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java index 96e68ce..709d46b 100644 --- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java @@ -88,21 +88,23 @@ public class Discovery { private static final List BIND_TYPES = Arrays.asList(BindService.class, BindBeanServiceObjects.class, BindServiceReference.class); - static final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - static final XPathFactory xpf = XPathFactory.newInstance(); - static final XPathExpressiontrimExpression; - static final XPathExpressionexcludeExpression; + private static final class LazyXml { // when not needed, don't create that + static final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + static final XPathFactory xpf = XPathFactory.newInstance(); + static final XPathExpressiontrimExpression; + static final XPathExpressionexcludeExpression; - static { - try { - dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl;, true); - dbf.setXIncludeAware(false); - dbf.setExpandEntityReferences(false); - XPath xPath = xpf.newXPath(); - trimExpression = xPath.compile("boolean(/beans/trim)"); - excludeExpression = xPath.compile("/beans/scan/exclude"); - } catch (Throwable t) { - throw Exceptions.duck(t); + static { + try { + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl;, true); + dbf.setXIncludeAware(false); + dbf.setExpandEntityReferences(false); + XPath xPath = xpf.newXPath(); + trimExpression = xPath.compile("boolean(/beans/trim)"); + excludeExpression = xPath.compile("/beans/scan/exclude"); + } catch (Throwable t) { + throw Exceptions.duck(t); + } } } @@ -460,7 +462,7 @@ public class Discovery { boolean checkTrim(Document document) { try { - return Boolean.class.cast(trimExpression.evaluate(document, XPathConstants.BOOLEAN)); + return Boolean.class.cast(LazyXml.trimExpression.evaluate(document, XPathConstants.BOOLEAN)); } catch (XPathExpressionException e) { throw Exceptions.duck(e); } @@ -470,7 +472,8 @@ public class Discovery { try { List excludes = new ArrayList<>(); - NodeList excludeNodes = NodeList.class.cast(excludeExpression.evaluate(document, XPathConstants.NODESET)); + NodeList excludeNodes = NodeList.class.cast( + LazyXml.excludeExpression.evaluate(document, XPathConstants.NODESET)); for (int i = 0; i < excludeNodes.getLength(); i++) { Element excludeElement = (Element)excludeNodes.item(i); @@ -487,7 +490,7 @@ public class Discovery { Document readXMLResource(URL resource) { try { - DocumentBuilder db = dbf.newDocumentBuilder(); + DocumentBuilder db = LazyXml.dbf.newDocumentBuilder(); try (InputStream is = resource.openStream()) { return db.parse(is); } catch (Throwable t) {
[aries-cdi] 02/03: [ARIES-2019] basic @Vetoed handling
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/aries-cdi.git commit e2521faca77383b9ea466941a54e311340b96535 Author: Romain Manni-Bucau AuthorDate: Fri Oct 30 09:45:30 2020 +0100 [ARIES-2019] basic @Vetoed handling --- .../apache/aries/cdi/container/internal/container/Discovery.java | 2 +- .../aries/cdi/container/internal/model/BeansModelBuilder.java | 7 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java index 709d46b..07f56b6 100644 --- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java @@ -126,7 +126,7 @@ public class Discovery { } public void discover() { - _beansModel.getOSGiBeans().stream().forEach(osgiBean -> { + _beansModel.getOSGiBeans().forEach(osgiBean -> { osgiBean.found(true); AnnotatedType annotatedType = new AnnotatedTypeImpl<>(osgiBean.getBeanClass()); diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java index 9e8b9c8..b08007f 100644 --- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java +++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java @@ -30,6 +30,8 @@ import org.osgi.framework.Bundle; import org.osgi.framework.wiring.BundleWiring; import org.osgi.service.log.Logger; +import javax.enterprise.inject.Vetoed; + public class BeansModelBuilder { public BeansModelBuilder( @@ -80,6 +82,11 @@ public class BeansModelBuilder { for (String beanClassName : beanClassNames) { try { Class clazz = _aggregateClassLoader.loadClass(beanClassName); + if (clazz.isAnnotationPresent(Vetoed.class) || + // should be recursive but at the end this is generally enough and faster + (clazz.getPackage() != null && clazz.getPackage().isAnnotationPresent(Vetoed.class))) { + continue; + } beans.put(beanClassName, new OSGiBean.Builder(_containerState.containerLogs(), clazz).build());