Author: rotty3000 Date: Tue Sep 5 22:01:11 2017 New Revision: 1807424 URL: http://svn.apache.org/viewvc?rev=1807424&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/CdiBundle.java - copied, changed from r1806482, 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/component/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentDiscoveryExtension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentProperties.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentRuntimeExtension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java - copied, changed from r1806482, 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/context/BundleContextExtension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java - copied, changed from r1806482, 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/extension/ExtensionMetadata.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java - copied, changed from r1806482, 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/literal/CdiMarkLiteral.java - copied, changed from r1806482, 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/ComponentLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Context.java - copied, changed from r1806482, 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/model/Model.java - copied, changed from r1806482, 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/ObserverMethodAnnotated.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Registrator.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ServiceEventImpl.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Tracker.java - copied, changed from r1806482, 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/phase/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase.java - copied, changed from r1806482, 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/phase/Phase_Configuration.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Extension.java - copied, changed from r1806482, 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/phase/Phase_Init.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Publish.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Reference.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/Multiplicity.java - copied, changed from r1806482, 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/reference/ReferenceBean.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceCallback.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/service/ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/service/ServiceDeclaration.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Types.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/component/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/component/ComponentExtension_Ctor_static_reluctant_Test.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallbackTest_Ignore.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallbackTest_Optional.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallbackTest_Require.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedServiceTest_Ignore.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedServiceTest_Optional.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedServiceTest_Require.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/container/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/container/ContainerDiscoveryTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/model/EventsTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationPhaseTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/reference/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel_PropertiesTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel_ServiceObjectsTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel_ServiceReferenceTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel_ServiceTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel_TupleTest.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainerAndComponents.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceInjectionPoint.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockServiceReference.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/ArrayListFooProducer.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/Bar.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BindType.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarAnnotated.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarBadlyAnnotated.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarProducer.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarReference.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarService.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarWithConfig.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/BarWithReference.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CollectionFooProducer.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/Config.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorArrayListFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorCollectionFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorFooBar.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorFooFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorFooFooNamed.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorFooNamed.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorFooOptional.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/CtorListFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/Drat.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BindType.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FieldFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FieldListFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/Foo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FooAnnotated.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FooProducer.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FooReference.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FooService.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FooWithConfig.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/FooWithReference.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/ListFooProducer.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/MethodBindFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/MethodBindFooNamed.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/MethodSetFoo.java - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Phase.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/ObserverFoo.java aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/beans/ServiceEventImpl.java aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/beans-annotated.xml - copied, changed from r1806482, 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-badly-annotated.xml - copied, changed from r1806482, aries/trunk/cdi/cdi-extender/src/test/resources/OSGI-INF/cdi/beans-only.xml aries/trunk/cdi/cdi-extender/src/test/resources/logback.xml aries/trunk/cdi/cdi-itests/logback.xml Removed: 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/bean/BundleContextBean.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.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/container/BindType.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/BundleDeployment.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.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/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/container/ExtensionDependency.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/FilterBuilder.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/ReferenceExtension.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/container/ServiceExtension.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.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/ConfigurationInjectionPoint.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/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-itests/log4j.properties Modified: 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/command/CdiCommand.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/literal/ReferenceLiteral.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.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/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/util/Conversions.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/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/MapsTest.java 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-http/pom.xml aries/trunk/cdi/cdi-extension-http/src/main/java/org/apache/aries/cdi/extension/http/HttpExtension.java aries/trunk/cdi/cdi-extension-jndi/pom.xml 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/bnd/tb5-beans.xml aries/trunk/cdi/cdi-itests/bnd/tb6-beans.xml aries/trunk/cdi/cdi-itests/cdi-executable.bndrun 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/ConstructorInjectedService.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/FieldInjectedBundleScopedImpl.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/FieldInjectedPrototypeScopedImpl.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/FieldInjectedService.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/Instance_Optional.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/Instance_ServiceProperties.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/Instance_ServiceReference.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/MethodInjectedService.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/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/EventsTests.java 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/tb3/ConfigurationBeanB.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb5/ConfigurationBeanC.java aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb6/BeanServlet.java aries/trunk/cdi/javax.cdi-api/pom.xml aries/trunk/cdi/javax.el-api/pom.xml aries/trunk/cdi/javax.inject-api/pom.xml aries/trunk/cdi/javax.interceptor-api/pom.xml aries/trunk/cdi/pom.xml Modified: aries/trunk/cdi/cdi-extender/pom.xml URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/pom.xml?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/pom.xml (original) +++ aries/trunk/cdi/cdi-extender/pom.xml Tue Sep 5 22:01:11 2017 @@ -85,7 +85,7 @@ <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-osgi-bundle</artifactId> - <version>2.4.2.Final</version> + <version>2.4.3.Final</version> <exclusions> <exclusion> <groupId>javax.enterprise</groupId> @@ -127,8 +127,20 @@ </dependency> <dependency> <groupId>org.osgi</groupId> + <artifactId>org.osgi.util.promise</artifactId> + <version>1.0.0</version> + </dependency> + <dependency> + <groupId>org.osgi</groupId> <artifactId>osgi.core</artifactId> <version>6.0.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>log4j-over-slf4j</artifactId> + <version>1.7.25</version> + <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> @@ -136,9 +148,14 @@ <version>1.7.0</version> </dependency> <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>1.2.3</version> + <scope>test</scope> + </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>4.12</version> <scope>test</scope> </dependency> </dependencies> 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=1807424&r1=1807423&r2=1807424&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 Tue Sep 5 22:01:11 2017 @@ -17,25 +17,19 @@ package org.apache.aries.cdi.container.i import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE; import static org.osgi.service.cdi.CdiConstants.CDI_CAPABILITY_NAME; -import java.util.Comparator; import java.util.Dictionary; import java.util.Hashtable; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentSkipListMap; import org.apache.aries.cdi.container.internal.command.CdiCommand; import org.apache.felix.utils.extender.AbstractExtender; import org.apache.felix.utils.extender.Extension; 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.BundleWire; import org.osgi.framework.wiring.BundleWiring; -import org.osgi.service.cdi.CdiListener; -import org.osgi.util.tracker.ServiceTracker; -import org.osgi.util.tracker.ServiceTrackerCustomizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,9 +47,6 @@ public class Activator extends AbstractE _bundleContext = bundleContext; - _listenerTracker = new ServiceTracker<>(_bundleContext, CdiListener.class, new CdiListenerCustomizer()); - _listenerTracker.open(); - registerCdiCommand(); super.start(bundleContext); @@ -82,8 +73,6 @@ public class Activator extends AbstractE super.stop(bundleContext); - _listenerTracker.close(); - if (_log.isDebugEnabled()) { _log.debug("CDIe - stoped {}", bundleContext.getBundle()); } @@ -99,7 +88,7 @@ public class Activator extends AbstractE return null; } - return new CdiBundleExtension(_bundleContext.getBundle(), bundle, _listeners, _command); + return new CdiBundle(_bundleContext.getBundle(), bundle, _command); } @Override @@ -146,29 +135,5 @@ public class Activator extends AbstractE private BundleContext _bundleContext; private CdiCommand _command; private ServiceRegistration<?> _commandRegistration; - private Map<ServiceReference<CdiListener>, CdiListener> _listeners = - new ConcurrentSkipListMap<>(Comparator.reverseOrder()); - private ServiceTracker<CdiListener, CdiListener> _listenerTracker; - - private class CdiListenerCustomizer implements ServiceTrackerCustomizer<CdiListener, CdiListener> { - - @Override - public CdiListener addingService(ServiceReference<CdiListener> reference) { - CdiListener cdiListener = _bundleContext.getService(reference); - _listeners.put(reference, cdiListener); - return cdiListener; - } - - @Override - public void modifiedService(ServiceReference<CdiListener> reference, CdiListener service) { - } - - @Override - public void removedService(ServiceReference<CdiListener> reference, CdiListener service) { - _listeners.remove(reference); - _bundleContext.ungetService(reference); - } - - } } \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundle.java (from r1806482, 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/CdiBundle.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundle.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CdiBundleExtension.java&r1=1806482&r2=1807424&rev=1807424&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/CdiBundle.java Tue Sep 5 22:01:11 2017 @@ -14,40 +14,35 @@ package org.apache.aries.cdi.container.internal; -import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; 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_Init; +import org.apache.aries.cdi.container.internal.container.ContainerState; +import org.apache.aries.cdi.container.internal.phase.Phase; +import org.apache.aries.cdi.container.internal.phase.Phase_Init; import org.apache.felix.utils.extender.Extension; import org.osgi.framework.Bundle; -import org.osgi.framework.ServiceReference; import org.osgi.service.cdi.CdiEvent; -import org.osgi.service.cdi.CdiListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class CdiBundleExtension implements Extension { - - public CdiBundleExtension( - Bundle extenderBundle, Bundle bundle, Map<ServiceReference<CdiListener>, CdiListener> listeners, - CdiCommand command) { +public class CdiBundle implements Extension { + public CdiBundle(Bundle extenderBundle, Bundle bundle, CdiCommand command) { _extenderBundle = extenderBundle; _bundle = bundle; - _listeners = listeners; _command = command; } @Override public void start() throws Exception { boolean acquired = false; + try { try { - acquired = _stateLock.tryLock(DEFAULT_STOP_TIMEOUT, TimeUnit.MILLISECONDS); + acquired = _lock.tryLock(DEFAULT_STOP_TIMEOUT, TimeUnit.MILLISECONDS); } catch ( InterruptedException e ) { Thread.currentThread().interrupt(); @@ -61,34 +56,34 @@ public class CdiBundleExtension implemen _log.debug("CDIe - bundle detected {}", _bundle); } - CdiContainerState cdiHelper = new CdiContainerState(_bundle, _extenderBundle, _listeners); - - _command.add(_bundle.getBundleId(), cdiHelper); + _containerState = new ContainerState(_bundle, _extenderBundle); - Phase_Init initPhase = null; + _command.add(_bundle, _containerState); try { - initPhase = new Phase_Init(_bundle, cdiHelper); + _containerState.fire(CdiEvent.Type.CREATING); - initPhase.open(); + _nextPhase = new Phase_Init(_bundle, _containerState); - _initPhase = initPhase; + _nextPhase.open(); } catch (Throwable t) { - cdiHelper.fire(CdiEvent.Type.FAILURE, t); + _containerState.fire(CdiEvent.Type.FAILURE, t); - if (initPhase != null) { - initPhase.close(); + if (_nextPhase != null) { + _nextPhase.close(); } - _command.remove(_bundle.getBundleId()); + _command.remove(_bundle); - cdiHelper.close(); + _containerState.close(); + + _containerState = null; } } finally { if (acquired) { - _stateLock.unlock(); + _lock.unlock(); } } } @@ -96,23 +91,32 @@ public class CdiBundleExtension implemen @Override public void destroy() throws Exception { boolean acquired = false; + try { try { - acquired = _stateLock.tryLock(DEFAULT_STOP_TIMEOUT, TimeUnit.MILLISECONDS); - + acquired = _lock.tryLock(DEFAULT_STOP_TIMEOUT, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { Thread.currentThread().interrupt(); + _log.warn( "The wait for bundle {0}/{1} being started before destruction has been interrupted.", _bundle.getSymbolicName(), _bundle.getBundleId(), e); } - _initPhase.close(); + _command.remove(_bundle); + + _containerState.fire(CdiEvent.Type.DESTROYING); + + _nextPhase.close(); + + _nextPhase = null; + + _containerState.fire(CdiEvent.Type.DESTROYED); - _initPhase = null; + _containerState.close(); - _command.remove(_bundle.getBundleId()); + _containerState = null; if (_log.isDebugEnabled()) { _log.debug("CDIe - bundle removed {}", _bundle); @@ -120,20 +124,20 @@ public class CdiBundleExtension implemen } finally { if (acquired) { - _stateLock.unlock(); + _lock.unlock(); } } } - private static final long DEFAULT_STOP_TIMEOUT = 60000; + private static final long DEFAULT_STOP_TIMEOUT = 60000; // TODO make this configurable - private static final Logger _log = LoggerFactory.getLogger(CdiBundleExtension.class); + private static final Logger _log = LoggerFactory.getLogger(CdiBundle.class); private final Bundle _bundle; private final CdiCommand _command; + private volatile ContainerState _containerState; private final Bundle _extenderBundle; - private final Map<ServiceReference<CdiListener>, CdiListener> _listeners; - private Phase_Init _initPhase; - private final Lock _stateLock = new ReentrantLock(); + private final Lock _lock = new ReentrantLock(); + private volatile Phase _nextPhase; } 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=1807424&r1=1807423&r2=1807424&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 Tue Sep 5 22:01:11 2017 @@ -14,85 +14,141 @@ package org.apache.aries.cdi.container.internal.command; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Dictionary; +import java.util.Formatter; 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.component.ComponentModel; +import org.apache.aries.cdi.container.internal.configuration.ConfigurationCallback; +import org.apache.aries.cdi.container.internal.container.ContainerState; +import org.apache.aries.cdi.container.internal.extension.ExtensionDependency; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.apache.aries.cdi.container.internal.reference.ReferenceCallback; +import org.apache.aries.cdi.container.internal.reference.ReferenceModel; +import org.apache.aries.cdi.container.internal.service.ServiceDeclaration; import org.apache.aries.cdi.container.internal.util.Conversions; +import org.osgi.framework.Bundle; public class CdiCommand { - public void list() { - for (CdiContainerState cdiContainerState : _states.values()) { - System.out.printf("[%s] %s\n", cdiContainerState.getId(), cdiContainerState.getLastState()); + public String list() { + try (Formatter f = new Formatter()) { + for (ContainerState cdiContainerState : _states.values()) { + f.format("[%s] %s%n", cdiContainerState.id(), cdiContainerState.lastState()); + } + return f.toString(); } } - public void info(long bundleId) { - CdiContainerState cdiContainerState = _states.get(bundleId); + public String info(Bundle bundle) { + try (Formatter f = new Formatter()) { + ContainerState containerState = _states.get(bundle); - if (cdiContainerState == null) { - System.out.println("No matching CDI bundle found."); + if (containerState == null) { + f.format("No CDI Bundle found matching {}", bundle); - return; - } + return f.toString(); + } + + f.format("[%s] %s%n", containerState.id(), containerState.lastState()); - System.out.printf("[%s] %s\n", cdiContainerState.getId(), cdiContainerState.getLastState()); - List<ExtensionDependency> extensionDependencies = cdiContainerState.getExtensionDependencies(); - if (!extensionDependencies.isEmpty()) { - System.out.println(" [EXTENSIONS]"); - for (ExtensionDependency extensionDependency : extensionDependencies) { - System.out.printf(" Extension: %s%s\n", extensionDependency.toString(), " ???is this resolved???"); + List<ExtensionDependency> extensionDependencies = containerState.extensionDependencies(); + + if (!extensionDependencies.isEmpty()) { + f.format(" [EXTENSIONS]"); + + for (ExtensionDependency extensionDependency : extensionDependencies) { + f.format(" Extension: %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( - " 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); + + BeansModel beansModel = containerState.beansModel(); + Collection<ComponentModel> componentModels = beansModel.getComponentModels(); + + if (!componentModels.isEmpty()) { + for (ComponentModel componentModel : componentModels) { + ServiceDeclaration serviceDeclaration = containerState.serviceComponents().get(componentModel); + + f.format("[COMPONENT]%n"); + f.format( + " Name: %s%n BeanClass: %s%n ServiceScope: %s%n Provides: %s%n", + componentModel.getName(), + componentModel.getBeanClass().getName(), + componentModel.getServiceScope(), + serviceDeclaration != null ? Arrays.toString(serviceDeclaration.getClassNames()): "not yet ready!"); + + f.format(" [CONFIGURATIONS]%n"); + + Map<String, ConfigurationCallback> configurationCallbacks = containerState.configurationCallbacks().get(componentModel); + + for (Entry<String, ConfigurationCallback> entry : configurationCallbacks.entrySet()) { + f.format( + " PID: %s%n Policy: %s%n Resolved: %s%n", + entry.getKey(), + entry.getValue().policy(), + entry.getValue().resolved() ? "YES" : "NO"); + } + + if (serviceDeclaration != null) { + Dictionary<String, ?> configuration = serviceDeclaration.getServiceProperties(); + + if (!configuration.isEmpty()) { + f.format(" Properties:%n"); + + List<String> keys = Collections.list(configuration.keys()); + + Collections.sort(keys); + + for (String key : keys) { + String value = Conversions.toString(configuration.get(key)); + + f.format(" %s = %s%n", key, value); + } + } + } + + List<ReferenceModel> references = componentModel.getReferences(); + + if (!references.isEmpty()) { + f.format(" [REFERENCES]%n"); + + Map<String, ReferenceCallback> referenceCallbacks = containerState.referenceCallbacks().get(componentModel); + + for (ReferenceModel referenceModel : references) { + f.format( + " Name: %s%n Service: %s%n Target: %s%n Cardinality: %s%n Policy: %s%n Policy Option: %s%n Scope: %s%n Resolved: %s%n", + referenceModel.getName(), + referenceModel.getServiceClass().getName(), + referenceModel.getTarget(), + referenceModel.getCardinality(), + referenceModel.getPolicy(), + referenceModel.getPolicyOption(), + referenceModel.getScope(), + referenceCallbacks.get(referenceModel.getName()).resolved() ? "YES" : "NO"); } } } } - } - List<ReferenceDependency> referenceDependencies = cdiContainerState.getReferenceDependencies(); - if (!referenceDependencies.isEmpty()) { - System.out.println(" [REFERENCES]"); - for (ReferenceDependency referenceDependency : referenceDependencies) { - System.out.printf( - " Reference: %s\n Status: %s\n Min Cardinality: %s\n", - referenceDependency.toString(), - !referenceDependency.isResolved() ? "UNRESOLVED" : "resolved", - referenceDependency.getMinCardinality()); - } + + return f.toString(); } } - public void add(Long bundleId, CdiContainerState cdiContainerState) { - _states.put(bundleId, cdiContainerState); + public void add(Bundle bundle, ContainerState cdiContainerState) { + _states.put(bundle, cdiContainerState); } - public void remove(Long bundleId) { - _states.remove(bundleId); + public void remove(Bundle bundle) { + _states.remove(bundle); } - private final Map<Long, CdiContainerState> _states = new ConcurrentHashMap<>(); + private final Map<Bundle, ContainerState> _states = new ConcurrentHashMap<>(); } \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentDiscoveryExtension.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentDiscoveryExtension.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentDiscoveryExtension.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentDiscoveryExtension.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,468 @@ +/** + * 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.component; + +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.Annotated; +import javax.enterprise.inject.spi.AnnotatedType; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.Extension; +import javax.enterprise.inject.spi.InjectionPoint; +import javax.enterprise.inject.spi.ObserverMethod; +import javax.enterprise.inject.spi.ProcessAnnotatedType; +import javax.enterprise.inject.spi.ProcessInjectionPoint; +import javax.enterprise.inject.spi.ProcessObserverMethod; + +import org.apache.aries.cdi.container.internal.component.ComponentModel.Builder; +import org.apache.aries.cdi.container.internal.configuration.ConfigurationModel; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.apache.aries.cdi.container.internal.model.ObserverMethodAnnotated; +import org.apache.aries.cdi.container.internal.reference.ReferenceModel; +import org.jboss.weld.exceptions.IllegalStateException; +import org.osgi.service.cdi.annotations.Component; +import org.osgi.service.cdi.annotations.Configuration; +import org.osgi.service.cdi.annotations.Reference; +import org.osgi.service.cdi.annotations.ReferencePolicy; +import org.osgi.service.cdi.annotations.ServiceEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ComponentDiscoveryExtension implements Extension { + + public ComponentDiscoveryExtension(BeansModel beansModel) { + _beansModel = beansModel; + } + + /* + * Process annotated classes to sync them up with the meta-model. + */ + <X> void processAnnotatedType(@Observes ProcessAnnotatedType<X> pat, BeanManager beanManager) { + final AnnotatedType<X> at = pat.getAnnotatedType(); + + Class<X> annotatedClass = at.getJavaClass(); + + final String className = annotatedClass.getName(); + + ComponentModel componentModel = _beansModel.getComponentModel(className); + + if (componentModel == null) { + return; + } + + // If the component's class is annotated with @Component, replace the meta-model with one built from the annotation. + + Component component = at.getAnnotation(Component.class); + + if (component != null) { + + // This also means we have to throw away any descriptor configurations/references. + + if (_log.isDebugEnabled()) { + _log.debug("CDIe - OSGi CDI annotations found. Clearing descriptor infos for {}", className); + } + + _beansModel.removeComponentModel(className); + + Builder builder = new ComponentModel.Builder( + annotatedClass + ).name( + component.name() + ).scope( + component.serviceScope() + ); + + for (String property : component.property()) { + builder.property(property); + } + + for (Class<?> provide : component.service()) { + builder.provide(provide.getName()); + } + + componentModel = builder.build(); + + // Mark the component as "found" so that in the end we can produce an error for missing components. + + componentModel.found(true); + + _beansModel.addComponentModel(className, componentModel); + + return; + } + + componentModel.found(true); + + // If we didn't find @Component, we still need to check if the class has @Configuration/@Reference annotations. + // If so, we need to throw away those descriptor infos. + + final List<ConfigurationModel> configurations = componentModel.getConfigurations(); + final List<ReferenceModel> references = componentModel.getReferences(); + + Predicate<Annotation> hasAnnotations = annotation -> + Configuration.class.isInstance(annotation) || Reference.class.isInstance(annotation); + + Consumer<Object> clearInfos = o -> { + if (_log.isDebugEnabled()) { + _log.debug("CDIe - OSGi CDI annotations found. Clearing descriptor infos for {}", className); + } + configurations.clear(); + references.clear(); + }; + + // check constructors + + Arrays.stream( + annotatedClass.getDeclaredConstructors() + ).filter( + ctor -> Arrays.stream( + ctor.getParameterAnnotations() + ).flatMap( + array -> Arrays.stream(array) + ).filter( + hasAnnotations + ).findFirst().isPresent() + ).findFirst().ifPresent( + clearInfos + ); + + // check fields + + Arrays.stream( + annotatedClass.getDeclaredFields() + ).filter( + field -> Arrays.stream( + field.getAnnotations() + ).filter( + hasAnnotations + ).findFirst().isPresent() + ).findFirst().ifPresent( + clearInfos + ); + + // check methods + + Arrays.stream( + annotatedClass.getDeclaredMethods() + ).filter( + method -> Arrays.stream( + method.getParameterAnnotations() + ).flatMap( + array -> Arrays.stream(array) + ).filter( + hasAnnotations + ).findFirst().isPresent() + ).findFirst().ifPresent( + clearInfos + ); + } + + /* + * Process every injection point + */ + void processInjectionPoint(@Observes ProcessInjectionPoint<?, ?> pip) { + final InjectionPoint injectionPoint = pip.getInjectionPoint(); + + Bean<?> bean = injectionPoint.getBean(); + + if (bean == null) { + + // It could be an observer method on an extension! Ignore it! + + if (_log.isDebugEnabled()) { + _log.debug("CDIe - Ignoring injection point {} on non-component able bean!", injectionPoint); + } + + return; + } + + String beanClassName = bean.getBeanClass().getName(); + + // Is it a component? + + ComponentModel componentModel = _beansModel.getComponentModel(beanClassName); + + if (componentModel == null) { + + // No it's not! + + return; + } + + Annotated annotated = injectionPoint.getAnnotated(); + + Reference reference = annotated.getAnnotation(Reference.class); + Configuration configuration = annotated.getAnnotation(Configuration.class); + + // Is it annotated with @Reference? + + if (reference != null) { + processReference(pip, componentModel, reference, configuration); + + return; + } + + // Is it annotated with @Configuration? + + else if (configuration != null) { + processConfiguration(pip, bean, componentModel, configuration); + + return; + } + + if (matchReference(pip, bean, componentModel, injectionPoint)) { + return; + } + + matchConfiguration(pip, bean, componentModel, injectionPoint); + } + + void processObserverMethod(@Observes ProcessObserverMethod<ServiceEvent<?>, ?> pom) { + ObserverMethod<ServiceEvent<?>> observerMethod = pom.getObserverMethod(); + + if (_log.isDebugEnabled()) { + _log.debug("CDIe - Processing observer method {}", observerMethod); + } + + Class<?> beanClass = observerMethod.getBeanClass(); + + final String className = beanClass.getName(); + + ComponentModel componentModel = _beansModel.getComponentModel(className); + + if (componentModel == null) { + pom.addDefinitionError( + new IllegalArgumentException( + String.format( + "The observer method {} is using the event type 'ServiceEvent' but is not defined as a bean", + observerMethod))); + + return; + } + + Reference reference = getQualifier(observerMethod, Reference.class); + Configuration configuration = getQualifier(observerMethod, Configuration.class); + + if (reference != null) { + processReference(pom, componentModel, reference, configuration); + + return; + } + } + + @SuppressWarnings("unchecked") + private <T extends Annotation> T getQualifier( + ObserverMethod<ServiceEvent<?>> observerMethod, Class<T> clazz) { + Set<Annotation> qualifiers = observerMethod.getObservedQualifiers(); + for (Annotation annotation : qualifiers) { + if (clazz.isAssignableFrom(annotation.annotationType())) { + return (T)annotation; + } + } + return null; + } + + private boolean matchConfiguration( + ProcessInjectionPoint<?, ?> pip, + Bean<?> bean, + ComponentModel componentModel, + InjectionPoint injectionPoint) { + + for (ConfigurationModel configurationModel : componentModel.getConfigurations()) { + if (injectionPoint.getType().equals(configurationModel.getType())) { + + if (configurationModel.found() && + injectionPoint.getQualifiers().equals(configurationModel.getQualifiers())) { + + pip.addDefinitionError( + new IllegalStateException( + String.format("duplicate injection point match found for configuration %s", configurationModel))); + + return false; + } + + configurationModel.setQualifiers(injectionPoint.getQualifiers()); + configurationModel.found(true); + + return true; + } + } + + return false; + } + + private boolean matchReference( + ProcessInjectionPoint<?, ?> pip, + Bean<?> bean, + ComponentModel componentModel, + InjectionPoint injectionPoint) { + + for (ReferenceModel referenceModel : componentModel.getReferences()) { + if (injectionPoint.getType().equals(referenceModel.getInjectionPointType())) { + if (referenceModel.found() && + injectionPoint.getQualifiers().equals(referenceModel.getQualifiers())) { + + pip.addDefinitionError( + new IllegalStateException( + String.format("duplicate injection point match found for reference %s", referenceModel))); + + return false; + } + + referenceModel.setQualifiers(injectionPoint.getQualifiers()); + referenceModel.found(true); + + return true; + } + } + + return false; + } + + private void processConfiguration( + ProcessInjectionPoint<?, ?> pip, + Bean<?> bean, + ComponentModel componentModel, + Configuration configuration) { + + InjectionPoint injectionPoint = pip.getInjectionPoint(); + + ConfigurationModel configurationModel = new ConfigurationModel.Builder( + injectionPoint.getType() + ).pid( + configuration.value() + ).policy( + configuration.configurationPolicy() + ).qualifiers( + injectionPoint.getQualifiers() + ).build(); + + configurationModel.found(true); + + if (componentModel.getConfigurations().remove(configurationModel)) { + if (_log.isDebugEnabled()) { + _log.debug("CDIe - OSGi CDI annotations found. Clearing descriptor configuration for {}", injectionPoint); + } + } + + componentModel.getConfigurations().add(configurationModel); + } + + private void processReference( + ProcessInjectionPoint<?, ?> pip, + ComponentModel componentModel, + Reference reference, + Configuration configuration) { + + InjectionPoint injectionPoint = pip.getInjectionPoint(); + + try { + if (configuration != null) { + throw new IllegalArgumentException( + String.format( + "Cannot use @Reference and @Configuration on the same injection point {}", + injectionPoint)); + } + + ReferenceModel referenceModel = new ReferenceModel.Builder( + injectionPoint.getQualifiers() + ).cardinality( + reference.cardinality() + ).annotated( + injectionPoint.getAnnotated() + ).name( + reference.name() + ).option( + reference.policyOption() + ).policy( + reference.policy() + ).scope( + reference.scope() + ).service( + reference.service() + ).target( + reference.target() + ).build(); + + if (componentModel.getReferences().remove(referenceModel)) { + if (_log.isDebugEnabled()) { + _log.debug("CDIe - OSGi CDI annotations found. Clearing descriptor reference for {}", injectionPoint); + } + } + + referenceModel.found(true); + + componentModel.getReferences().add(referenceModel); + } + catch (IllegalArgumentException iae) { + _log.error("CDIe - Component definition error on {}", injectionPoint, iae); + + pip.addDefinitionError(iae); + } + } + + private void processReference( + ProcessObserverMethod<ServiceEvent<?>, ?> pom, + ComponentModel componentModel, + Reference reference, + Configuration configuration) { + + ObserverMethod<ServiceEvent<?>> observerMethod = pom.getObserverMethod(); + + try { + if (configuration != null) { + throw new IllegalArgumentException( + String.format( + "Cannot use @Reference and @Configuration on the same observer method {}", + observerMethod)); + } + + ReferenceModel referenceModel = new ReferenceModel.Builder( + observerMethod.getObservedQualifiers() + ).annotated( + new ObserverMethodAnnotated(observerMethod) + ).policy( + ReferencePolicy.DYNAMIC + ).build(); + + if (componentModel.getReferences().remove(referenceModel)) { + if (_log.isDebugEnabled()) { + _log.debug("CDIe - OSGi CDI annotations found. Clearing descriptor reference for {}", observerMethod); + } + } + + referenceModel.found(true); + + componentModel.getReferences().add(referenceModel); + } + catch (IllegalArgumentException iae) { + _log.error("CDIe - Component definition error on {}", observerMethod, iae); + + pom.addDefinitionError(iae); + } + } + + private static final Logger _log = LoggerFactory.getLogger(ComponentDiscoveryExtension.class); + + private final BeansModel _beansModel; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentModel.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentModel.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentModel.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentModel.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,202 @@ +/** + * 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.component; + +import static org.apache.aries.cdi.container.internal.model.Model.*; +import static org.apache.aries.cdi.container.internal.model.Constants.CDI10_URI; +import static org.apache.aries.cdi.container.internal.model.Constants.NAME_ATTRIBUTE; +import static org.apache.aries.cdi.container.internal.model.Constants.SERVICE_SCOPE_ATTRIBUTE; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.aries.cdi.container.internal.configuration.ConfigurationModel; +import org.apache.aries.cdi.container.internal.reference.ReferenceModel; +import org.osgi.service.cdi.annotations.ServiceScope; +import org.xml.sax.Attributes; + +public class ComponentModel { + + public static class Builder { + + public Builder(Class<?> beanClass) { + Objects.requireNonNull(beanClass); + _beanClass = beanClass; + } + + public Builder attributes(Attributes attributes) { + _name = getValue(CDI10_URI, NAME_ATTRIBUTE, attributes, _beanClass.getName()); + _scope = ServiceScope.get(getValue( + CDI10_URI, SERVICE_SCOPE_ATTRIBUTE, attributes, ServiceScope.DEFAULT.toString())); + return this; + } + + public ComponentModel build() { + if ((_name == null) || (_name.length() == 0)) { + _name = _beanClass.getName(); + } + + if (_scope == null) { + if (!_provides.isEmpty()) { + _scope = ServiceScope.PROTOTYPE; + } + else { + _scope = ServiceScope.DEFAULT; + } + } + + return new ComponentModel(_beanClass, _name, _provides, _scope, _properties, _configurations, _references); + } + + public Builder configuration(ConfigurationModel configurationModel) { + _configurations.add(configurationModel); + return this; + } + + public Builder name(String name) { + _name = name; + return this; + } + + public Builder provide(String className) { + _provides.add(className); + return this; + } + + public Builder property(String property) { + _properties.add(property); + return this; + } + + public Builder reference(ReferenceModel referenceModel) { + _references.add(referenceModel); + return this; + } + + public Builder scope(ServiceScope scope) { + _scope = scope; + return this; + } + + private Class<?> _beanClass; + private final List<ConfigurationModel> _configurations = new CopyOnWriteArrayList<>(); + private String _name; + private final List<String> _properties = new CopyOnWriteArrayList<>(); + private final List<String> _provides = new CopyOnWriteArrayList<>(); + private final List<ReferenceModel> _references = new CopyOnWriteArrayList<>(); + private ServiceScope _scope; + + } + + private ComponentModel( + Class<?> beanClass, + String name, + List<String> provides, + ServiceScope scope, + List<String> properties, + List<ConfigurationModel> configurations, + List<ReferenceModel> references) { + + _beanClass = beanClass; + _name = name; + _properties = properties; + _provides = provides; + _scope = scope; + _configurations = configurations; + _references = references; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComponentModel other = (ComponentModel) obj; + if (_beanClass.getName() == null) { + if (other._beanClass.getName() != null) + return false; + } else if (!_beanClass.getName().equals(other._beanClass.getName())) + return false; + return true; + } + + public boolean found() { + return _found.get(); + } + + public void found(boolean found) { + _found.set(found); + } + + public Class<?> getBeanClass() { + return _beanClass; + } + + public List<ConfigurationModel> getConfigurations() { + return _configurations; + } + + public String getName() { + return _name; + } + + public String[] getProperties() { + return _properties.toArray(new String[0]); + } + + public List<String> getProvides() { + return _provides; + } + + public List<ReferenceModel> getReferences() { + return _references; + } + + public ServiceScope getServiceScope() { + return _scope; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((_beanClass.getName() == null) ? 0 : _beanClass.getName().hashCode()); + return result; + } + + @Override + public String toString() { + if (_string == null) { + _string = String.format("ComponentModel[name='%s', beanClass='%s', scope='%s', provides='%s']", _name, _beanClass.getName(), _scope, _provides); + } + return _string; + } + + private final Class<?> _beanClass; + private final AtomicBoolean _found = new AtomicBoolean(); + private String _name; + private final List<String> _properties; + private final List<String> _provides; + private final List<ConfigurationModel> _configurations; + private final List<ReferenceModel> _references; + private ServiceScope _scope; + private volatile String _string; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentProperties.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentProperties.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentProperties.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentProperties.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,104 @@ +/** + * 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.component; + +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Map; + +import javax.enterprise.inject.spi.Bean; + +import org.apache.aries.cdi.container.internal.configuration.ConfigurationCallback; +import org.apache.aries.cdi.container.internal.container.ContainerState; +import org.apache.aries.cdi.container.internal.util.Conversions; +import org.apache.aries.cdi.container.internal.util.Maps; +import org.osgi.service.cdi.annotations.Configuration; +import org.osgi.util.converter.TypeReference; + +public class ComponentProperties { + + public ComponentProperties bean(Bean<?> bean) { + _bean = bean; + return this; + } + + public ComponentProperties componentModel(ComponentModel componentModel) { + _componentModel = componentModel; + return this; + } + + public ComponentProperties containerState(ContainerState containerState) { + _containerState = containerState; + return this; + } + + public Dictionary<String, ?> build() { + Dictionary<String, Object> componentProperties = new Hashtable<>(); + + _bean.getQualifiers().stream().forEach( + annotation -> { + Map<String, Object> map = Conversions.convert( + annotation).sourceAs(annotation.annotationType()).to(_mapType); + + for (Map.Entry<String, Object> entry : map.entrySet()) { + componentProperties.put(entry.getKey(), entry.getValue()); + } + + } + ); + + for (Map.Entry<String, Object> entry : Maps.map(_componentModel.getProperties()).entrySet()) { + componentProperties.put(entry.getKey(), entry.getValue()); + } + + Map<String, ConfigurationCallback> map = _containerState.configurationCallbacks().get(_componentModel); + + if ((_pid == null) || (_pid.length == 0)) { + _pid = map.keySet().toArray(new String[0]); + } + + for (String pid : _pid) { + if (Configuration.NAME.equals(pid)) { + pid = _componentModel.getName(); + } + ConfigurationCallback callback = map.get(pid); + Dictionary<String,?> properties = callback.properties(); + + for (Enumeration<String> enumeration = properties.keys(); enumeration.hasMoreElements();) { + String key = enumeration.nextElement(); + + componentProperties.put(key, properties.get(key)); + } + } + + componentProperties.put("component.name", _componentModel.getName()); + + return componentProperties; + } + + public ComponentProperties pid(String[] pid) { + _pid = pid; + return this; + } + + private static final TypeReference<Map<String, Object>> _mapType = new TypeReference<Map<String, Object>>(){}; + + private Bean<?> _bean; + private String[] _pid; + private ComponentModel _componentModel; + private ContainerState _containerState; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentRuntimeExtension.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentRuntimeExtension.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentRuntimeExtension.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/ComponentRuntimeExtension.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,399 @@ +/** + * 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.component; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.enterprise.context.Dependent; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.Annotated; +import javax.enterprise.inject.spi.AnnotatedConstructor; +import javax.enterprise.inject.spi.AnnotatedField; +import javax.enterprise.inject.spi.AnnotatedMethod; +import javax.enterprise.inject.spi.AnnotatedType; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.Extension; +import javax.enterprise.inject.spi.InjectionPoint; +import javax.enterprise.inject.spi.ObserverMethod; +import javax.enterprise.inject.spi.ProcessAnnotatedType; +import javax.enterprise.inject.spi.ProcessBean; +import javax.enterprise.inject.spi.ProcessInjectionPoint; +import javax.enterprise.inject.spi.ProcessObserverMethod; + +import org.apache.aries.cdi.container.internal.configuration.ConfigurationBean; +import org.apache.aries.cdi.container.internal.configuration.ConfigurationModel; +import org.apache.aries.cdi.container.internal.container.ContainerState; +import org.apache.aries.cdi.container.internal.literal.ComponentLiteral; +import org.apache.aries.cdi.container.internal.literal.ConfigurationLiteral; +import org.apache.aries.cdi.container.internal.literal.ReferenceLiteral; +import org.apache.aries.cdi.container.internal.model.ObserverMethodAnnotated; +import org.apache.aries.cdi.container.internal.reference.ReferenceBean; +import org.apache.aries.cdi.container.internal.reference.ReferenceModel; +import org.apache.aries.cdi.container.internal.service.ServiceDeclaration; +import org.apache.aries.cdi.container.internal.util.Sets; +import org.apache.aries.cdi.container.internal.util.Types; +import org.jboss.weld.bean.builtin.BeanManagerProxy; +import org.jboss.weld.manager.BeanManagerImpl; +import org.osgi.service.cdi.annotations.Component; +import org.osgi.service.cdi.annotations.Configuration; +import org.osgi.service.cdi.annotations.Reference; +import org.osgi.service.cdi.annotations.ReferencePolicy; +import org.osgi.service.cdi.annotations.ReferenceScope; +import org.osgi.service.cdi.annotations.ServiceEvent; +import org.osgi.service.cdi.annotations.ServiceScope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ComponentRuntimeExtension implements Extension { + + public ComponentRuntimeExtension(ContainerState containerState) { + _containerState = containerState; + } + + ConfigurationModel matchConfiguration(ComponentModel componentModel, ProcessInjectionPoint<?, ?> pip) { + InjectionPoint injectionPoint = pip.getInjectionPoint(); + + Configuration configuration = injectionPoint.getAnnotated().getAnnotation(Configuration.class); + + for (ConfigurationModel configurationModel : componentModel.getConfigurations()) { + ConfigurationModel tempModel = new ConfigurationModel.Builder( + injectionPoint.getType() + ).injectionPoint( + injectionPoint + ).build(); + + if (configurationModel.equals(tempModel)) { + if (configuration == null) { + configuration = new ConfigurationLiteral( + configurationModel.getPid(), configurationModel.getConfigurationPolicy()); + } + + MarkedInjectionPoint markedInjectionPoint = new MarkedInjectionPoint( + injectionPoint, + configuration, + _mark.incrementAndGet()); + + pip.setInjectionPoint(markedInjectionPoint); + + return configurationModel; + } + } + + return null; + } + + ReferenceModel matchReference(ComponentModel componentModel, ProcessInjectionPoint<?, ?> pip) { + InjectionPoint injectionPoint = pip.getInjectionPoint(); + + Reference reference = injectionPoint.getAnnotated().getAnnotation(Reference.class); + + for (ReferenceModel referenceModel : componentModel.getReferences()) { + ReferenceModel tempModel = new ReferenceModel.Builder( + injectionPoint.getQualifiers() + ).scope( + referenceModel.getScope() + ).target( + referenceModel.getTarget() + ).annotated( + injectionPoint.getAnnotated() + ).build(); + + if (referenceModel.equals(tempModel)) { + if (reference == null) { + reference = new ReferenceLiteral( + referenceModel.getName(), + referenceModel.getServiceClass(), + referenceModel.getCardinality(), + referenceModel.getPolicy(), + referenceModel.getPolicyOption(), + referenceModel.getScope(), + referenceModel.getTarget()); + } + + MarkedInjectionPoint markedInjectionPoint = new MarkedInjectionPoint( + injectionPoint, + reference, + _mark.incrementAndGet()); + + pip.setInjectionPoint(markedInjectionPoint); + + return referenceModel; + } + } + + return null; + } + + ReferenceModel matchReference(ComponentModel componentModel, ProcessObserverMethod<ServiceEvent<?>, ?> pom) { + ObserverMethod<ServiceEvent<?>> observerMethod = pom.getObserverMethod(); + + Annotated annotated = new ObserverMethodAnnotated(observerMethod); + + for (ReferenceModel referenceModel : componentModel.getReferences()) { + ReferenceModel tempModel = new ReferenceModel.Builder( + observerMethod.getObservedQualifiers() + ).annotated( + annotated + ).policy( + ReferencePolicy.DYNAMIC + ).build(); + + if (referenceModel.equals(tempModel)) { + return referenceModel; + } + } + + return null; + } + + /* + * discover if an annotated class is a component + */ + <X> void processAnnotatedType(@Observes ProcessAnnotatedType<X> pat, BeanManager beanManager) { + final AnnotatedType<X> at = pat.getAnnotatedType(); + + Class<X> annotatedClass = at.getJavaClass(); + + ComponentModel componentModel = _containerState.beansModel().getComponentModel(annotatedClass.getName()); + + // Is it one of the CDI Bundle's defined beans? + + if (componentModel == null) { + + // No it's not! + + return; + } + + // If the class is already annotated with @Component, skip it! + + if (at.isAnnotationPresent(Component.class)) { + return; + } + + // Since it's not, add @Component to the metadata for completeness. + + AnnotatedType<X> wrapped = new AnnotatedType<X>() { + + // Create an impl of @Component + + private final ComponentLiteral componentLiteral = new ComponentLiteral( + componentModel.getName(), + Types.types(componentModel, annotatedClass, _containerState.classLoader()), + componentModel.getProperties(), + componentModel.getServiceScope()); + + @Override + public Set<AnnotatedConstructor<X>> getConstructors() { + return at.getConstructors(); + } + + @Override + public Set<AnnotatedField<? super X>> getFields() { + return at.getFields(); + } + + @Override + public Class<X> getJavaClass() { + return at.getJavaClass(); + } + + @Override + public Set<AnnotatedMethod<? super X>> getMethods() { + return at.getMethods(); + } + + @Override + @SuppressWarnings("unchecked") + public <T extends Annotation> T getAnnotation(final Class<T> annType) { + if (Component.class.equals(annType)) { + return (T)componentLiteral; + } + return at.getAnnotation(annType); + } + + @Override + public Set<Annotation> getAnnotations() { + return Sets.hashSet(at.getAnnotations(), componentLiteral); + } + + @Override + public Type getBaseType() { + return at.getBaseType(); + } + + @Override + public Set<Type> getTypeClosure() { + return at.getTypeClosure(); + } + + @Override + public boolean isAnnotationPresent(Class<? extends Annotation> annType) { + if (Component.class.equals(annType)) { + return true; + } + return at.isAnnotationPresent(annType); + } + + }; + + pat.setAnnotatedType(wrapped); + } + + void processBean(@Observes ProcessBean<?> processBean, BeanManager beanManager) { + Bean<?> bean = processBean.getBean(); + + Class<?> beanClass = bean.getBeanClass(); + + ComponentModel componentModel = _containerState.beansModel().getComponentModel(beanClass.getName()); + + if (componentModel == null) { + return; + } + + Annotated annotated = processBean.getAnnotated(); + + if (annotated instanceof AnnotatedMethod) { + AnnotatedMethod<?> annotatedMethod = (AnnotatedMethod<?>)annotated; + + annotated = annotatedMethod.getDeclaringType(); + } + + if (!annotated.isAnnotationPresent(Component.class)) { + processBean.addDefinitionError( + new IllegalStateException( + String.format( + "Bean %s is missing the @Component annotation. This should have been added synthetically if missing...", + bean))); + + return; + } + + Component component = annotated.getAnnotation(Component.class); + + // Only Dependent CDI scope is allowed for components who's service scope is singleton, bundle, prototype. + + if ((component.serviceScope() == ServiceScope.BUNDLE) || + (component.serviceScope() == ServiceScope.PROTOTYPE) || + (component.serviceScope() == ServiceScope.SINGLETON)) { + + Class<?> scope = bean.getScope(); + + if (!Dependent.class.isAssignableFrom(scope)) { + processBean.addDefinitionError( + new IllegalArgumentException( + String.format( + "An illegal scope (%s) was used for component service (%s)", + scope, bean))); + + return; + } + } + + _containerState.serviceComponents().put( + componentModel, + new ServiceDeclaration( + _containerState, componentModel, bean, beanManager.createCreationalContext(bean))); + } + + /* + * + */ + void processInjectionPoint(@Observes ProcessInjectionPoint<?, ?> pip, BeanManager beanManager) { + BeanManagerImpl beanManagerImpl = ((BeanManagerProxy)beanManager).delegate(); + + InjectionPoint injectionPoint = pip.getInjectionPoint(); + + Bean<?> bean = injectionPoint.getBean(); + + if (bean == null) { + return; + } + + Class<?> beanClass = bean.getBeanClass(); + + ComponentModel componentModel = _containerState.beansModel().getComponentModel(beanClass.getName()); + + if (componentModel == null) { + return; + } + + ReferenceModel matchingReference = matchReference(componentModel, pip); + + if (matchingReference != null) { + ReferenceBean referenceBean = new ReferenceBean( + _containerState, + matchingReference, + componentModel, + pip.getInjectionPoint().getAnnotated(), + pip.getInjectionPoint().getQualifiers(), + beanManagerImpl); + + beanManagerImpl.addBean(referenceBean); + + return; + } + + ConfigurationModel matchingConfiguration = matchConfiguration(componentModel, pip); + + if (matchingConfiguration != null) { + ConfigurationBean configurationBean = new ConfigurationBean( + _containerState, matchingConfiguration, componentModel, pip.getInjectionPoint(), beanManagerImpl); + + beanManagerImpl.addBean(configurationBean); + } + } + + void processObserverMethod(@Observes ProcessObserverMethod<ServiceEvent<?>, ?> pom) { + ObserverMethod<ServiceEvent<?>> observerMethod = pom.getObserverMethod(); + + if (_log.isDebugEnabled()) { + _log.debug("CDIe - Processing observer method {}", observerMethod); + } + + Class<?> beanClass = observerMethod.getBeanClass(); + + final String className = beanClass.getName(); + + ComponentModel componentModel = _containerState.beansModel().getComponentModel(className); + + if (componentModel == null) { + return; + } + + ReferenceModel matchingReference = matchReference(componentModel, pom); + + if (matchingReference != null) { + Map<String, ObserverMethod<ServiceEvent<?>>> map = _containerState.referenceObservers().computeIfAbsent( + componentModel, k -> new LinkedHashMap<>()); + + map.put(matchingReference.getName(), observerMethod); + } + } + + private static final Logger _log = LoggerFactory.getLogger(ComponentRuntimeExtension.class); + + private final AtomicInteger _mark = new AtomicInteger(); + private final ContainerState _containerState; + +}
