Author: rotty3000 Date: Thu May 4 18:41:59 2017 New Revision: 1793847 URL: http://svn.apache.org/viewvc?rev=1793847&view=rev Log: [CDI] major refactor
Signed-off-by: Raymond Augé <[email protected]> Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java - copied, changed from r1792762, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BootstrapContainer.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationManagedService.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationResolveAction.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ConfigurationInjectionPoint.java - copied, changed from r1792762, 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/util/Conversions.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/PropertyType.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/model/MapsTest.java aries/trunk/cdi/cdi-itests/bnd/tb5-beans.xml aries/trunk/cdi/cdi-itests/bnd/tb5.bnd aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/Instance_Optional.java - copied, changed from r1792762, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstanceCardinality0Bean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/Instance_ServiceProperties.java - copied, changed from r1792762, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstancePropertiesBean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/Instance_ServiceReference.java - copied, changed from r1792762, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstanceServiceReferenceBean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb3/Config.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb3/ConfigurationBeanB.java - copied, changed from r1792762, aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb3/ConfigurationBeanA.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb5/ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb5/Config.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb5/ConfigurationBeanC.java - copied, changed from r1792762, 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/literal/ServicePropertyLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/PropertyModel.java aries/trunk/cdi/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiObjectFactory.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstanceBean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstanceCardinality0Bean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstanceOrderBean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstancePropertiesBean.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/InstanceServiceReferenceBean.java Modified: aries/trunk/cdi/cdi-extender/bnd.bnd 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/bean/BundleContextBean.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.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/BindType.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.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/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/ExtensionDependency.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 aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_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/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/AnyLiteral.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/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/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/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/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/Strings.java aries/trunk/cdi/cdi-extender/src/main/resources/META-INF/cdi.xsd 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/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-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/Activator.java aries/trunk/cdi/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiExtension.java aries/trunk/cdi/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiExtensionFactory.java aries/trunk/cdi/cdi-itests/bnd.bnd aries/trunk/cdi/cdi-itests/bnd/basic-beans.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/tb4-beans.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/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiBeanTests.java 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/JndiExtensionTests.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/components/ServiceBundleScope.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb3/ConfigurationBeanA.java Modified: aries/trunk/cdi/cdi-extender/bnd.bnd URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/bnd.bnd?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/bnd.bnd (original) +++ aries/trunk/cdi/cdi-extender/bnd.bnd Thu May 4 18:41:59 2017 @@ -1,12 +1,12 @@ Bundle-Activator: org.apache.aries.cdi.container.internal.Activator Conditional-Package: \ + org.apache.felix.converter.dto,\ org.apache.felix.converter.impl,\ org.apache.felix.utils.extender,\ org.osgi.util.converter,\ org.osgi.util.function Export-Package: \ org.apache.aries.cdi.provider -#Import-Package: javax.el, javax.interceptor, * Provide-Capability: \ osgi.extender; \ osgi.extender='osgi.cdi'; \ Modified: aries/trunk/cdi/cdi-extender/pom.xml URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/pom.xml?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/pom.xml (original) +++ aries/trunk/cdi/cdi-extender/pom.xml Thu May 4 18:41:59 2017 @@ -62,6 +62,11 @@ </exclusions> </dependency> <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-annotation_1.2_spec</artifactId> + <version>1.0</version> + </dependency> + <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-osgi-bundle</artifactId> <version>2.4.2.Final</version> @@ -114,6 +119,12 @@ <artifactId>slf4j-api</artifactId> <version>1.7.0</version> </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> </dependencies> </project> 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=1793847&r1=1793846&r2=1793847&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 Thu May 4 18:41:59 2017 @@ -15,7 +15,7 @@ package org.apache.aries.cdi.container.internal; import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE; -import static org.osgi.service.cdi.CdiExtenderConstants.CDI_EXTENDER; +import static org.osgi.service.cdi.CdiConstants.CDI_CAPABILITY_NAME; import java.util.Comparator; import java.util.Dictionary; @@ -128,7 +128,7 @@ public class Activator extends AbstractE Map<String, Object> attributes = bundleWire.getCapability().getAttributes(); if (attributes.containsKey(EXTENDER_NAMESPACE) && - attributes.get(EXTENDER_NAMESPACE).equals(CDI_EXTENDER)) { + attributes.get(EXTENDER_NAMESPACE).equals(CDI_CAPABILITY_NAME)) { Bundle providerWiringBundle = bundleWire.getProviderWiring().getBundle(); Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java Thu May 4 18:41:59 2017 @@ -56,7 +56,7 @@ public class BundleContextBean implement @Override public String getName() { - return "BundleContext"; + return "bundleContext"; } @Override @@ -89,6 +89,11 @@ public class BundleContextBean implement return false; } + @Override + public String toString() { + return "BundleContextBean[bundleContext]"; + } + private static final Set<Annotation> DEFAULT_QUALIFIERS = Sets.hashSet( DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE); private static final Set<Type> TYPES = Sets.immutableHashSet(BundleContext.class, Object.class); Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java (from r1792762, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java&r1=1792762&r2=1793847&rev=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java Thu May 4 18:41:59 2017 @@ -18,8 +18,8 @@ import static org.apache.aries.cdi.conta import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.AbstractMap; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -29,45 +29,35 @@ import javax.enterprise.context.spi.Crea import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.InjectionPoint; +import javax.inject.Named; -import org.apache.aries.cdi.container.internal.container.BindType; +import org.apache.aries.cdi.container.internal.container.ConfigurationDependency; import org.apache.aries.cdi.container.internal.literal.AnyLiteral; import org.apache.aries.cdi.container.internal.literal.DefaultLiteral; +import org.apache.aries.cdi.container.internal.util.Conversions; import org.apache.aries.cdi.container.internal.util.Sets; import org.jboss.weld.injection.CurrentInjectionPoint; import org.jboss.weld.injection.EmptyInjectionPoint; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.util.Decorators; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceObjects; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ReferenceBean implements Bean<Object> { - - public ReferenceBean( - BeanManagerImpl beanManagerImpl, BundleContext bundleContext, Type injectionPointType, Class<?> beanClass, - BindType bindType, ServiceReference<?> serviceReference) { - _beanManagerImpl = beanManagerImpl; - _bundleContext = bundleContext; +public class ConfigurationBean implements Bean<Object> { - _typesForMatchingBeansToInjectionPoints = Sets.immutableHashSet(injectionPointType, Object.class); - _beanClass = beanClass; - _bindType = bindType; - _serviceReference = serviceReference; + public ConfigurationBean( + ConfigurationDependency configurationDependency, BeanManagerImpl beanManagerImpl, Type injectionPointType, + Set<Annotation> qualifiers) { + _configurationDependency = configurationDependency; + _beanManagerImpl = beanManagerImpl; + _typesForMatchingBeansToInjectionPoints = Sets.immutableHashSet(injectionPointType, Object.class); _currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class); - _qualifiers = Sets.hashSet(DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE); - } + _qualifiers = Sets.hashSet(qualifiers, DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE); - public void addQualifier(Annotation annotation) { - _qualifiers.add(annotation); - } - - public void addQualifiers(Set<Annotation> qualifiers) { - _qualifiers.addAll(qualifiers); + for (Annotation qualifier : _qualifiers) { + if (qualifier.annotationType().equals(Named.class)) { + _name = ((Named)qualifier).value(); + } + } } @Override @@ -76,29 +66,12 @@ public class ReferenceBean implements Be } @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void destroy(Object instance, CreationalContext creationalContext) { - if (_serviceObjects == null) { - return; - } - - try { - _serviceObjects.ungetService(instance); - } - catch (Throwable t) { - if (_log.isWarnEnabled()) { - _log.warn("CDIe - UngetService resulted in error", t); - } - } + public void destroy(Object arg0, CreationalContext<Object> arg1) { } @Override public Class<?> getBeanClass() { - return _beanClass; - } - - public BindType getBindType() { - return _bindType; + return _configurationDependency.getBeanClass(); } @Override @@ -108,7 +81,7 @@ public class ReferenceBean implements Be @Override public String getName() { - return toString() + "#" + System.identityHashCode(this); + return _name; } @Override @@ -143,13 +116,25 @@ public class ReferenceBean implements Be @Override public String toString() { - return "ReferenceBean(" + _serviceReference + ")"; + return "ConfigurationBean[" + _currentInjectionPoint + "]"; } protected <T> T create0(CreationalContext<T> creationalContext) { + Map<String, Object> map = new AbstractMap<String, Object>() { + + @Override + public Set<java.util.Map.Entry<String, Object>> entrySet() { + return _configurationDependency.getConfiguration().entrySet(); + } + + }; + + T instance = cast(Conversions.c().convert(map).to(_configurationDependency.getBeanClass())); InjectionPoint ip = getInjectionPoint(_currentInjectionPoint); + if (ip == null) { + return instance; + } List<Decorator<?>> decorators = getDecorators(ip); - T instance = cast(getServiceImpl()); if (decorators.isEmpty()) { return instance; } @@ -166,38 +151,11 @@ public class ReferenceBean implements Be return EmptyInjectionPoint.INSTANCE.equals(ip) ? null : ip; } - protected Object getServiceImpl() { - if (ServiceReference.class.equals(_beanClass)) { - return _serviceReference; - } - else if (Map.class.equals(_beanClass)) { - Map<String, Object> properties = new HashMap<>(); - - for (String key : _serviceReference.getPropertyKeys()) { - properties.put(key, _serviceReference.getProperty(key)); - } - - return properties; - } - - if (_serviceObjects == null) { - _serviceObjects = _bundleContext.getServiceObjects(_serviceReference); - } - - return _serviceObjects.getService(); - } - - private static final Logger _log = LoggerFactory.getLogger(ReferenceBean.class); - - private final Class<?> _beanClass; - private final BindType _bindType; - private final BundleContext _bundleContext; - private final CurrentInjectionPoint _currentInjectionPoint; private final BeanManagerImpl _beanManagerImpl; + private final ConfigurationDependency _configurationDependency; + private final CurrentInjectionPoint _currentInjectionPoint; + private String _name; private final Set<Annotation> _qualifiers; - @SuppressWarnings("rawtypes") - private volatile ServiceObjects _serviceObjects; - private final ServiceReference<?> _serviceReference; private final Set<Type> _typesForMatchingBeansToInjectionPoints; -} \ No newline at end of file +} Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java Thu May 4 18:41:59 2017 @@ -29,6 +29,7 @@ import javax.enterprise.context.spi.Crea import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.InjectionPoint; +import javax.inject.Named; import org.apache.aries.cdi.container.internal.container.BindType; import org.apache.aries.cdi.container.internal.literal.AnyLiteral; @@ -52,14 +53,18 @@ public class ReferenceBean implements Be _beanManagerImpl = beanManagerImpl; _bundleContext = bundleContext; - _typesForMatchingBeansToInjectionPoints = Sets.immutableHashSet(injectionPointType, Object.class); _beanClass = beanClass; _bindType = bindType; _serviceReference = serviceReference; - _currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class); _qualifiers = Sets.hashSet(DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE); + + for (Annotation qualifier : _qualifiers) { + if (qualifier.annotationType().equals(Named.class)) { + _name = ((Named)qualifier).value(); + } + } } public void addQualifier(Annotation annotation) { @@ -108,7 +113,7 @@ public class ReferenceBean implements Be @Override public String getName() { - return toString() + "#" + System.identityHashCode(this); + return _name; } @Override @@ -143,13 +148,16 @@ public class ReferenceBean implements Be @Override public String toString() { - return "ReferenceBean(" + _serviceReference + ")"; + return "ReferenceBean[" + _serviceReference + "]"; } protected <T> T create0(CreationalContext<T> creationalContext) { + T instance = cast(getServiceImpl()); InjectionPoint ip = getInjectionPoint(_currentInjectionPoint); + if (ip == null) { + return instance; + } List<Decorator<?>> decorators = getDecorators(ip); - T instance = cast(getServiceImpl()); if (decorators.isEmpty()) { return instance; } @@ -190,10 +198,11 @@ public class ReferenceBean implements Be private static final Logger _log = LoggerFactory.getLogger(ReferenceBean.class); private final Class<?> _beanClass; + private final BeanManagerImpl _beanManagerImpl; private final BindType _bindType; private final BundleContext _bundleContext; private final CurrentInjectionPoint _currentInjectionPoint; - private final BeanManagerImpl _beanManagerImpl; + private String _name; private final Set<Annotation> _qualifiers; @SuppressWarnings("rawtypes") private volatile ServiceObjects _serviceObjects; 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=1793847&r1=1793846&r2=1793847&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 Thu May 4 18:41:59 2017 @@ -16,19 +16,17 @@ package org.apache.aries.cdi.container.i import java.util.List; import java.util.Map; +import java.util.Map.Entry; 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; +import org.apache.aries.cdi.container.internal.util.Conversions; public class CdiCommand { - public CdiCommand() { - - } - public void list() { for (CdiContainerState cdiContainerState : _states.values()) { System.out.printf("[%s] %s\n", cdiContainerState.getId(), cdiContainerState.getLastState()); @@ -49,7 +47,7 @@ public class CdiCommand { if (!extensionDependencies.isEmpty()) { System.out.println(" [EXTENSIONS]"); for (ExtensionDependency extensionDependency : extensionDependencies) { - System.out.printf(" %s%s\n", extensionDependency.toString(), " ???is this resolved???"); + System.out.printf(" Extension: %s%s\n", extensionDependency.toString(), " ???is this resolved???"); } } List<ConfigurationDependency> configurationDependencies = cdiContainerState.getConfigurationDependencies(); @@ -58,8 +56,18 @@ public class CdiCommand { for (ConfigurationDependency configurationDependency : configurationDependencies) { for (String pid : configurationDependency.pids()) { System.out.printf( - " %s\n : %s\n", pid, - !configurationDependency.isResolved(pid) ? " UNRESOLVED" : "resolved"); + " PID: %s\n Status: %s\n Required: %s\n", pid, + !configurationDependency.isResolved(pid) ? "UNRESOLVED" : "resolved", + configurationDependency.isRequired()); + Map<String, Object> configuration = configurationDependency.getConfiguration(); + + if (!configuration.isEmpty()) { + System.out.println(" Properties:"); + for (Entry<String, Object> entry : configuration.entrySet()) { + String value = Conversions.toString(entry.getValue()); + System.out.printf(" %s = %s%n", entry.getKey(), value); + } + } } } } @@ -68,9 +76,9 @@ public class CdiCommand { System.out.println(" [REFERENCES]"); for (ReferenceDependency referenceDependency : referenceDependencies) { System.out.printf( - " %s\n Status: %s\n Min Cardinality: %s\n", + " Reference: %s\n Status: %s\n Min Cardinality: %s\n", referenceDependency.toString(), - !referenceDependency.isResolved() ? " UNRESOLVED" : "resolved", + !referenceDependency.isResolved() ? "UNRESOLVED" : "resolved", referenceDependency.getMinCardinality()); } } @@ -86,4 +94,5 @@ public class CdiCommand { private final Map<Long, CdiContainerState> _states = new ConcurrentHashMap<>(); + } \ No newline at end of file Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BindType.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BindType.java?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BindType.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BindType.java Thu May 4 18:41:59 2017 @@ -1,3 +1,17 @@ +/** + * 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; public enum BindType { Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BootstrapContainer.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BootstrapContainer.java?rev=1793847&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BootstrapContainer.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BootstrapContainer.java Thu May 4 18:41:59 2017 @@ -0,0 +1,259 @@ +/** + * 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.Collection; +import java.util.Dictionary; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.enterprise.inject.spi.Extension; + +import org.apache.aries.cdi.container.internal.literal.ReferenceLiteral; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.apache.aries.cdi.container.internal.model.ConfigurationInjectionPoint; +import org.apache.aries.cdi.container.internal.model.ConfigurationModel; +import org.apache.aries.cdi.container.internal.model.ReferenceInjectionPoint; +import org.apache.aries.cdi.container.internal.model.ReferenceModel; +import org.apache.aries.cdi.container.internal.model.ServiceModel; +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.jboss.weld.util.ServiceLoader; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.osgi.framework.wiring.BundleWiring; +import org.osgi.service.cdi.CdiEvent.Type; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BootstrapContainer { + + public BootstrapContainer( + BundleWiring bundleWiring, Map<ServiceReference<Extension>, Metadata<Extension>> extensions, + CdiContainerState cdiContainerState) { + + _bundleWiring = bundleWiring; + _externalExtensions = extensions; + _cdiContainerState = cdiContainerState; + + _bundle = _bundleWiring.getBundle(); + + // Add the internal extensions + _extensions.add( + new ExtensionMetadata( + new ConfigurationExtension(_configurations, _bundle.getBundleContext()), _bundle.toString())); + _extensions.add( + new ExtensionMetadata( + new ReferenceExtension(_references, _bundle.getBundleContext()), _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 : ServiceLoader.load(Extension.class, _bundleWiring.getClassLoader())) { + _extensions.add(meta); + } + + // Add external extensions + for (Metadata<Extension> meta : _externalExtensions.values()) { + _extensions.add(meta); + } + + BeansModel beansModel = _cdiContainerState.getBeansModel(); + + BeanDeploymentArchive beanDeploymentArchive = new BundleDeploymentArchive( + bundleWiring, _cdiContainerState.getId(), beansModel.getBeanClassNames(), beansModel.getBeansXml(), + _cdiContainerState.getExtenderBundle()); + + Deployment deployment = new BundleDeployment(_extensions, beanDeploymentArchive); + + _bootstrap = new WeldBootstrap(); + + _bootstrap.startContainer(_cdiContainerState.getId(), new SimpleEnvironment(), deployment); + + _beanManagerImpl = _bootstrap.getManager(beanDeploymentArchive); + + _cdiContainerState.setBeanManager(_beanManagerImpl); + _cdiContainerState.setConfigurationDependencies(_configurations); + _cdiContainerState.setReferenceDependencies(_references); + + _bootstrap.startInitialization(); + _bootstrap.deployBeans(); + + processDescriptorConfigurations(); + processDescriptorReferences(); + } + + @Override + protected BootstrapContainer clone() { + BootstrapContainer bootstrapContainer = new BootstrapContainer( + _bundleWiring, _externalExtensions, _cdiContainerState); + + bootstrapContainer._configurations.clear(); + bootstrapContainer._configurations.addAll(_configurations); + + return bootstrapContainer; + } + + public void fire(Type state) { + _cdiContainerState.fire(state); + } + + public void fire(Type state, String payload) { + _cdiContainerState.fire(state, payload); + } + + public void fire(Type state, Throwable cause) { + _cdiContainerState.fire(state, cause); + + } + + public BeanManagerImpl getBeanManagerImpl() { + return _beanManagerImpl; + } + + public WeldBootstrap getBootstrap() { + return _bootstrap; + } + + public Bundle getBundle() { + return _bundle; + } + + public BundleContext getBundleContext() { + return _bundle.getBundleContext(); + } + + public CdiContainerState getCdiContainerState() { + return _cdiContainerState; + } + + public List<ConfigurationDependency> getConfigurations() { + return _configurations; + } + + public Collection<ReferenceModel> getReferenceModels() { + return _cdiContainerState.getBeansModel().getReferenceModels(); + } + + public List<ReferenceDependency> getReferences() { + return _references; + } + + public Collection<ServiceModel> getServiceModels() { + return _cdiContainerState.getBeansModel().getServiceModels(); + } + + public List<ServiceDeclaration> getServices() { + return _services; + } + + public boolean hasConfigurations() { + return !_configurations.isEmpty(); + } + + public boolean hasReferences() { + return !_references.isEmpty(); + } + + public Class<?> loadClass(String clazz) throws ClassNotFoundException { + return _bundle.loadClass(clazz); + } + + public ServiceRegistration<?> registerService( + String[] classNames, Object serviceInstance, Dictionary<String, Object> properties) { + + return getBundleContext().registerService(classNames, serviceInstance, properties); + } + + public void shutdown() { + _bootstrap.shutdown(); + } + + private void processConfigurationModel(ConfigurationModel configurationModel) { + try { + Class<?> beanClass = _bundle.loadClass(configurationModel.beanClass()); + + String[] pids = configurationModel.pids(); + + ConfigurationDependency configurationDependency = new ConfigurationDependency( + _bundle.getBundleContext(), pids, configurationModel.required(), beanClass.getName(), + new ConfigurationInjectionPoint(beanClass, pids)); + + _configurations.add(configurationDependency); + } + catch (ClassNotFoundException cnfe) { + _log.error( + "CDIe - osgi bean descriptor configuration processing cannot load class {}", + configurationModel.beanClass(), cnfe); + } + } + + private void processDescriptorConfigurations() { + Collection<ConfigurationModel> configurationModels = + _cdiContainerState.getBeansModel().getConfigurationModels(); + + for (ConfigurationModel configurationModel : configurationModels) { + processConfigurationModel(configurationModel); + } + } + + private void processDescriptorReferences() { + Collection<ReferenceModel> referenceModels = _cdiContainerState.getBeansModel().getReferenceModels(); + + for (ReferenceModel referenceModel : referenceModels) { + processReferenceModel(referenceModel); + } + } + + private void processReferenceModel(ReferenceModel referenceModel) { + try { + Class<?> beanClass = _bundle.loadClass(referenceModel.getBeanClass()); + + ReferenceDependency referenceDependency = new ReferenceDependency( + _beanManagerImpl, ReferenceLiteral.from(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(BootstrapContainer.class); + + private final BeanManagerImpl _beanManagerImpl; + private final WeldBootstrap _bootstrap; + private final Bundle _bundle; + private final BundleWiring _bundleWiring; + private final CdiContainerState _cdiContainerState; + private final List<ConfigurationDependency> _configurations = new CopyOnWriteArrayList<>(); + private final List<Metadata<Extension>> _extensions = new CopyOnWriteArrayList<>(); + private final Map<ServiceReference<Extension>, Metadata<Extension>> _externalExtensions; + private final List<ReferenceDependency> _references = new CopyOnWriteArrayList<>(); + private final List<ServiceDeclaration> _services = new CopyOnWriteArrayList<>(); + +} \ No newline at end of file Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java Thu May 4 18:41:59 2017 @@ -1,3 +1,17 @@ +/** + * 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 javax.enterprise.inject.spi.BeanManager; 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=1793847&r1=1793846&r2=1793847&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 Thu May 4 18:41:59 2017 @@ -17,21 +17,19 @@ package org.apache.aries.cdi.container.i import java.util.Hashtable; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.locks.ReentrantLock; 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.jboss.weld.manager.BeanManagerImpl; import org.osgi.framework.Bundle; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; +import org.osgi.service.cdi.CdiConstants; 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; import org.slf4j.LoggerFactory; @@ -53,7 +51,7 @@ public class CdiContainerState { Hashtable<String, Object> properties = new Hashtable<>(); - properties.put(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE, CdiEvent.Type.CREATING); + properties.put(CdiConstants.CDI_CONTAINER_STATE, CdiEvent.Type.CREATING); _cdiContainerRegistration = _bundle.getBundleContext().registerService( CdiContainer.class, _cdiContainerService, properties); @@ -70,10 +68,6 @@ public class CdiContainerState { } } - public BeanManager getBeanManager() { - return _beanManager; - } - public BeansModel getBeansModel() { return _beansModel; } @@ -110,20 +104,24 @@ public class CdiContainerState { Type type = event.getType(); if ((_lastState == CdiEvent.Type.DESTROYING) && - ((type == CdiEvent.Type.WAITING_FOR_EXTENSIONS) || + ((type == CdiEvent.Type.WAITING_FOR_CONFIGURATIONS) || + (type == CdiEvent.Type.WAITING_FOR_EXTENSIONS) || (type == CdiEvent.Type.WAITING_FOR_SERVICES))) { return; } - if (_log.isDebugEnabled()) { - _log.debug("CDIe - Event {}", event, event.getCause()); + if (_log.isErrorEnabled() && (event.getCause() != null)) { + _log.error("CDIe - Event {}", event, event.getCause()); + } + else if (_log.isDebugEnabled()) { + _log.debug("CDIe - Event {}", event); } updateState(event); - if (_beanManager != null) { - _beanManager.fireEvent(event); + if (_beanManagerImpl != null) { + _beanManagerImpl.fireEvent(event); } for (CdiListener listener : _listeners.values()) { @@ -150,9 +148,9 @@ public class CdiContainerState { fire(new CdiEvent(state, _bundle, _extenderBundle, null, cause)); } - public void setBeanManager(BeanManager beanManager) { - _beanManager = beanManager; - _cdiContainerService.setBeanManager(beanManager); + public void setBeanManager(BeanManagerImpl beanManagerImpl) { + _beanManagerImpl = beanManagerImpl; + _cdiContainerService.setBeanManager(beanManagerImpl); } public void setBeansModel(BeansModel beansModel) { @@ -176,7 +174,7 @@ public class CdiContainerState { ServiceReference<CdiContainer> reference = _cdiContainerRegistration.getReference(); - if (type == reference.getProperty(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE)) { + if (type == reference.getProperty(CdiConstants.CDI_CONTAINER_STATE)) { return; } @@ -188,14 +186,14 @@ public class CdiContainerState { properties.put(key, reference.getProperty(key)); } - properties.put(CdiExtenderConstants.CDI_EXTENDER_CONTAINER_STATE, type); + properties.put(CdiConstants.CDI_CONTAINER_STATE, type); _cdiContainerRegistration.setProperties(properties); } private static final Logger _log = LoggerFactory.getLogger(CdiContainerState.class); - private volatile BeanManager _beanManager; + private volatile BeanManagerImpl _beanManagerImpl; private BeansModel _beansModel; private final Bundle _bundle; private final ServiceRegistration<CdiContainer> _cdiContainerRegistration; Modified: 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=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationDependency.java Thu May 4 18:41:59 2017 @@ -1,33 +1,172 @@ +/** + * 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 static org.apache.aries.cdi.container.internal.util.Reflection.cast; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.Arrays; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.enterprise.inject.spi.InjectionPoint; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.cm.ManagedService; public class ConfigurationDependency { - public ConfigurationDependency(String[] pids, String defaultPid) { + public ConfigurationDependency( + BundleContext bundleContext, String[] pids, boolean required, String defaultPid, + InjectionPoint injectionPoint) { + + _bundleContext = bundleContext; _pids = pids; + _required = required; + _injectionPoint = injectionPoint; + _beanClass = getConfigurationType(); - for (int i = 0; i > pids.length; i++) { + for (int i = 0; i < _pids.length; i++) { if ("$".equals(_pids[i])) { _pids[i] = defaultPid; } } } + public void close() { + for (Entry entry : _registrations) { + entry.getValue().unregister(); + } + + _registrations.clear(); + } + + public Class<?> getBeanClass() { + return _beanClass; + } + + public InjectionPoint getInjectionPoint() { + return _injectionPoint; + } + + public Map<String, Object> getConfiguration() { + Map<String, Object> map = new HashMap<>(); + + for (Entry entry : _registrations) { + Dictionary<String, ?> properties = entry.getKey().getProperties(); + + if (properties == null) { + continue; + } + + Enumeration<String> keys = properties.keys(); + + while (keys.hasMoreElements()) { + String key = keys.nextElement(); + + if (Constants.SERVICE_PID.equals(key)) continue; + + if (!map.containsKey(key)) { + map.put(key, properties.get(key)); + } + } + } + + return map; + } + + public Object isRequired() { + return _required; + } + + public boolean isResolved() { + for (Entry entry : _registrations) { + ConfigurationManagedService configurationManagedService = entry.getKey(); + + if (!configurationManagedService.isResolved()) { + return false; + } + } + + return true; + } + public boolean isResolved(String pid) { - // TODO Auto-generated method stub + for (Entry entry : _registrations) { + ConfigurationManagedService configurationManagedService = entry.getKey(); + + if ((configurationManagedService._pid.equals(pid)) && configurationManagedService.isResolved()) { + return true; + } + } + return false; } + public void open(ConfigurationResolveAction resolveAction) { + for (String pid : pids()) { + Dictionary<String, Object> properties = new Hashtable<>(); + + properties.put("service.pid", pid); + + ConfigurationManagedService managedService = new ConfigurationManagedService( + pid, _required, _injectionPoint, resolveAction); + + ServiceRegistration<ManagedService> serviceRegistration = _bundleContext.registerService( + ManagedService.class, managedService, properties); + + _registrations.add(new Entry(managedService, serviceRegistration)); + } + } + public String[] pids() { return Arrays.copyOf(_pids, _pids.length); } @Override public String toString() { - return Arrays.toString(_pids); + return _injectionPoint.getMember() + Arrays.toString(_pids); + } + + private Class<?> getConfigurationType() { + Type type = _injectionPoint.getType(); + + if (!(type instanceof ParameterizedType)) { + return cast(type); + } + + ParameterizedType parameterizedType = cast(type); + + Type rawType = parameterizedType.getRawType(); + + return cast(rawType); } + private final Class<?> _beanClass; + private final BundleContext _bundleContext; + private final InjectionPoint _injectionPoint; private final String[] _pids; + private final List<Entry> _registrations = new CopyOnWriteArrayList<>(); + private final boolean _required; } Modified: 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=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java Thu May 4 18:41:59 2017 @@ -19,11 +19,12 @@ 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 javax.inject.Named; +import org.osgi.framework.BundleContext; import org.osgi.service.cdi.annotations.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,12 +32,13 @@ import org.slf4j.LoggerFactory; @ApplicationScoped public class ConfigurationExtension implements Extension { - public ConfigurationExtension(List<ConfigurationDependency> configurations) { + public ConfigurationExtension(List<ConfigurationDependency> configurations, BundleContext bundleContext) { _configurations = configurations; + _bundleContext = bundleContext; } void processInjectionTarget( - @Observes @SuppressWarnings("rawtypes") ProcessInjectionPoint pip, BeanManager manager) { + @Observes @SuppressWarnings("rawtypes") ProcessInjectionPoint pip) { InjectionPoint injectionPoint = pip.getInjectionPoint(); Annotated annotated = injectionPoint.getAnnotated(); @@ -48,8 +50,17 @@ public class ConfigurationExtension impl Class<?> beanClass = injectionPoint.getBean().getBeanClass(); + String name = beanClass.getName(); + + Named named = annotated.getAnnotation(Named.class); + + if (named != null) { + name = named.value(); + } + ConfigurationDependency configurationDependency = new ConfigurationDependency( - configuration.value(), beanClass.getName()); + _bundleContext, configuration.value(), configuration.required(), name, + injectionPoint); _configurations.add(configurationDependency); @@ -58,8 +69,9 @@ public class ConfigurationExtension impl } } - private static final Logger _log = LoggerFactory.getLogger(ReferenceExtension.class); + private static final Logger _log = LoggerFactory.getLogger(ConfigurationExtension.class); + private final BundleContext _bundleContext; private final List<ConfigurationDependency> _configurations; } Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationManagedService.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationManagedService.java?rev=1793847&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationManagedService.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationManagedService.java Thu May 4 18:41:59 2017 @@ -0,0 +1,62 @@ +package org.apache.aries.cdi.container.internal.container; + +import java.util.Dictionary; + +import javax.enterprise.inject.spi.InjectionPoint; + +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.cm.ManagedService; + +class ConfigurationManagedService implements ManagedService { + + public ConfigurationManagedService( + String pid, boolean required, InjectionPoint injectionPoint, ConfigurationResolveAction resolveAction) { + + _pid = pid; + _required = required; + _injectionPoint = injectionPoint; + _resolveAction = resolveAction; + + _resolveAction.add(this); + } + + public String getPid() { + return _pid; + } + + public synchronized Dictionary<String, ?> getProperties() { + return _properties; + } + + public synchronized boolean isResolved() { + return _required ? (_properties != null) : true; + } + + @Override + public synchronized void updated(Dictionary<String, ?> properties) throws ConfigurationException { + if ((_properties == null) && (properties != null)) { + _properties = properties; + _resolveAction.addingConfiguration(); + } + else if ((_properties != null) && (properties == null)) { + _properties = properties; + _resolveAction.removeProperties(); + } + else { + _properties = properties; + _resolveAction.updateProperties(); + } + } + + @Override + public String toString() { + return "ConfigurationManagedService[" + _pid + ", " + _injectionPoint + "]"; + } + + private final InjectionPoint _injectionPoint; + final String _pid; + private volatile Dictionary<String, ?> _properties; + private final boolean _required; + private final ConfigurationResolveAction _resolveAction; + +} \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationResolveAction.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationResolveAction.java?rev=1793847&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationResolveAction.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationResolveAction.java Thu May 4 18:41:59 2017 @@ -0,0 +1,166 @@ +/** + * 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 java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.osgi.service.cdi.CdiEvent; + +class ConfigurationResolveAction { + + public ConfigurationResolveAction(BootstrapContainer bc) { + _bc = bc; + } + + public void add(ConfigurationManagedService configurationManagedService) { + try { + _lock.lock(); + + _managedServices.add(configurationManagedService); + } + finally { + _lock.unlock(); + } + } + + public void close() { + try { + _lock.lock(); + + _closing = true; + + _nextPhase.close(); + + _nextPhase = null; + + for (ConfigurationDependency configurationDependency : _bc.getConfigurations()) { + configurationDependency.close(); + } + } + finally { + _lock.unlock(); + } + } + + public void open() { + try { + _lock.lock(); + + _closing = false; + + for (ConfigurationDependency configurationDependency : _bc.getConfigurations()) { + configurationDependency.open(this); + } + + if (configurationsAreResolved()) { + _nextPhase = new Phase_Reference(_bc); + + _nextPhase.open(); + } + } + finally { + _lock.unlock(); + } + } + + public void addingConfiguration() { + try { + _lock.lock(); + + if (_closing) return; + + if (!_resolved && configurationsAreResolved()) { + _resolved = true; + + if (_nextPhase != null) { + close(); + + _bc = _bc.clone(); + + _bc.fire(CdiEvent.Type.WAITING_FOR_CONFIGURATIONS, _bc.getConfigurations().toString()); + + open(); + } + + if (_nextPhase == null) { + _nextPhase = new Phase_Reference(_bc); + + _nextPhase.open(); + } + } + } + catch (Throwable t) { + _bc.fire(CdiEvent.Type.FAILURE, t); + + // TODO this should close the CDI container! + } + finally { + _lock.unlock(); + } + } + + public void removeProperties() { + try { + _lock.lock(); + + if (_closing) return; + + if (_nextPhase != null) { + _resolved = false; + + close(); + + _bc = _bc.clone(); + + _bc.fire(CdiEvent.Type.WAITING_FOR_CONFIGURATIONS, _bc.getConfigurations().toString()); + + open(); + } + } + catch (Throwable t) { + _bc.fire(CdiEvent.Type.FAILURE, t); + + // TODO this should close the CDI container! + } + finally { + _lock.unlock(); + } + } + + public void updateProperties() { + } + + private boolean configurationsAreResolved() { + for (ConfigurationDependency dependency : _bc.getConfigurations()) { + if (!dependency.isResolved()) { + return false; + } + } + + return true; + } + + private volatile BootstrapContainer _bc; + private volatile boolean _closing = false; + private volatile Phase _nextPhase; + private volatile boolean _resolved = false; + + private final Lock _lock = new ReentrantLock(); + private final List<ConfigurationManagedService> _managedServices = new CopyOnWriteArrayList<>(); + +} \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java?rev=1793847&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java Thu May 4 18:41:59 2017 @@ -0,0 +1,15 @@ +package org.apache.aries.cdi.container.internal.container; + +import java.util.AbstractMap.SimpleImmutableEntry; + +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.cm.ManagedService; + +class Entry extends SimpleImmutableEntry<ConfigurationManagedService, ServiceRegistration<ManagedService>> { + + private static final long serialVersionUID = 1L; + + public Entry(ConfigurationManagedService key, ServiceRegistration<ManagedService> value) { + super(key, value); + } +} \ No newline at end of file Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java Thu May 4 18:41:59 2017 @@ -20,13 +20,13 @@ 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.CdiExtenderConstants; +import org.osgi.service.cdi.CdiConstants; public class ExtensionDependency { public ExtensionDependency(BundleContext bundleContext, Long bundleId, String name) { _string = "(&(" + org.osgi.framework.Constants.SERVICE_BUNDLEID + "=" + bundleId + ")(" + - CdiExtenderConstants.CDI_EXTENSION + "=" + name + "))"; + CdiConstants.CDI_EXTENSION_NAMESPACE + "=" + name + "))"; try { _filter = bundleContext.createFilter(_string); Modified: 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=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java Thu May 4 18:41:59 2017 @@ -1,3 +1,17 @@ +/** + * 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; public interface Phase { Modified: 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=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Configuration.java Thu May 4 18:41:59 2017 @@ -14,166 +14,62 @@ 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) { + 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); + _bundleWiring = _cdiContainerState.getBundle().adapt(BundleWiring.class); } @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(); + if (_resolveAction != null) { + _resolveAction.close(); - 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); + _resolveAction = null; } + else if (_nextPhase != null) { + _nextPhase.close(); - // Add external extensions - for (Metadata<Extension> meta : _extensions.values()) { - extensions.add(meta); + _nextPhase = null; } + } - 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); + @Override + public void open() { + BootstrapContainer bc = new BootstrapContainer(_bundleWiring, _extensions, _cdiContainerState); - if (!_configurations.isEmpty()) { - _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_CONFIGURATIONS, _configurations.toString()); + if (bc.hasConfigurations()) { + _cdiContainerState.fire(CdiEvent.Type.WAITING_FOR_CONFIGURATIONS, bc.getConfigurations().toString()); - // TODO configuration listener - temporary: { - _nextPhase = new Phase_Reference(_references, _services, _cdiContainerState, bootstrap); + _resolveAction = new ConfigurationResolveAction(bc); - _nextPhase.open(); - } + _resolveAction.open(); } else { - _nextPhase = new Phase_Reference(_references, _services, _cdiContainerState, bootstrap); + _nextPhase = new Phase_Reference(bc); _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); - } - - } + private ConfigurationResolveAction _resolveAction; } \ No newline at end of file Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_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?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Extension.java Thu May 4 18:41:59 2017 @@ -23,14 +23,13 @@ import java.util.concurrent.CopyOnWriteA import javax.enterprise.inject.spi.Extension; import org.jboss.weld.bootstrap.spi.Metadata; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Filter; import org.osgi.framework.ServiceReference; import org.osgi.framework.wiring.BundleWire; import org.osgi.framework.wiring.BundleWiring; +import org.osgi.service.cdi.CdiConstants; import org.osgi.service.cdi.CdiEvent; -import org.osgi.service.cdi.CdiExtenderConstants; import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTrackerCustomizer; import org.slf4j.Logger; @@ -38,11 +37,11 @@ import org.slf4j.LoggerFactory; public class Phase_Extension implements Phase { - public Phase_Extension(Bundle bundle, CdiContainerState cdiContainerState) { - _bundle = bundle; + public Phase_Extension(CdiContainerState cdiContainerState) { _cdiContainerState = cdiContainerState; - _bundleContext = bundle.getBundleContext(); - _extensionDependencies = findExtensionDependencies(bundle.adapt(BundleWiring.class)); + _bundleContext = _cdiContainerState.getBundle().getBundleContext(); + _extensionDependencies = findExtensionDependencies( + _cdiContainerState.getBundle().adapt(BundleWiring.class)); _extensions = new ConcurrentSkipListMap<>(Comparator.reverseOrder()); _cdiContainerState.setExtensionDependencies(_extensionDependencies); @@ -82,7 +81,7 @@ public class Phase_Extension implements _extensionTracker.open(); } else { - _nextPhase = new Phase_Configuration(_bundle, _cdiContainerState, _extensions); + _nextPhase = new Phase_Configuration(_cdiContainerState, _extensions); _nextPhase.open(); } @@ -90,12 +89,12 @@ public class Phase_Extension implements List<ExtensionDependency> findExtensionDependencies(BundleWiring bundleWiring) { List<ExtensionDependency> extensionDependencies = new CopyOnWriteArrayList<>(); - List<BundleWire> requiredWires = bundleWiring.getRequiredWires(CdiExtenderConstants.CDI_EXTENSION); + List<BundleWire> requiredWires = bundleWiring.getRequiredWires(CdiConstants.CDI_EXTENSION_NAMESPACE); for (BundleWire wire : requiredWires) { Map<String, Object> attributes = wire.getCapability().getAttributes(); - String extension = (String)attributes.get(CdiExtenderConstants.CDI_EXTENSION); + String extension = (String)attributes.get(CdiConstants.CDI_EXTENSION_NAMESPACE); if (extension != null) { ExtensionDependency extensionDependency = new ExtensionDependency( @@ -110,7 +109,6 @@ public class Phase_Extension implements private static final Logger _log = LoggerFactory.getLogger(Phase_Extension.class); - private final Bundle _bundle; private final BundleContext _bundleContext; private final CdiContainerState _cdiContainerState; private final Map<ServiceReference<Extension>, Metadata<Extension>> _extensions; @@ -139,7 +137,7 @@ public class Phase_Extension implements } if ((trackedDependency != null) && _extensionDependencies.isEmpty()) { - _nextPhase = new Phase_Configuration(_bundle, _cdiContainerState, _extensions); + _nextPhase = new Phase_Configuration(_cdiContainerState, _extensions); _nextPhase.open(); } Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_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?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Init.java Thu May 4 18:41:59 2017 @@ -28,7 +28,7 @@ public class Phase_Init implements Phase cdiContainerState.setBeansModel(beansModel); - _extensionPhase = new Phase_Extension(bundle, cdiContainerState); + _extensionPhase = new Phase_Extension(cdiContainerState); } @Override Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_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?rev=1793847&r1=1793846&r2=1793847&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase_Publish.java Thu May 4 18:41:59 2017 @@ -27,15 +27,15 @@ import java.util.concurrent.CopyOnWriteA import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.InjectionPoint; +import org.apache.aries.cdi.container.internal.bean.ConfigurationBean; 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.bootstrap.WeldBootstrap; 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.service.cdi.CdiEvent; @@ -44,16 +44,8 @@ import org.slf4j.LoggerFactory; public class Phase_Publish implements Phase { - public Phase_Publish( - List<ReferenceDependency> references, List<ServiceDeclaration> services, CdiContainerState cdiContainerState, - Bootstrap bootstrap) { - - _references = references; - _services = services; - _cdiContainerState = cdiContainerState; - _bootstrap = bootstrap; - _bundle = cdiContainerState.getBundle(); - _bundleContext = _bundle.getBundleContext(); + public Phase_Publish(BootstrapContainer bc) { + _bc = bc; } @Override @@ -83,33 +75,48 @@ public class Phase_Publish implements Ph } } - _bootstrap.shutdown(); + _bc.shutdown(); } @Override public void open() { - _cdiContainerState.fire(CdiEvent.Type.SATISFIED); + _bc.fire(CdiEvent.Type.SATISFIED); - BeanManager beanManager = _cdiContainerState.getBeanManager(); + BeanManagerImpl beanManagerImpl = _bc.getBeanManagerImpl(); - processReferenceDependencies((BeanManagerImpl)beanManager); + processConfigurationDependencies(beanManagerImpl); + processReferenceDependencies(beanManagerImpl); - _bootstrap.validateBeans(); - _bootstrap.endInitialization(); + WeldBootstrap bootstrap = _bc.getBootstrap(); - processRequirementDefinedServices((BeanManagerImpl)beanManager); + bootstrap.validateBeans(); + bootstrap.endInitialization(); + + processRequirementDefinedServices(beanManagerImpl); processServiceDeclarations(); - _beanManagerRegistration = _bundleContext.registerService( - BeanManager.class, beanManager, null); + _beanManagerRegistration = _bc.getBundleContext().registerService( + BeanManager.class, beanManagerImpl, null); + + _bc.fire(CdiEvent.Type.CREATED); + } + + private void processConfigurationDependencies(BeanManagerImpl beanManagerImpl) { + for (ConfigurationDependency configurationDependency : _bc.getConfigurations()) { + InjectionPoint injectionPoint = configurationDependency.getInjectionPoint(); + + ConfigurationBean bean = new ConfigurationBean( + configurationDependency, beanManagerImpl, injectionPoint.getType(), + injectionPoint.getQualifiers()); - _cdiContainerState.fire(CdiEvent.Type.CREATED); + beanManagerImpl.addBean(bean); + } } private void processReferenceDependencies(BeanManagerImpl beanManagerImpl) { Map<ServiceReference<?>, Set<ReferenceBean>> beans = new HashMap<>(); - for (ReferenceDependency referenceDependency : _references) { + for (ReferenceDependency referenceDependency : _bc.getReferences()) { for (ServiceReference<?> matchingReference : referenceDependency.getMatchingReferences()) { Set<ReferenceBean> set = beans.get(matchingReference); @@ -136,7 +143,7 @@ public class Phase_Publish implements Ph } else { ReferenceBean bean = new ReferenceBean( - beanManagerImpl, _bundleContext, referenceDependency.getInjectionPointType(), + beanManagerImpl, _bc.getBundleContext(), referenceDependency.getInjectionPointType(), referenceDependency.getBeanClass(), referenceDependency.getBindType(), matchingReference); bean.addQualifier(referenceDependency.getReference()); @@ -151,11 +158,11 @@ public class Phase_Publish implements Ph } private void processRequirementDefinedServices(BeanManagerImpl beanManagerImpl) { - Collection<ServiceModel> serviceModels = _cdiContainerState.getBeansModel().getServiceModels(); + Collection<ServiceModel> serviceModels = _bc.getServiceModels(); for (ServiceModel serviceModel : serviceModels) { try { - Class<?> beanClass = _bundle.loadClass(serviceModel.getBeanClass()); + Class<?> beanClass = _bc.loadClass(serviceModel.getBeanClass()); Set<Bean<?>> beans = beanManagerImpl.getBeans(beanClass, AnyLiteral.INSTANCE); @@ -175,7 +182,7 @@ public class Phase_Publish implements Ph for (String provide : provides) { try { - interfaces.add(_bundle.loadClass(provide)); + interfaces.add(_bc.loadClass(provide)); } catch (Exception e) { _log.error("CDIe - Failure loading provided interface for service {}", provide); @@ -196,14 +203,14 @@ public class Phase_Publish implements Ph } private void processServiceDeclarations() { - for (ServiceDeclaration serviceDeclaration : _services) { + for (ServiceDeclaration serviceDeclaration : _bc.getServices()) { processServiceDeclaration(serviceDeclaration); } } private void processServiceDeclaration(ServiceDeclaration serviceDeclaration) { if (_log.isDebugEnabled()) { - _log.debug("CDIe - Publishing bean {} as service.", serviceDeclaration); + _log.debug("CDIe - Publishing bean {} as service.", serviceDeclaration.getBean()); } String[] classNames = serviceDeclaration.getClassNames(); @@ -211,18 +218,13 @@ public class Phase_Publish implements Ph Dictionary<String,Object> properties = serviceDeclaration.getProperties(); _registrations.add( - _bundleContext.registerService(classNames, serviceInstance, properties)); + _bc.getBundleContext().registerService(classNames, serviceInstance, properties)); } private static final Logger _log = LoggerFactory.getLogger(Phase_Publish.class); - private final Bootstrap _bootstrap; - private final Bundle _bundle; - private final BundleContext _bundleContext; - private final CdiContainerState _cdiContainerState; - private final List<ReferenceDependency> _references; + private final BootstrapContainer _bc; private final List<ServiceRegistration<?>> _registrations = new CopyOnWriteArrayList<>(); - private final List<ServiceDeclaration> _services; private ServiceRegistration<BeanManager> _beanManagerRegistration;
