Author: csierra Date: Wed Mar 1 10:06:32 2017 New Revision: 1784896 URL: http://svn.apache.org/viewvc?rev=1784896&view=rev Log: [ARIES-CDI] large refactor based on the proposed changes
Signed-off-by: Raymond Augé <[email protected]> Added: aries/trunk/cdi/cdi-executable/log4j.properties - copied, changed from r1784895, aries/trunk/cdi/cdi-log4j-configuration-fragment/src/main/resources/log4j.properties aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java - copied, changed from r1784895, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_2_Extension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java - copied, changed from r1784895, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_1_Init.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java - copied, changed from r1784895, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_4_Publish.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Reference.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServicePropertyLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ConfigurationModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Constants.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/OSGiBeansHandler.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/PropertyModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceInjectionPoint.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ServiceModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/XmlSchema.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Maps.java aries/trunk/cdi/cdi-extender/src/main/resources/META-INF/ aries/trunk/cdi/cdi-extender/src/main/resources/META-INF/cdi.xsd aries/trunk/cdi/cdi-extender/src/test/ aries/trunk/cdi/cdi-extender/src/test/java/ aries/trunk/cdi/cdi-extender/src/test/java/org/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/model/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/model/ModelTest.java aries/trunk/cdi/cdi-extender/src/test/resources/ aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/ aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/ aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/beans-configuration.xml aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/beans-only.xml aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/beans-references.xml aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/beans-services.xml aries/trunk/cdi/cdi-itests/bnd/tb1-beans.xml aries/trunk/cdi/cdi-itests/bnd/tb2-beans.xml aries/trunk/cdi/cdi-itests/bnd/tb3-beans.xml aries/trunk/cdi/cdi-itests/bnd/tb3.bnd aries/trunk/cdi/cdi-itests/log4j.properties - copied, changed from r1784895, aries/trunk/cdi/cdi-log4j-configuration-fragment/src/main/resources/log4j.properties aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/ConfigurationTests.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/EventsTests.java - copied, changed from r1784895, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/EventsTestCase.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java - copied, changed from r1784895, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiJndiExtensionTests.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/OSGiBeanDescriptorTests.java - copied, changed from r1784895, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/ManifestReferencesAndServicesTestCase.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb3/ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb3/ConfigurationBeanA.java Removed: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_1_Init.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_2_Extension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_3_Reference.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_4_Publish.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/locate/ClassLocater.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/locate/ClassLocaterResult.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiJndiExtensionTests.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/EventsTestCase.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/ManifestReferencesAndServicesTestCase.java aries/trunk/cdi/cdi-log4j-configuration-fragment/LICENSE aries/trunk/cdi/cdi-log4j-configuration-fragment/NOTICE aries/trunk/cdi/cdi-log4j-configuration-fragment/bnd.bnd aries/trunk/cdi/cdi-log4j-configuration-fragment/pom.xml aries/trunk/cdi/cdi-log4j-configuration-fragment/src/main/resources/log4j.properties Modified: aries/trunk/cdi/cdi-executable/cdi-executable.bndrun aries/trunk/cdi/cdi-executable/pom.xml aries/trunk/cdi/cdi-extender/pom.xml aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundleExtension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CdiCommand.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerState.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceDependency.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ServiceDeclaration.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServiceLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Reflection.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Sets.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Throw.java aries/trunk/cdi/cdi-itests/bnd.bnd aries/trunk/cdi/cdi-itests/bnd/basic-beans.bnd aries/trunk/cdi/cdi-itests/bnd/basic-beans.xml aries/trunk/cdi/cdi-itests/bnd/tb1.bnd aries/trunk/cdi/cdi-itests/bnd/tb2.bnd aries/trunk/cdi/cdi-itests/itest.bndrun aries/trunk/cdi/cdi-itests/pom.xml aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/BeanWithReference.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/ServiceWithProperties.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/AbstractTestCase.java aries/trunk/cdi/pom.xml Modified: aries/trunk/cdi/cdi-executable/cdi-executable.bndrun URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-executable/cdi-executable.bndrun?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-executable/cdi-executable.bndrun (original) +++ aries/trunk/cdi/cdi-executable/cdi-executable.bndrun Wed Mar 1 10:06:32 2017 @@ -6,32 +6,32 @@ -runrequires: \ osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.extender)',\ - osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.log4j.configuration.fragment)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.configadmin)',\ osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\ osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.jline)',\ osgi.identity;filter:='(osgi.identity=slf4j.log4j12)' -runbundles: \ - javax.enterprise.cdi-api; version='[1.2.0,1.2.1)',\ - jboss-classfilewriter; version='[1.1.2,1.1.3)',\ - log4j; version='[1.2.17,1.2.18)',\ - org.apache.aries.cdi.extender; version='[0.0.1,0.0.2)',\ - org.apache.aries.cdi.log4j.configuration.fragment; version='[0.0.1,0.0.2)',\ - org.apache.aries.cdi.osgi.api; version='[0.0.1,0.0.2)',\ - org.apache.felix.bundlerepository; version='[1.6.0,1.6.1)',\ - org.apache.felix.gogo.command; version='[1.0.0,1.0.1)',\ - org.apache.felix.gogo.jline; version='[1.0.0,1.0.1)',\ - org.apache.felix.gogo.runtime; version='[1.0.0,1.0.1)',\ - org.apache.logging.log4j.api; version='[2.7.0,2.7.1)',\ - org.glassfish.hk2.external.javax.inject; version='[2.5.0,2.5.1)',\ - org.jboss.logging.jboss-logging; version='[3.2.1,3.2.2)',\ - org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec; version='[1.0.0,1.0.1)',\ - org.jboss.spec.javax.el.jboss-el-api_3.0_spec; version='[1.0.0,1.0.1)',\ - org.jboss.spec.javax.interceptor.jboss-interceptors-api_1.2_spec; version='[1.0.0,1.0.1)',\ - org.jboss.weld.osgi-bundle; version='[2.4.0,2.4.1)',\ - org.jline; version='[3.0.0,3.0.1)',\ - slf4j.api; version='[1.7.21,1.7.22)',\ - slf4j.log4j12; version='[1.6.1,1.6.2)' + javax.enterprise.cdi-api;version='[1.2.0,1.2.1)',\ + jboss-classfilewriter;version='[1.1.2,1.1.3)',\ + log4j;version='[1.2.17,1.2.18)',\ + org.apache.aries.cdi.extender;version='[0.0.1,0.0.2)',\ + org.apache.felix.bundlerepository;version='[1.6.0,1.6.1)',\ + org.apache.felix.configadmin;version='[1.8.12,1.8.13)',\ + org.apache.felix.gogo.command;version='[1.0.0,1.0.1)',\ + org.apache.felix.gogo.jline;version='[1.0.0,1.0.1)',\ + org.apache.felix.gogo.runtime;version='[1.0.0,1.0.1)',\ + org.apache.logging.log4j.api;version='[2.7.0,2.7.1)',\ + org.glassfish.hk2.external.javax.inject;version='[2.5.0,2.5.1)',\ + org.jboss.logging.jboss-logging;version='[3.2.1,3.2.2)',\ + org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec;version='[1.0.0,1.0.1)',\ + org.jboss.spec.javax.el.jboss-el-api_3.0_spec;version='[1.0.0,1.0.1)',\ + org.jboss.spec.javax.interceptor.jboss-interceptors-api_1.2_spec;version='[1.0.0,1.0.1)',\ + org.jboss.weld.osgi-bundle;version='[2.4.0,2.4.1)',\ + org.jline;version='[3.0.0,3.0.1)',\ + org.osgi.service.cdi;version='[1.0.0,1.0.1)',\ + slf4j.api;version='[1.7.21,1.7.22)',\ + slf4j.log4j12;version='[1.6.1,1.6.2)' -resolve.effective: resolve, active -runee: JavaSE-1.8 @@ -40,6 +40,7 @@ osgi.console.enable.builtin=false, \ osgi.console=, \ org.osgi.service.http.port=8080,\ - org.jboss.logging.provider=slf4j + org.jboss.logging.provider=slf4j,\ + log4j.configuration=file:${.}/log4j.properties -runsystemcapabilities.dflt: ${native_capability} -runsystempackages: javax.script Copied: aries/trunk/cdi/cdi-executable/log4j.properties (from r1784895, aries/trunk/cdi/cdi-log4j-configuration-fragment/src/main/resources/log4j.properties) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-executable/log4j.properties?p2=aries/trunk/cdi/cdi-executable/log4j.properties&p1=aries/trunk/cdi/cdi-log4j-configuration-fragment/src/main/resources/log4j.properties&r1=1784895&r2=1784896&rev=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-log4j-configuration-fragment/src/main/resources/log4j.properties (original) +++ aries/trunk/cdi/cdi-executable/log4j.properties Wed Mar 1 10:06:32 2017 @@ -9,4 +9,4 @@ log4j.appender.CONSOLE=org.apache.log4j. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c:%L | %m%n -log4j.logger.org.apache.aries.cdi=DEBUG +log4j.logger.org.apache.aries.cdi.container.internal.container=DEBUG Modified: aries/trunk/cdi/cdi-executable/pom.xml URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-executable/pom.xml?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-executable/pom.xml (original) +++ aries/trunk/cdi/cdi-executable/pom.xml Wed Mar 1 10:06:32 2017 @@ -26,14 +26,23 @@ </plugin> <plugin> <groupId>biz.aQute.bnd</groupId> + <artifactId>bnd-resolver-maven-plugin</artifactId> + <configuration> + <failOnChanges>false</failOnChanges> + <bndruns> + <bndrun>cdi-executable.bndrun</bndrun> + </bndruns> + </configuration> + </plugin> + <plugin> + <groupId>biz.aQute.bnd</groupId> <artifactId>bnd-export-maven-plugin</artifactId> <configuration> <failOnChanges>false</failOnChanges> - <resolve>true</resolve> + <resolve>false</resolve> <bndruns> <bndrun>cdi-executable.bndrun</bndrun> </bndruns> - <targetDir>.</targetDir> </configuration> </plugin> </plugins> @@ -84,7 +93,7 @@ <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.configadmin</artifactId> - <version>1.8.8</version> + <version>1.8.12</version> </dependency> <dependency> <groupId>org.apache.felix</groupId> Modified: aries/trunk/cdi/cdi-extender/pom.xml URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/pom.xml?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/pom.xml (original) +++ aries/trunk/cdi/cdi-extender/pom.xml Wed Mar 1 10:06:32 2017 @@ -50,7 +50,7 @@ <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.converter</artifactId> - <version>0.1-SNAPSHOT</version> + <version>0.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.apache.felix</groupId> Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java Wed Mar 1 10:06:32 2017 @@ -100,17 +100,20 @@ public class Activator extends AbstractE @Override protected void debug(Bundle bundle, String msg) { - _log.debug(msg); } @Override protected void warn(Bundle bundle, String msg, Throwable t) { - _log.warn(msg, t); + if (_log.isWarnEnabled()) { + _log.warn(msg, t); + } } @Override protected void error(String msg, Throwable t) { - _log.error(msg, t); + if (_log.isErrorEnabled()) { + _log.error(msg, t); + } } private final boolean requiresCdiExtender(Bundle bundle) { Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundleExtension.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundleExtension.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundleExtension.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundleExtension.java Wed Mar 1 10:06:32 2017 @@ -21,7 +21,7 @@ import java.util.concurrent.locks.Reentr import org.apache.aries.cdi.container.internal.command.CdiCommand; import org.apache.aries.cdi.container.internal.container.CdiContainerState; -import org.apache.aries.cdi.container.internal.container.Phase_1_Init; +import org.apache.aries.cdi.container.internal.container.Phase_Init; import org.apache.felix.utils.extender.Extension; import org.osgi.framework.Bundle; import org.osgi.framework.ServiceReference; @@ -65,17 +65,17 @@ public class CdiBundleExtension implemen _command.add(_bundle.getBundleId(), cdiHelper); - Phase_1_Init initPhase = null; + Phase_Init initPhase = null; try { - initPhase = new Phase_1_Init(_bundle, cdiHelper); + initPhase = new Phase_Init(_bundle, cdiHelper); initPhase.open(); _initPhase = initPhase; } catch (Throwable t) { - cdiHelper.fire(CdiEvent.State.FAILURE, t); + cdiHelper.fire(CdiEvent.Type.FAILURE, t); if (initPhase != null) { initPhase.close(); @@ -133,7 +133,7 @@ public class CdiBundleExtension implemen private final CdiCommand _command; private final Bundle _extenderBundle; private final Map<ServiceReference<CdiListener>, CdiListener> _listeners; - private Phase_1_Init _initPhase; + private Phase_Init _initPhase; private final Lock _stateLock = new ReentrantLock(); } Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CdiCommand.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CdiCommand.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CdiCommand.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CdiCommand.java Wed Mar 1 10:06:32 2017 @@ -19,6 +19,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.aries.cdi.container.internal.container.CdiContainerState; +import org.apache.aries.cdi.container.internal.container.ConfigurationDependency; import org.apache.aries.cdi.container.internal.container.ExtensionDependency; import org.apache.aries.cdi.container.internal.container.ReferenceDependency; @@ -51,6 +52,17 @@ public class CdiCommand { System.out.printf(" %s%s\n", extensionDependency.toString(), " ???is this resolved???"); } } + List<ConfigurationDependency> configurationDependencies = cdiContainerState.getConfigurationDependencies(); + if (!configurationDependencies.isEmpty()) { + System.out.println(" [CONFIGURATIONS]"); + for (ConfigurationDependency configurationDependency : configurationDependencies) { + for (String pid : configurationDependency.pids()) { + System.out.printf( + " %s\n : %s\n", pid, + !configurationDependency.isResolved(pid) ? " UNRESOLVED" : "resolved"); + } + } + } List<ReferenceDependency> referenceDependencies = cdiContainerState.getReferenceDependencies(); if (!referenceDependencies.isEmpty()) { System.out.println(" [REFERENCES]"); Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerState.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerState.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerState.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerState.java Wed Mar 1 10:06:32 2017 @@ -24,11 +24,13 @@ import javax.enterprise.inject.Any; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.util.AnnotationLiteral; +import org.apache.aries.cdi.container.internal.model.BeansModel; import org.osgi.framework.Bundle; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.osgi.service.cdi.CdiContainer; import org.osgi.service.cdi.CdiEvent; +import org.osgi.service.cdi.CdiEvent.Type; import org.osgi.service.cdi.CdiExtenderConstants; import org.osgi.service.cdi.CdiListener; import org.slf4j.Logger; @@ -51,7 +53,7 @@ public class CdiContainerState { Hashtable<String, Object> properties = new Hashtable<>(); - properties.put(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE, CdiEvent.State.CREATING); + properties.put(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE, CdiEvent.Type.CREATING); _cdiContainerRegistration = _bundle.getBundleContext().registerService( CdiContainer.class, _cdiContainerService, properties); @@ -77,6 +79,10 @@ public class CdiContainerState { return _beanManager; } + public BeansModel getBeansModel() { + return _beansModel; + } + public Bundle getBundle() { return _bundle; } @@ -85,29 +91,35 @@ public class CdiContainerState { return _extenderBundle; } + public List<ConfigurationDependency> getConfigurationDependencies() { + return _configurations; + } + public List<ExtensionDependency> getExtensionDependencies() { return _extensionDependencies; } + public List<ReferenceDependency> getReferenceDependencies() { + return _references; + } + public String getId() { return _bundle.getSymbolicName() + ":" + _bundle.getBundleId(); } - public CdiEvent.State getLastState() { + public CdiEvent.Type getLastState() { return _lastState.get(); } - public List<ReferenceDependency> getReferenceDependencies() { - return _referenceDependencies; - } - public void fire(CdiEvent event) { try { _lock.lock(); - if ((_lastState.get() == CdiEvent.State.DESTROYING) && - ((event.getState() == CdiEvent.State.WAITING_FOR_EXTENSIONS) || - (event.getState() == CdiEvent.State.WAITING_FOR_SERVICES))) { + Type type = event.getType(); + + if ((_lastState.get() == CdiEvent.Type.DESTROYING) && + ((type == CdiEvent.Type.WAITING_FOR_EXTENSIONS) || + (type == CdiEvent.Type.WAITING_FOR_SERVICES))) { return; } @@ -138,15 +150,15 @@ public class CdiContainerState { } } - public void fire(CdiEvent.State state) { + public void fire(CdiEvent.Type state) { fire(new CdiEvent(state, _bundle, _extenderBundle)); } - public void fire(CdiEvent.State state, String payload) { + public void fire(CdiEvent.Type state, String payload) { fire(new CdiEvent(state, _bundle, _extenderBundle, payload, null)); } - public void fire(CdiEvent.State state, Throwable cause) { + public void fire(CdiEvent.Type state, Throwable cause) { fire(new CdiEvent(state, _bundle, _extenderBundle, null, cause)); } @@ -155,25 +167,35 @@ public class CdiContainerState { _cdiContainerService.setBeanManager(beanManager); } + public void setBeansModel(BeansModel beansModel) { + _beansModel = beansModel; + } + + public void setConfigurationDependencies(List<ConfigurationDependency> configurations) { + _configurations = configurations; + } + public void setExtensionDependencies(List<ExtensionDependency> extensionDependencies) { _extensionDependencies = extensionDependencies; } - public void setReferenceDependency(List<ReferenceDependency> referenceDependencies) { - _referenceDependencies = referenceDependencies; + public void setReferenceDependencies(List<ReferenceDependency> references) { + _references = references; } private void updateState(CdiEvent event) { try { _lock.lock(); + Type type = event.getType(); + ServiceReference<CdiContainer> reference = _cdiContainerRegistration.getReference(); - if (event.getState() == reference.getProperty(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE)) { + if (type == reference.getProperty(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE)) { return; } - _lastState.set(event.getState()); + _lastState.set(type); Hashtable<String, Object> properties = new Hashtable<>(); @@ -181,7 +203,7 @@ public class CdiContainerState { properties.put(key, reference.getProperty(key)); } - properties.put(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE, event.getState()); + properties.put(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE, type); _cdiContainerRegistration.setProperties(properties); } @@ -193,14 +215,16 @@ public class CdiContainerState { private static final Logger _log = LoggerFactory.getLogger(CdiContainerState.class); private volatile BeanManager _beanManager; + private BeansModel _beansModel; private final Bundle _bundle; private final ServiceRegistration<CdiContainer> _cdiContainerRegistration; private final CdiContainerService _cdiContainerService; + private List<ConfigurationDependency> _configurations; private final Bundle _extenderBundle; private List<ExtensionDependency> _extensionDependencies; - private AtomicReference<CdiEvent.State> _lastState = new AtomicReference<CdiEvent.State>(CdiEvent.State.CREATING); + private AtomicReference<CdiEvent.Type> _lastState = new AtomicReference<CdiEvent.Type>(CdiEvent.Type.CREATING); private final Map<ServiceReference<CdiListener>, CdiListener> _listeners; private final ReentrantLock _lock = new ReentrantLock(); - private List<ReferenceDependency> _referenceDependencies; + private List<ReferenceDependency> _references; } \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,33 @@ +package org.apache.aries.cdi.container.internal.container; + +import java.util.Arrays; + +public class ConfigurationDependency { + + public ConfigurationDependency(String[] pids, String defaultPid) { + _pids = pids; + + for (int i = 0; i > pids.length; i++) { + if ("$".equals(_pids[i])) { + _pids[i] = defaultPid; + } + } + } + + public boolean isResolved(String pid) { + // TODO Auto-generated method stub + return false; + } + + public String[] pids() { + return _pids; + } + + @Override + public String toString() { + return Arrays.toString(_pids); + } + + private final String[] _pids; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,65 @@ +/** + * 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.container; + +import java.util.List; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.Annotated; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.Extension; +import javax.enterprise.inject.spi.InjectionPoint; +import javax.enterprise.inject.spi.ProcessInjectionPoint; + +import org.osgi.service.cdi.annotations.Configuration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@ApplicationScoped +public class ConfigurationExtension implements Extension { + + public ConfigurationExtension(List<ConfigurationDependency> configurations) { + _configurations = configurations; + } + + void processInjectionTarget( + @Observes @SuppressWarnings("rawtypes") ProcessInjectionPoint pip, BeanManager manager) { + + InjectionPoint injectionPoint = pip.getInjectionPoint(); + Annotated annotated = injectionPoint.getAnnotated(); + Configuration configuration = annotated.getAnnotation(Configuration.class); + + if (configuration == null) { + return; + } + + Class<?> beanClass = injectionPoint.getBean().getBeanClass(); + + ConfigurationDependency configurationDependency = new ConfigurationDependency( + configuration.value(), beanClass.getName()); + + _configurations.add(configurationDependency); + + if (_log.isDebugEnabled()) { + _log.debug("CDIe - Found OSGi configuration dependency {}", configurationDependency); + } + } + + private static final Logger _log = LoggerFactory.getLogger(ReferenceExtension.class); + + private final List<ConfigurationDependency> _configurations; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,9 @@ +package org.apache.aries.cdi.container.internal.container; + +public interface Phase { + + public void close(); + + public void open(); + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,179 @@ +/** + * 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.container; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.Extension; + +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.apache.aries.cdi.container.internal.model.ConfigurationModel; +import org.jboss.weld.bootstrap.WeldBootstrap; +import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; +import org.jboss.weld.bootstrap.spi.Deployment; +import org.jboss.weld.bootstrap.spi.Metadata; +import org.jboss.weld.manager.BeanManagerImpl; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.wiring.BundleWiring; +import org.osgi.service.cdi.CdiEvent; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.ConfigurationEvent; +import org.osgi.service.cm.ConfigurationListener; +import org.osgi.util.tracker.ServiceTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Phase_Configuration implements Phase { + + public Phase_Configuration( + Bundle bundle, CdiContainerState cdiContainerState, Map<ServiceReference<Extension>, + Metadata<Extension>> extensions) { + + _bundle = bundle; + _cdiContainerState = cdiContainerState; + _extensions = extensions; + _bundleContext = _bundle.getBundleContext(); + _bundleWiring = _bundle.adapt(BundleWiring.class); + + _configAdminTracker = new ServiceTracker<>( + _cdiContainerState.getExtenderBundle().getBundleContext(), ConfigurationAdmin.class, null); + + _configAdminTracker.open(); + + _cdiContainerState.setConfigurationDependencies(_configurations); + _cdiContainerState.setReferenceDependencies(_references); + } + + @Override + public void close() { +// if (_serviceTracker != null) { +// _serviceTracker.close(); +// +// _serviceTracker = null; +// } +// else { + if (_nextPhase != null) { + _nextPhase.close(); + + _nextPhase = null; + } +// } + + _configAdminTracker.close(); + } + + @Override + public void open() { + BeansModel beansModel = _cdiContainerState.getBeansModel(); + + BeanDeploymentArchive beanDeploymentArchive = new BundleDeploymentArchive( + _bundleWiring, _cdiContainerState.getId(), beansModel.getBeanClassNames(), beansModel.getBeansXml(), + _cdiContainerState.getExtenderBundle()); + + WeldBootstrap bootstrap = new WeldBootstrap(); + + List<Metadata<Extension>> extensions = new ArrayList<>(); + + // Add the internal extensions + extensions.add( + new ExtensionMetadata(new ConfigurationExtension(_configurations), _bundle.toString())); + extensions.add( + new ExtensionMetadata(new ReferenceExtension(_references, _bundleContext), _bundle.toString())); + extensions.add(new ExtensionMetadata(new ServiceExtension(_services), _bundle.toString())); + + // Add extensions found from the bundle's classloader, such as those in the Bundle-ClassPath + for (Metadata<Extension> meta : bootstrap.loadExtensions(_bundleWiring.getClassLoader())) { + extensions.add(meta); + } + + // Add external extensions + for (Metadata<Extension> meta : _extensions.values()) { + extensions.add(meta); + } + + Deployment deployment = new BundleDeployment(extensions, beanDeploymentArchive); + + bootstrap.startContainer(_cdiContainerState.getId(), new SimpleEnvironment(), deployment); + + BeanManager beanManager = bootstrap.getManager(beanDeploymentArchive); + + _cdiContainerState.setBeanManager(beanManager); + + bootstrap.startInitialization(); + bootstrap.deployBeans(); + + processDescriptorConfigurations((BeanManagerImpl)beanManager); + + if (!_configurations.isEmpty()) { + _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_CONFIGURATIONS, _configurations.toString()); + + // TODO configuration listener + temporary: { + _nextPhase = new Phase_Reference(_references, _services, _cdiContainerState, bootstrap); + + _nextPhase.open(); + } + } + else { + _nextPhase = new Phase_Reference(_references, _services, _cdiContainerState, bootstrap); + + _nextPhase.open(); + } + } + + private void processConfigurationModel(ConfigurationModel configurationModel, BeanManagerImpl beanManagerImpl) { + _configurations.add( + new ConfigurationDependency(new String[] {configurationModel.getPid()}, configurationModel.getPid())); + } + + private void processDescriptorConfigurations(BeanManagerImpl beanManagerImpl) { + Collection<ConfigurationModel> configurationModels = + _cdiContainerState.getBeansModel().getConfigurationModels(); + + for (ConfigurationModel configurationModel : configurationModels) { + processConfigurationModel(configurationModel, beanManagerImpl); + } + } + + private static final Logger _log = LoggerFactory.getLogger(Phase_Configuration.class); + + private final Bundle _bundle; + private final BundleContext _bundleContext; + private final BundleWiring _bundleWiring; + private final CdiContainerState _cdiContainerState; + private final ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> _configAdminTracker; + private final List<ConfigurationDependency> _configurations = new CopyOnWriteArrayList<>(); + private final Map<ServiceReference<Extension>, Metadata<Extension>> _extensions; + private Phase _nextPhase; + private final List<ReferenceDependency> _references = new CopyOnWriteArrayList<>(); + private final List<ServiceDeclaration> _services = new CopyOnWriteArrayList<>(); + + class ConfigurationDependencyListener implements ConfigurationListener { + + @Override + public void configurationEvent(ConfigurationEvent event) { + _log.info("CDIe - configuration event {}", event); + } + + } + +} \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java (from r1784895, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_2_Extension.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_2_Extension.java&r1=1784895&r2=1784896&rev=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_2_Extension.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java Wed Mar 1 10:06:32 2017 @@ -14,7 +14,6 @@ package org.apache.aries.cdi.container.internal.container; -import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -23,7 +22,6 @@ import java.util.concurrent.CopyOnWriteA import javax.enterprise.inject.spi.Extension; -import org.jboss.weld.bootstrap.spi.BeansXml; import org.jboss.weld.bootstrap.spi.Metadata; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -38,24 +36,21 @@ import org.osgi.util.tracker.ServiceTrac import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class Phase_2_Extension { - - public Phase_2_Extension( - Bundle bundle, CdiContainerState cdiContainerState, Collection<String> beanClassNames, BeansXml beansXml) { +public class Phase_Extension implements Phase { + public Phase_Extension(Bundle bundle, CdiContainerState cdiContainerState) { _bundle = bundle; _cdiContainerState = cdiContainerState; _bundleContext = bundle.getBundleContext(); _extensionDependencies = findExtensionDependencies(bundle.adapt(BundleWiring.class)); _extensions = new ConcurrentSkipListMap<>(Comparator.reverseOrder()); - _beanClassNames = beanClassNames; - _beansXml = beansXml; _cdiContainerState.setExtensionDependencies(_extensionDependencies); } + @Override public void close() { - _cdiContainerState.fire(CdiEvent.State.DESTROYING); + _cdiContainerState.fire(CdiEvent.Type.DESTROYING); if (_extensionTracker != null) { _extensionTracker.close(); @@ -63,32 +58,33 @@ public class Phase_2_Extension { _extensionTracker = null; } else { - _referencePhase.close(); + _nextPhase.close(); - _referencePhase = null; + _nextPhase = null; } - _cdiContainerState.fire(CdiEvent.State.DESTROYED); + _cdiContainerState.fire(CdiEvent.Type.DESTROYED); _cdiContainerState.close(); } + @Override public void open() { - _cdiContainerState.fire(CdiEvent.State.CREATING); + _cdiContainerState.fire(CdiEvent.Type.CREATING); if (!_extensionDependencies.isEmpty()) { Filter filter = FilterBuilder.createExtensionFilter(_extensionDependencies); - _cdiContainerState.fire(CdiEvent.State.WAITING_FOR_EXTENSIONS, filter.toString()); + _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_EXTENSIONS, filter.toString()); _extensionTracker = new ServiceTracker<>(_bundleContext, filter, new ExtensionPhaseCustomizer()); _extensionTracker.open(); } else { - _referencePhase = new Phase_3_Reference(_bundle, _cdiContainerState, _extensions, _beanClassNames, _beansXml); + _nextPhase = new Phase_Configuration(_bundle, _cdiContainerState, _extensions); - _referencePhase.open(); + _nextPhase.open(); } } @@ -112,16 +108,14 @@ public class Phase_2_Extension { return extensionDependencies; } - private static final Logger _log = LoggerFactory.getLogger(Phase_2_Extension.class); + private static final Logger _log = LoggerFactory.getLogger(Phase_Extension.class); - private final Collection<String> _beanClassNames; - private final BeansXml _beansXml; private final Bundle _bundle; private final BundleContext _bundleContext; private final CdiContainerState _cdiContainerState; private final Map<ServiceReference<Extension>, Metadata<Extension>> _extensions; private final List<ExtensionDependency> _extensionDependencies; - private Phase_3_Reference _referencePhase; + private Phase _nextPhase; private ServiceTracker<Extension, ExtensionDependency> _extensionTracker; @@ -145,9 +139,9 @@ public class Phase_2_Extension { } if ((trackedDependency != null) && _extensionDependencies.isEmpty()) { - _referencePhase = new Phase_3_Reference(_bundle, _cdiContainerState, _extensions, _beanClassNames, _beansXml); + _nextPhase = new Phase_Configuration(_bundle, _cdiContainerState, _extensions); - _referencePhase.open(); + _nextPhase.open(); } else if (_log.isDebugEnabled()) { _log.debug("CDIe - Still waiting for extensions {}", _extensionDependencies); @@ -163,11 +157,11 @@ public class Phase_2_Extension { @Override public void removedService(ServiceReference<Extension> reference, ExtensionDependency extentionDependency) { if (_extensionDependencies.isEmpty()) { - _referencePhase.close(); + _nextPhase.close(); - _referencePhase = null; + _nextPhase = null; - _cdiContainerState.fire(CdiEvent.State.WAITING_FOR_EXTENSIONS); + _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_EXTENSIONS); } _extensions.remove(reference); Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java (from r1784895, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_1_Init.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_1_Init.java&r1=1784895&r2=1784896&rev=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_1_Init.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java Wed Mar 1 10:06:32 2017 @@ -14,36 +14,33 @@ package org.apache.aries.cdi.container.internal.container; -import java.util.Collection; - -import org.apache.aries.cdi.container.internal.locate.ClassLocater; -import org.apache.aries.cdi.container.internal.locate.ClassLocaterResult; -import org.jboss.weld.bootstrap.spi.BeansXml; -import org.jboss.weld.xml.BeansXmlParser; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.apache.aries.cdi.container.internal.model.BeansModelBuilder; import org.osgi.framework.Bundle; import org.osgi.framework.wiring.BundleWiring; -public class Phase_1_Init { +public class Phase_Init implements Phase { - public Phase_1_Init(Bundle bundle, CdiContainerState cdiContainerState) { + public Phase_Init(Bundle bundle, CdiContainerState cdiContainerState) { BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); - ClassLocaterResult locatorResult = ClassLocater.locate(bundleWiring); - Collection<String> beanClassNames = locatorResult.getBeanClassNames(); - BeansXmlParser beansXmlParser = new BeansXmlParser(); - BeansXml beansXml = beansXmlParser.parse(locatorResult.getBeanDescriptorURLs()); + BeansModel beansModel = new BeansModelBuilder(bundleWiring, cdiContainerState.getExtenderBundle()).build(); + + cdiContainerState.setBeansModel(beansModel); - _extensionPhase = new Phase_2_Extension(bundle, cdiContainerState, beanClassNames, beansXml); + _extensionPhase = new Phase_Extension(bundle, cdiContainerState); } + @Override public void close() { _extensionPhase.close(); } + @Override public void open() { _extensionPhase.open(); } - private final Phase_2_Extension _extensionPhase; + private final Phase _extensionPhase; } \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java (from r1784895, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_4_Publish.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_4_Publish.java&r1=1784895&r2=1784896&rev=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_4_Publish.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java Wed Mar 1 10:06:32 2017 @@ -14,12 +14,8 @@ package org.apache.aries.cdi.container.internal.container; -import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE; -import static org.osgi.service.cdi.CdiExtenderConstants.CDI_EXTENDER; -import static org.osgi.service.cdi.CdiExtenderConstants.REQUIREMENT_SERVICES_DIRECTIVE; - import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collection; import java.util.Dictionary; import java.util.HashMap; import java.util.HashSet; @@ -36,30 +32,32 @@ import javax.naming.spi.ObjectFactory; import org.apache.aries.cdi.container.internal.bean.ReferenceBean; import org.apache.aries.cdi.container.internal.literal.AnyLiteral; import org.apache.aries.cdi.container.internal.literal.ServiceLiteral; +import org.apache.aries.cdi.container.internal.model.ServiceModel; import org.jboss.weld.bootstrap.api.Bootstrap; import org.jboss.weld.manager.BeanManagerImpl; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; -import org.osgi.framework.wiring.BundleRequirement; -import org.osgi.framework.wiring.BundleWire; -import org.osgi.framework.wiring.BundleWiring; import org.osgi.service.cdi.CdiEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class Phase_4_Publish { - - public Phase_4_Publish( - Phase_3_Reference referencePhase, Bootstrap bootstrap) { +public class Phase_Publish implements Phase { - _referencePhase = referencePhase; + public Phase_Publish( + List<ReferenceDependency> references, List<ServiceDeclaration> services, CdiContainerState cdiContainerState, + Bootstrap bootstrap) { + + _references = references; + _services = services; + _cdiContainerState = cdiContainerState; _bootstrap = bootstrap; - _bundle = _referencePhase._bundle; - _bundleContext = _referencePhase._bundle.getBundleContext(); + _bundle = cdiContainerState.getBundle(); + _bundleContext = _bundle.getBundleContext(); } + @Override public void close() { for (ServiceRegistration<?> registration : _registrations) { try { @@ -99,10 +97,11 @@ public class Phase_4_Publish { _bootstrap.shutdown(); } + @Override public void open() { - _referencePhase._cdiContainerState.fire(CdiEvent.State.SATISFIED); + _cdiContainerState.fire(CdiEvent.Type.SATISFIED); - BeanManager beanManager = _referencePhase._cdiContainerState.getBeanManager(); + BeanManager beanManager = _cdiContainerState.getBeanManager(); processReferenceDependencies((BeanManagerImpl)beanManager); @@ -115,44 +114,13 @@ public class Phase_4_Publish { _beanManagerRegistration = _bundleContext.registerService( BeanManager.class, beanManager, null); - _referencePhase._cdiContainerState.fire(CdiEvent.State.CREATED); - } - - private List<String> getServiceClassNames() { - List<String> serviceClassNames = new ArrayList<>(); - - BundleWiring bundleWiring = _bundle.adapt(BundleWiring.class); - List<BundleWire> requiredBundleWires = bundleWiring.getRequiredWires(EXTENDER_NAMESPACE); - - for (BundleWire bundleWire : requiredBundleWires) { - Map<String, Object> attributes = bundleWire.getCapability().getAttributes(); - - if (attributes.containsKey(EXTENDER_NAMESPACE) && - attributes.get(EXTENDER_NAMESPACE).equals(CDI_EXTENDER)) { - - BundleRequirement requirement = bundleWire.getRequirement(); - - Map<String, String> directives = requirement.getDirectives(); - - if (directives.containsKey(REQUIREMENT_SERVICES_DIRECTIVE)) { - String string = directives.get(REQUIREMENT_SERVICES_DIRECTIVE); - - List<String> services = Arrays.asList(string.split("\\s*,\\s*")); - - if (!services.isEmpty()) { - serviceClassNames.addAll(services); - } - } - } - } - - return serviceClassNames; + _cdiContainerState.fire(CdiEvent.Type.CREATED); } private void processReferenceDependencies(BeanManagerImpl beanManagerImpl) { Map<ServiceReference<?>, Set<ReferenceBean>> beans = new HashMap<>(); - for (ReferenceDependency referenceDependency : _referencePhase._referenceDependencies) { + for (ReferenceDependency referenceDependency : _references) { for (ServiceReference<?> matchingReference : referenceDependency.getMatchingReferences()) { Set<ReferenceBean> set = beans.get(matchingReference); @@ -194,36 +162,52 @@ public class Phase_4_Publish { } private void processRequirementDefinedServices(BeanManagerImpl beanManagerImpl) { - List<String> serviceClassNames = getServiceClassNames(); + Collection<ServiceModel> serviceModels = _cdiContainerState.getBeansModel().getServiceModels(); - for (String serviceClassName : serviceClassNames) { + for (ServiceModel serviceModel : serviceModels) { try { - Class<?> beanClass = _bundle.loadClass(serviceClassName); + Class<?> beanClass = _bundle.loadClass(serviceModel.getBeanClass()); Set<Bean<?>> beans = beanManagerImpl.getBeans(beanClass, AnyLiteral.INSTANCE); if (beans.isEmpty()) { _log.error( - "CDIe - MANIFEST service processing cannot find bean for class {}", serviceClassName); + "CDIe - MANIFEST service processing cannot find bean for class {}", + serviceModel.getBeanClass()); continue; } Bean<?> bean = beanManagerImpl.resolve(beans); CreationalContext<?> creationalContext = beanManagerImpl.createCreationalContext(bean); + + List<String> provides = serviceModel.getProvides(); + List<Class<?>> interfaces = new ArrayList<>(); + + for (String provide : provides) { + try { + interfaces.add(_bundle.loadClass(provide)); + } + catch (Exception e) { + _log.error("CDIe - Failure loading provided interface for service {}", provide); + } + } + ServiceDeclaration serviceDeclaration = new ServiceDeclaration( - ServiceLiteral.INSTANCE, bean, creationalContext); + ServiceLiteral.from(interfaces.toArray(new Class<?>[0]), serviceModel.getProperties()), bean, + creationalContext); processServiceDeclaration(serviceDeclaration); } catch (ClassNotFoundException cnfe) { - _log.error("CDIe - MANIFEST service processing cannot load class {}", serviceClassName, cnfe); + _log.error( + "CDIe - MANIFEST service processing cannot load class {}", serviceModel.getBeanClass(), cnfe); } } } private void processServiceDeclarations() { - for (ServiceDeclaration serviceDeclaration : _referencePhase._services) { + for (ServiceDeclaration serviceDeclaration : _services) { processServiceDeclaration(serviceDeclaration); } } @@ -241,13 +225,15 @@ public class Phase_4_Publish { _bundleContext.registerService(classNames, serviceInstance, properties)); } - private static final Logger _log = LoggerFactory.getLogger(Phase_4_Publish.class); + private static final Logger _log = LoggerFactory.getLogger(Phase_Publish.class); private final Bootstrap _bootstrap; private final Bundle _bundle; private final BundleContext _bundleContext; - private final Phase_3_Reference _referencePhase; + private final CdiContainerState _cdiContainerState; + private final List<ReferenceDependency> _references; private final List<ServiceRegistration<?>> _registrations = new CopyOnWriteArrayList<>(); + private final List<ServiceDeclaration> _services; private ServiceRegistration<BeanManager> _beanManagerRegistration; private ServiceRegistration<ObjectFactory> _objectFactoryRegistration; Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Reference.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Reference.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Reference.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Reference.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,221 @@ +package org.apache.aries.cdi.container.internal.container; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.apache.aries.cdi.container.internal.literal.ReferenceLiteral; +import org.apache.aries.cdi.container.internal.model.ReferenceInjectionPoint; +import org.apache.aries.cdi.container.internal.model.ReferenceModel; +import org.jboss.weld.bootstrap.api.Bootstrap; +import org.jboss.weld.manager.BeanManagerImpl; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.cdi.CdiEvent; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Phase_Reference implements Phase { + + public Phase_Reference( + List<ReferenceDependency> references, List<ServiceDeclaration> services, CdiContainerState cdiContainerState, + Bootstrap bootstrap) { + + _references = references; + _services = services; + _cdiContainerState = cdiContainerState; + _bootstrap = bootstrap; + _bundle = _cdiContainerState.getBundle(); + _bundleContext = _bundle.getBundleContext(); + } + + @Override + public void close() { + if (_serviceTracker != null) { + _serviceTracker.close(); + + _serviceTracker = null; + } + else { + _lock.lock(); + + try { + if (_nextPhase != null) { + _nextPhase.close(); + + _nextPhase = null; + } + } + finally { + _lock.unlock(); + } + } + } + + @Override + public void open() { + processDescriptorReferences((BeanManagerImpl)_cdiContainerState.getBeanManager()); + + if (!_references.isEmpty()) { + Filter filter = FilterBuilder.createReferenceFilter(_references); + + _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_SERVICES, filter.toString()); + + _serviceTracker = new ServiceTracker<>(_bundleContext, filter, new ReferencePhaseCustomizer(_bootstrap)); + + _serviceTracker.open(); + } + + _lock.lock(); + + try { + if ((_nextPhase == null) && dependenciesAreEmptyOrAllOptional()) { + _nextPhase = new Phase_Publish(_references, _services, _cdiContainerState, _bootstrap); + + _nextPhase.open(); + } + } + finally { + _lock.unlock(); + } + } + + private boolean dependenciesAreEmptyOrAllOptional() { + if (_references.isEmpty()) { + return true; + } + + for (ReferenceDependency referenceDependency : _references) { + if (referenceDependency.getMinCardinality() > 0) { + return false; + } + } + + return true; + } + + private void processDescriptorReferences(BeanManagerImpl beanManagerImpl) { + Collection<ReferenceModel> referenceModels = _cdiContainerState.getBeansModel().getReferenceModels(); + + for (ReferenceModel referenceModel : referenceModels) { + processReferenceModel(referenceModel, beanManagerImpl); + } + } + + private void processReferenceModel(ReferenceModel referenceModel, BeanManagerImpl beanManagerImpl) { + try { + Class<?> beanClass = _bundle.loadClass(referenceModel.getBeanClass()); + + ReferenceDependency referenceDependency = new ReferenceDependency( + beanManagerImpl, ReferenceLiteral.fromTarget(referenceModel.getTarget()), + new ReferenceInjectionPoint(beanClass, referenceModel.getTarget())); + + _references.add(referenceDependency); + } + catch (ClassNotFoundException cnfe) { + _log.error( + "CDIe - osgi bean descriptor reference processing cannot load class {}", + referenceModel.getBeanClass(), cnfe); + } + catch (InvalidSyntaxException ise) { + _log.error("CDIe - osgi bean descriptor reference processing error", ise); + } + } + + private static final Logger _log = LoggerFactory.getLogger(Phase_Reference.class); + + private final Bootstrap _bootstrap; + private final Bundle _bundle; + private final BundleContext _bundleContext; + private final CdiContainerState _cdiContainerState; + private final Lock _lock = new ReentrantLock(true); + private Phase _nextPhase; + private final List<ReferenceDependency> _references; + private final List<ServiceDeclaration> _services; + + ServiceTracker<?, ?> _serviceTracker; + + private class ReferencePhaseCustomizer implements ServiceTrackerCustomizer<Object, Object> { + + public ReferencePhaseCustomizer(Bootstrap bootstrap) { + _bootstrap = bootstrap; + } + + @Override + public Object addingService(ServiceReference<Object> reference) { + _lock.lock(); + + try { + if (_nextPhase != null) { + return null; + } + + boolean matches = false; + boolean resolved = true; + + for (ReferenceDependency referenceDependency : _references) { + if (referenceDependency.matches(reference)) { + referenceDependency.resolve(reference); + matches = true; + } + if (!referenceDependency.isResolved()) { + resolved = false; + } + } + + if (!matches) { + return null; + } + + if (resolved) { + _nextPhase = new Phase_Publish(_references, _services, _cdiContainerState, _bootstrap); + + _nextPhase.open(); + } + + return new Object(); + } + finally { + _lock.unlock(); + } + } + + @Override + public void modifiedService(ServiceReference<Object> reference, Object object) { + } + + @Override + public void removedService(ServiceReference<Object> reference, Object object) { + _lock.lock(); + + try { + if (_nextPhase != null) { + _nextPhase.close(); + + _nextPhase = null; + + _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_SERVICES); + } + + for (ReferenceDependency referenceDependency : _references) { + if (referenceDependency.matches(reference)) { + referenceDependency.unresolve(reference); + } + } + } + finally { + _lock.unlock(); + } + } + + private final Bootstrap _bootstrap; + + } + +} Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceDependency.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceDependency.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceDependency.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceDependency.java Wed Mar 1 10:06:32 2017 @@ -17,7 +17,6 @@ package org.apache.aries.cdi.container.i import static org.apache.aries.cdi.container.internal.util.Reflection.cast; import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.WildcardType; @@ -29,7 +28,7 @@ import java.util.concurrent.ConcurrentSk import javax.enterprise.inject.Instance; import javax.enterprise.inject.spi.InjectionPoint; -import org.apache.aries.cdi.container.internal.util.Strings; +import org.apache.aries.cdi.container.internal.util.Maps; import org.jboss.weld.manager.BeanManagerImpl; import org.osgi.framework.Constants; import org.osgi.framework.Filter; @@ -38,10 +37,11 @@ import org.osgi.framework.InvalidSyntaxE import org.osgi.framework.ServiceReference; import org.osgi.service.cdi.annotations.MinCardinality; import org.osgi.service.cdi.annotations.Reference; -import org.osgi.service.cdi.annotations.ReferenceFilterQualifier; +import org.osgi.service.cdi.annotations.ReferenceFilter; import org.osgi.service.cdi.annotations.ReferenceScope; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.osgi.util.converter.Converter; +import org.osgi.util.converter.StandardConverter; +import org.osgi.util.converter.TypeReference; public class ReferenceDependency { @@ -170,27 +170,10 @@ public class ReferenceDependency { } for (Annotation qualifier : qualifiers) { - if (qualifier.annotationType().isAnnotationPresent(ReferenceFilterQualifier.class)) { - Class<?> clazz = qualifier.annotationType(); - try { - Method methodValue = clazz.getDeclaredMethod("value"); - String value = String.valueOf(methodValue.invoke(qualifier)); - append(sb, clazz.getSimpleName(), value); - } - catch (ReflectiveOperationException roe) { - Method[] methods = clazz.getDeclaredMethods(); + if (qualifier.annotationType().isAnnotationPresent(ReferenceFilter.class)) { + Map<String, String> map = _converter.convert(qualifier).sourceAs(qualifier.annotationType()).to(_mapType); - for (Method method : methods) { - try { - String value = String.valueOf(method.invoke(qualifier)); - append(sb, method.getName(), value); - } catch (ReflectiveOperationException roe2) { - if (_log.isDebugEnabled()) { - _log.debug("CDIe - Failure in reference filter qualifier processing", roe2); - } - } - } - } + Maps.appendFilter(sb, map); } } @@ -199,14 +182,6 @@ public class ReferenceDependency { return sb.toString(); } - private void append(StringBuilder sb, String simpleName, String value) { - sb.append("("); - sb.append(Strings.camelCase(simpleName)); - sb.append("="); - sb.append(value); - sb.append(")"); - } - private BindType getBindType(Type type) { if (type instanceof ParameterizedType) { ParameterizedType parameterizedType = cast(type); @@ -324,7 +299,9 @@ public class ReferenceDependency { return cast(first); } - private static final Logger _log = LoggerFactory.getLogger(ReferenceDependency.class); + private static final Converter _converter = new StandardConverter(); + + private static final TypeReference<Map<String, String>> _mapType = new TypeReference<Map<String, String>>(){}; private final BeanManagerImpl _beanManagerImpl; private final BindType _bindType; Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ServiceDeclaration.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ServiceDeclaration.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ServiceDeclaration.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ServiceDeclaration.java Wed Mar 1 10:06:32 2017 @@ -15,30 +15,27 @@ package org.apache.aries.cdi.container.internal.container; import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Dictionary; import java.util.Hashtable; import java.util.List; +import java.util.Map; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.inject.Singleton; -import org.apache.aries.cdi.container.internal.util.Strings; import org.osgi.framework.Bundle; import org.osgi.framework.PrototypeServiceFactory; import org.osgi.framework.ServiceFactory; import org.osgi.framework.ServiceRegistration; import org.osgi.service.cdi.annotations.Service; import org.osgi.service.cdi.annotations.ServiceProperty; -import org.osgi.service.cdi.annotations.ServicePropertyQualifier; import org.osgi.util.converter.Converter; import org.osgi.util.converter.StandardConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.osgi.util.converter.TypeReference; public class ServiceDeclaration { @@ -51,35 +48,16 @@ public class ServiceDeclaration { Dictionary<String, Object> properties = new Hashtable<>(); for (Object object : bean.getQualifiers()) { - Annotation qualifier = (Annotation)object; - if (qualifier.annotationType().isAnnotationPresent(ServicePropertyQualifier.class)) { - Class<?> clazz = qualifier.annotationType(); - try { - Method methodValue = clazz.getDeclaredMethod("value"); - put(properties, clazz.getSimpleName(), methodValue.invoke(qualifier)); - } - catch (ReflectiveOperationException roe) { - Method[] methods = clazz.getDeclaredMethods(); + Annotation annotation = (Annotation)object; + Map<String, Object> map = _converter.convert(annotation).sourceAs(annotation.annotationType()).to(_mapType); - for (Method method : methods) { - try { - put(properties, method.getName(), method.invoke(qualifier)); - } catch (ReflectiveOperationException roe2) { - if (_log.isDebugEnabled()) { - _log.debug("CDIe - Failure in service property qualifier processing", roe2); - } - } - } - } + for (Map.Entry<String, Object> entry : map.entrySet()) { + properties.put(entry.getKey(), entry.getValue()); } } for (ServiceProperty serviceProperty : _service.properties()) { - Type type = serviceProperty.type().getType(); - String[] value = serviceProperty.value().split("\\s*,\\s*"); - - @SuppressWarnings("deprecation") - Object object = _converter.convert(value).to(type); + Object object = getValue(serviceProperty); properties.put(serviceProperty.key(), object); } @@ -87,10 +65,6 @@ public class ServiceDeclaration { _properties = properties; } - private void put(Dictionary<String, Object> properties, String simpleName, Object value) { - properties.put(Strings.camelCase(simpleName), value); - } - @SuppressWarnings("rawtypes") public Bean getBean() { return _bean; @@ -139,10 +113,16 @@ public class ServiceDeclaration { return new PrototypeScopeWrapper(); } - @SuppressWarnings("deprecation") + Object getValue(ServiceProperty serviceProperty) { + Type type = serviceProperty.type().getType(); + String[] value = serviceProperty.value(); + Object object = _converter.convert(value).to(type); + return object; + } + private static final Converter _converter = new StandardConverter(); - private static final Logger _log = LoggerFactory.getLogger(ServiceDeclaration.class); + private static final TypeReference<Map<String, Object>> _mapType = new TypeReference<Map<String, Object>>(){}; @SuppressWarnings("rawtypes") private final Bean _bean; Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java Wed Mar 1 10:06:32 2017 @@ -8,7 +8,15 @@ import org.osgi.service.cdi.annotations. public class ReferenceLiteral extends AnnotationLiteral<Reference> implements Reference { private static final long serialVersionUID = 1L; - public static final Reference INSTANCE = new ReferenceLiteral(); + public static final Reference INSTANCE = new ReferenceLiteral(""); + + public static ReferenceLiteral fromTarget(String target) { + return new ReferenceLiteral(target); + } + + public ReferenceLiteral(String target) { + _target = target; + } @Override public ReferenceScope scope() { @@ -17,7 +25,7 @@ public class ReferenceLiteral extends An @Override public String target() { - return ""; + return _target; } @Override @@ -25,4 +33,6 @@ public class ReferenceLiteral extends An return Object.class; } + private final String _target; + } Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServiceLiteral.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServiceLiteral.java?rev=1784896&r1=1784895&r2=1784896&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServiceLiteral.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServiceLiteral.java Wed Mar 1 10:06:32 2017 @@ -10,6 +10,10 @@ public class ServiceLiteral extends Anno private static final long serialVersionUID = 1L; public static final Service INSTANCE = new ServiceLiteral(new Class<?>[0], new ServiceProperty[0]); + public static ServiceLiteral from(Class<?>[] classes, ServiceProperty[] properties) { + return new ServiceLiteral(classes, properties); + } + public ServiceLiteral(Class<?>[] classes, ServiceProperty[] properties) { _type = classes; _properties = properties; Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServicePropertyLiteral.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServicePropertyLiteral.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServicePropertyLiteral.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ServicePropertyLiteral.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,41 @@ +package org.apache.aries.cdi.container.internal.literal; + +import javax.enterprise.util.AnnotationLiteral; + +import org.osgi.service.cdi.annotations.PropertyType; +import org.osgi.service.cdi.annotations.ServiceProperty; + +public class ServicePropertyLiteral extends AnnotationLiteral<ServiceProperty> implements ServiceProperty { + + private static final long serialVersionUID = 1L; + + public static ServicePropertyLiteral from(String key, String[] value, PropertyType type) { + return new ServicePropertyLiteral(key, value, type); + } + + public ServicePropertyLiteral(String key, String[] value, PropertyType type) { + _key = key; + _value = value; + _type = type; + } + + @Override + public String key() { + return _key; + } + + @Override + public String[] value() { + return _value; + } + + @Override + public PropertyType type() { + return _type; + } + + private final String _key; + private final PropertyType _type; + private final String[] _value; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModel.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModel.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModel.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModel.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,21 @@ +package org.apache.aries.cdi.container.internal.model; + +import org.xml.sax.Attributes; + +public class AbstractModel { + + String getValue(String uri, String localName, Attributes attributes) { + String value = attributes.getValue(uri, localName); + + if (value == null) { + value = attributes.getValue("", localName); + } + + if (value != null) { + value = value.trim(); + } + + return value; + } + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,154 @@ +package org.apache.aries.cdi.container.internal.model; + +import static org.apache.aries.cdi.container.internal.util.Reflection.cast; +import static org.osgi.service.cdi.CdiExtenderConstants.REQUIREMENT_BEANS_ATTRIBUTE; +import static org.osgi.service.cdi.CdiExtenderConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.aries.cdi.container.internal.util.Throw; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; + +public abstract class AbstractModelBuilder { + + public BeansModel build() { + List<URL> beanDescriptorURLs = new ArrayList<URL>(); + Map<String, Object> attributes = getAttributes(); + + List<String> beanDescriptorPaths = cast(attributes.get(REQUIREMENT_BEANS_ATTRIBUTE)); + + if (beanDescriptorPaths != null) { + for (String descriptorPath : beanDescriptorPaths) { + Collection<String> resources = getResources(descriptorPath); + + if (resources != null) { + for (String resource : resources) { + URL url = getResource(resource); + + if (url != null) { + beanDescriptorURLs.add(url); + } + } + } + } + } + + String osgiBeansDescriptorPath = cast(attributes.get(REQUIREMENT_OSGI_BEANS_ATTRIBUTE)); + + if (osgiBeansDescriptorPath == null) { + osgiBeansDescriptorPath = "OSGI-INF/cdi/osgi-beans.xml"; + } + + URL osgiBeansDescriptorURL = getResource(osgiBeansDescriptorPath); + + return parse(osgiBeansDescriptorURL, beanDescriptorURLs); + } + + abstract Map<String, Object> getAttributes(); + + abstract ClassLoader getClassLoader(); + + abstract URL getResource(String resource); + + abstract Collection<String> getResources(String descriptorString); + + private OSGiBeansHandler getHandler(List<URL> beanDescriptorURLs) { + return new OSGiBeansHandler(beanDescriptorURLs); + } + + private BeansModel parse(URL osgiBeansDescriptorURL, List<URL> beanDescriptorURLs) { + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(false); + factory.setNamespaceAware(true); + + if (osgiBeansDescriptorURL == null) { + throw new IllegalArgumentException("Missing osgi-beans descriptor: " + osgiBeansDescriptorURL); + } + + SAXParser parser; + + try { + parser = factory.newSAXParser(); + } + catch (ParserConfigurationException | SAXException e) { + return Throw.exception(e); + } + + InputStream inputStream = null; + + try { + inputStream = osgiBeansDescriptorURL.openStream(); + InputSource source = new InputSource(inputStream); + + if (source.getByteStream().available() == 0) { + throw new IllegalArgumentException( + "Specified osgi-beans descriptor is empty: " + osgiBeansDescriptorURL); + } + + try { + parser.setProperty( + "http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); + parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", loadXsds()); + } + catch (IllegalArgumentException | SAXNotRecognizedException | SAXNotSupportedException e) { + // No op, we just don't validate the XML + } + + OSGiBeansHandler handler = getHandler(beanDescriptorURLs); + + parser.parse(source, handler); + + return handler.createBeansModel(); + } + catch (IOException | SAXException e) { + return Throw.exception(e); + } + finally { + if (inputStream != null) { + try { + inputStream.close(); + } + catch (IOException e) { + throw new IllegalStateException(e); + } + } + } + } + + private InputSource loadXsd(String name) { + InputStream in = getClassLoader().getResourceAsStream(name); + if (in == null) { + return null; + } + else { + return new InputSource(in); + } + } + + private InputSource[] loadXsds() { + List<InputSource> xsds = new ArrayList<InputSource>(); + + for (XmlSchema schema : XmlSchema.values()) { + InputSource source = loadXsd(schema.getFileName()); + if (source != null) { + xsds.add(source); + } + } + + return xsds.toArray(new InputSource[0]); + } + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,71 @@ +/** + * 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.model; + +import java.net.URL; +import java.util.Collection; + +import org.jboss.weld.bootstrap.spi.BeansXml; +import org.jboss.weld.xml.BeansXmlParser; + +public class BeansModel { + + public BeansModel( + Collection<String> beanClasses, Collection<ConfigurationModel> configurationModels, + Collection<ReferenceModel> referenceModels, Collection<ServiceModel> serviceModels, + Collection<URL> beanDescriptorURLs) { + + _beanClasses = beanClasses; + _configurationModels = configurationModels; + _referenceModels = referenceModels; + _serviceModels = serviceModels; + + BeansXml beansXml = BeansXml.EMPTY_BEANS_XML; + + if (!beanDescriptorURLs.isEmpty()) { + BeansXmlParser beansXmlParser = new BeansXmlParser(); + beansXml = beansXmlParser.parse(beanDescriptorURLs); + } + + _beansXml = beansXml; + } + + public Collection<String> getBeanClassNames() { + return _beanClasses; + } + + public BeansXml getBeansXml() { + return _beansXml; + } + + public Collection<ConfigurationModel> getConfigurationModels() { + return _configurationModels; + } + + public Collection<ReferenceModel> getReferenceModels() { + return _referenceModels; + } + + public Collection<ServiceModel> getServiceModels() { + return _serviceModels; + } + + private final Collection<String> _beanClasses; + private final BeansXml _beansXml; + private final Collection<ConfigurationModel> _configurationModels; + private final Collection<ReferenceModel> _referenceModels; + private final Collection<ServiceModel> _serviceModels; + +} \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,87 @@ +/** + * 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.model; + +import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE; +import static org.osgi.service.cdi.CdiExtenderConstants.CDI_EXTENDER; + +import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.osgi.framework.Bundle; +import org.osgi.framework.wiring.BundleCapability; +import org.osgi.framework.wiring.BundleRequirement; +import org.osgi.framework.wiring.BundleWire; +import org.osgi.framework.wiring.BundleWiring; + +public class BeansModelBuilder extends AbstractModelBuilder { + + public BeansModelBuilder(BundleWiring bundleWiring, Bundle extenderBundle) { + _bundleWiring = bundleWiring; + _extenderBundle = extenderBundle; + _bundle = _bundleWiring.getBundle(); + + List<BundleWire> wires = bundleWiring.getRequiredWires(EXTENDER_NAMESPACE); + + Map<String, Object> cdiAttributes = Collections.emptyMap(); + + for (BundleWire wire : wires) { + BundleCapability capability = wire.getCapability(); + Map<String, Object> attributes = capability.getAttributes(); + String extender = (String)attributes.get(EXTENDER_NAMESPACE); + + if (extender.equals(CDI_EXTENDER)) { + BundleRequirement requirement = wire.getRequirement(); + cdiAttributes = requirement.getAttributes(); + break; + } + } + + _attributes = cdiAttributes; + } + + @Override + Map<String, Object> getAttributes() { + return _attributes; + } + + @Override + ClassLoader getClassLoader() { + return _extenderBundle.adapt(BundleWiring.class).getClassLoader(); + } + + @Override + URL getResource(String resource) { + return _bundle.getResource(resource); + } + + @Override + Collection<String> getResources(String descriptorString) { + int pos = descriptorString.lastIndexOf('/'); + String path = descriptorString.substring(0, pos); + String fileName = descriptorString.substring(pos, descriptorString.length()); + + return _bundleWiring.listResources(path, fileName, BundleWiring.LISTRESOURCES_LOCAL); + } + + private final Map<String, Object> _attributes; + private final Bundle _bundle; + private final BundleWiring _bundleWiring; + private final Bundle _extenderBundle; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ConfigurationModel.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ConfigurationModel.java?rev=1784896&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ConfigurationModel.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ConfigurationModel.java Wed Mar 1 10:06:32 2017 @@ -0,0 +1,20 @@ +package org.apache.aries.cdi.container.internal.model; + +import static org.apache.aries.cdi.container.internal.model.Constants.CDI10_URI; +import static org.apache.aries.cdi.container.internal.model.Constants.PID_ATTRIBUTE; + +import org.xml.sax.Attributes; + +public class ConfigurationModel extends AbstractModel { + + public ConfigurationModel(Attributes attributes) { + _pid = getValue(CDI10_URI, PID_ATTRIBUTE, attributes); + } + + public String getPid() { + return _pid; + } + + private final String _pid; + +}
