You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2019/11/25 18:43:27 UTC
[aries-cdi] 08/27: rewrite the extender not to use any particular
CDI container impl
This is an automated email from the ASF dual-hosted git repository.
rotty3000 pushed a commit to branch rotty3000/cdi-spi
in repository https://gitbox.apache.org/repos/asf/aries-cdi.git
commit dc9eb675d3f5ca04c0cb38d47bc6b6f42475be63
Author: Raymond Augé <ro...@apache.org>
AuthorDate: Fri Nov 22 12:35:25 2019 -0500
rewrite the extender not to use any particular CDI container impl
Signed-off-by: Raymond Augé <ro...@apache.org>
Signed-off-by: Romain Manni-Bucau <rm...@gmail.com>
---
cdi-extender/pom.xml | 16 ++-
.../aries/cdi/container/internal/Activator.java | 76 ++++++++----
.../internal/bean/ComponentPropertiesBean.java | 4 +-
.../cdi/container/internal/bean/ReferenceBean.java | 21 +---
.../cdi/container/internal/command/CDICommand.java | 75 +++++++++---
.../container/internal/container/CDIBundle.java | 27 ++--
.../internal/container/ConfigurationListener.java | 1 -
.../internal/container/ContainerBootstrap.java | 131 +++++++++-----------
.../internal/container/ContainerDeployment.java | 66 ----------
.../container/ContainerDeploymentArchive.java | 84 -------------
.../internal/container/ContainerEnvironment.java | 43 -------
.../internal/container/ContainerState.java | 56 ++-------
.../internal/container/ExtensionMetadata.java | 41 -------
.../internal/container/MarkedInjectionPoint.java | 58 ---------
.../internal/container/RuntimeExtension.java | 68 +++++++----
.../internal/loader/BundleClassLoader.java | 110 +++++++++++++++--
.../internal/loader/BundleResourcesLoader.java | 136 ---------------------
.../cdi/container/internal/model/BeansModel.java | 17 +--
.../internal/model/ComponentPropertiesModel.java | 3 +-
.../container/internal/provider/CDIProvider.java | 40 +++---
.../cdi/container/internal/util/Annotates.java | 10 +-
.../apache/aries/cdi/container/package-info.java | 9 +-
.../internal/phase/ContainerBootstrapTest.java | 17 ++-
.../container/internal/phase/TemplatesTests.java | 10 +-
.../container/test/MockBeanDeploymentArchive.java | 69 -----------
.../aries/cdi/container/test/MockCdiContainer.java | 89 --------------
.../cdi/container/test/MockInjectionPoint.java | 2 -
.../apache/aries/cdi/container/test/TestUtil.java | 10 +-
28 files changed, 416 insertions(+), 873 deletions(-)
diff --git a/cdi-extender/pom.xml b/cdi-extender/pom.xml
index 7131fc6..e849995 100644
--- a/cdi-extender/pom.xml
+++ b/cdi-extender/pom.xml
@@ -53,6 +53,7 @@
<bnd><![CDATA[
-cdiannotations:
-conditionalpackage: \
+ aQute.lib.exceptions,\
org.apache.felix.utils.extender,\
org.osgi.util.converter
]]></bnd>
@@ -63,6 +64,11 @@
<dependencies>
<dependency>
+ <groupId>org.apache.aries.cdi</groupId>
+ <artifactId>org.apache.aries.cdi.spi</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.converter</artifactId>
</dependency>
@@ -87,10 +93,6 @@
<artifactId>geronimo-jcdi_2.0_spec</artifactId>
</dependency>
<dependency>
- <groupId>org.jboss.weld</groupId>
- <artifactId>weld-osgi-bundle</artifactId>
- </dependency>
- <dependency>
<groupId>org.osgi</groupId>
<artifactId>osgi.annotation</artifactId>
</dependency>
@@ -130,6 +132,12 @@
<groupId>org.osgi</groupId>
<artifactId>osgi.core</artifactId>
</dependency>
+ <dependency>
+ <groupId>biz.aQute.bnd</groupId>
+ <artifactId>biz.aQute.bndlib</artifactId>
+ <version>${bnd.version}</version>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
index b0c7881..ca885f1 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
@@ -14,6 +14,7 @@
package org.apache.aries.cdi.container.internal;
+import static org.apache.aries.cdi.container.internal.util.Filters.asFilter;
import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE;
import static org.osgi.service.cdi.CDIConstants.CDI_CAPABILITY_NAME;
import static org.osgi.service.cdi.CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE;
@@ -27,7 +28,9 @@ import java.util.Observer;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import javax.enterprise.inject.se.SeContainerInitializer;
import org.apache.aries.cdi.container.internal.command.CDICommand;
import org.apache.aries.cdi.container.internal.container.CDIBundle;
@@ -50,6 +53,8 @@ import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceObjects;
+import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleWire;
@@ -61,6 +66,7 @@ import org.osgi.service.log.Logger;
import org.osgi.service.log.LoggerFactory;
import org.osgi.util.promise.PromiseFactory;
import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
@Header(
name = Constants.BUNDLE_ACTIVATOR,
@@ -69,26 +75,48 @@ import org.osgi.util.tracker.ServiceTracker;
@RequireConfigurationAdmin
public class Activator extends AbstractExtender {
- private static final Logs _logs = new Logs.Builder(FrameworkUtil.getBundle(Activator.class).getBundleContext()).build();
- private static final Logger _log = _logs.getLogger(Activator.class);
- private static final ThreadGroup _threadGroup = new ThreadGroup("Apache Aries CCR - CDI");
- private static final ExecutorService _executorService = Executors.newFixedThreadPool(
- 1,
- new ThreadFactory() {
-
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(_threadGroup, r, "Aries CCR Thread");
- t.setDaemon(true);
- return t;
- }
-
- }
- );
- private static final PromiseFactory _promiseFactory = new PromiseFactory(_executorService);
- public static final CCR ccr = new CCR(_promiseFactory, _logs);
+ private final CCR _ccr;
+ private final ExecutorService _executorService;
+ private final Logger _log;
+ private final Logs _logs;
+ private final PromiseFactory _promiseFactory;
+ private final ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> _containerTracker;
public Activator() {
+ final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
+ _logs = new Logs.Builder(bundleContext).build();
+ _log = _logs.getLogger(Activator.class);
+ _containerTracker = new ServiceTracker<>(
+ bundleContext,
+ asFilter("(&(objectClass=%s)(aries.cdi.spi=*))", SeContainerInitializer.class.getName()),
+ new ServiceTrackerCustomizer<SeContainerInitializer, ServiceObjects<SeContainerInitializer>>() {
+
+ @Override
+ public ServiceObjects<SeContainerInitializer> addingService(
+ ServiceReference<SeContainerInitializer> reference) {
+ return bundleContext.getServiceObjects(reference);
+ }
+
+ @Override
+ public void modifiedService(ServiceReference<SeContainerInitializer> reference,
+ ServiceObjects<SeContainerInitializer> service) {
+ }
+
+ @Override
+ public void removedService(ServiceReference<SeContainerInitializer> reference,
+ ServiceObjects<SeContainerInitializer> service) {
+ }
+ }
+ );
+ _containerTracker.open();
+ _executorService = Executors.newSingleThreadExecutor(worker -> {
+ Thread t = new Thread(new ThreadGroup("Apache Aries CCR - CDI"), worker, "Aries CCR Thread (" + hashCode() + ")");
+ t.setDaemon(false);
+ return t;
+ });
+ _promiseFactory = new PromiseFactory(_executorService);
+ _ccr = new CCR(_promiseFactory, _logs);
+ _command = new CDICommand(_ccr);
setSynchronous(true);
}
@@ -98,8 +126,6 @@ public class Activator extends AbstractExtender {
_log.debug("CCR starting {}", bundleContext.getBundle());
}
- _command = new CDICommand(ccr);
-
_bundleContext = bundleContext;
registerCCR();
@@ -150,6 +176,8 @@ public class Activator extends AbstractExtender {
if (_log.isDebugEnabled()) {
_log.debug("CCR stoped {}", bundleContext.getBundle());
}
+ _executorService.shutdownNow();
+ _executorService.awaitTermination(2, TimeUnit.SECONDS); // not important but just to avoid to quit too fast
}
@Override
@@ -172,7 +200,7 @@ public class Activator extends AbstractExtender {
bundle, _bundleContext.getBundle(), _ccrChangeCount, _promiseFactory, caTracker, _logs);
// the CDI bundle
- return new CDIBundle(ccr, containerState,
+ return new CDIBundle(_ccr, containerState,
// handle extensions
new ExtensionPhase(containerState,
// listen for configurations of the container component
@@ -183,7 +211,7 @@ public class Activator extends AbstractExtender {
new ContainerActivator.Builder(containerState,
// when the active container bootstraps CDI
new ContainerBootstrap(
- containerState,
+ containerState, _containerTracker,
// when CDI is bootstrapping is complete and is up and running
// activate the configuration listeners for single and factory components
new ConfigurationListener.Builder(containerState),
@@ -264,7 +292,7 @@ public class Activator extends AbstractExtender {
_registrations.add(registration);
- return ccr;
+ return _ccr;
}
@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java
index 8155ac9..db9d8d5 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java
@@ -21,7 +21,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.spi.Bean;
@@ -98,7 +98,7 @@ public class ComponentPropertiesBean implements Bean<Object> {
ExtendedActivationDTO current = ComponentContext.With.current();
if (current == null) {
- return ApplicationScoped.class;
+ return Dependent.class;
}
return ComponentScoped.class;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
index c1ac4b8..c6d7a76 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
@@ -149,26 +149,7 @@ public class ReferenceBean implements Bean<Object> {
// TODO do we want to support decorators/interceptors on in-bound services one day???
// ==================================================================================
-
-// if (s == null) return null;
-//
-// List<javax.enterprise.inject.spi.Decorator<?>> decorators = _bm.resolveDecorators(
-// Collections.singleton(_template.serviceClass),
-// new Annotation[0]);
-//
-// if (decorators.isEmpty()) {
-// return s;
-// }
-//
-// org.jboss.weld.manager.BeanManagerImpl bmi =
-// ((org.jboss.weld.bean.builtin.BeanManagerProxy)_bm).delegate();
-// org.jboss.weld.injection.CurrentInjectionPoint cip = bmi.getServices().get(
-// org.jboss.weld.injection.CurrentInjectionPoint.class);
-// InjectionPoint ip = cip.peek();
-// return org.jboss.weld.util.Decorators.getOuterDelegate(
-// (Bean<S>)this, s, c, (Class<S>)_template.serviceClass,
-// (org.jboss.weld.injection.EmptyInjectionPoint.INSTANCE.equals(ip) ? null : ip),
-// bmi, decorators);
+// If so, use InterceptionFactory instead of doing it manually
}
@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
index 8631e3a..4a642b0 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
@@ -14,7 +14,8 @@
package org.apache.aries.cdi.container.internal.command;
-import static java.util.stream.Collectors.*;
+import static java.util.stream.Collectors.partitioningBy;
+import static java.util.stream.Collectors.toList;
import java.util.Collection;
import java.util.Formatter;
@@ -33,10 +34,12 @@ import org.osgi.service.cdi.runtime.dto.ComponentDTO;
import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
import org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ExtensionTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
public class CDICommand {
@@ -93,10 +96,34 @@ public class CDICommand {
containerDTO.bundle.symbolicName,
containerDTO.bundle.id);
+ if (!containerDTO.template.extensions.isEmpty()) {
+ f.format(
+ "%s%sEXTENSIONS%n",
+ (hasNext ? PSSS : SSSS),
+ TLLS);
+
+ for (Iterator<ExtensionTemplateDTO> itr1 = containerDTO.template.extensions.iterator(); itr1.hasNext();) {
+ ExtensionTemplateDTO templateDTO = itr1.next();
+ ExtensionDTO extensionDTO = containerDTO.extensions.stream().filter(extInstance -> templateDTO == extInstance.template).findFirst().orElse(null);
+
+ f.format(
+ "%s%sFILTER: %s%n",
+ (hasNext ? PSSS : SSSS) + PSSS,
+ (itr1.hasNext() ? TLLS : CLLS),
+ templateDTO.serviceFilter);
+ f.format(
+ "%s%s%sMATCH: %s%n",
+ (hasNext ? PSSS : SSSS) + PSSS,
+ (itr1.hasNext() ? PSSS : SSSS),
+ CLLS,
+ (extensionDTO == null) ? "null*" : extensionDTO.service);
+ }
+ }
+
f.format(
"%s%sCOMPONENTS%n",
(hasNext ? PSSS : SSSS),
- curb);
+ CLLS);
Map<Boolean, List<ComponentTemplateDTO>> componentTemplateDTOs = containerDTO.template.components.stream().collect(
partitioningBy(c -> c.type == ComponentType.CONTAINER)
@@ -160,20 +187,35 @@ public class CDICommand {
c -> c.template.name.equals(componentTemplateDTO.name)
).findFirst().orElse(null);
- if ((componentDTO != null) && !componentDTO.instances.isEmpty()) {
- Iterator<ComponentInstanceDTO> itr3 = componentDTO.instances.iterator();
+ if (componentDTO != null) {
+ if (!componentDTO.instances.isEmpty()) {
+ Iterator<ComponentInstanceDTO> itr3 = componentDTO.instances.iterator();
- for (;itr3.hasNext();) {
- ComponentInstanceDTO instanceDTO = itr3.next();
+ for (;itr3.hasNext();) {
+ ComponentInstanceDTO instanceDTO = itr3.next();
+ formatInstance(
+ f,
+ prefix,
+ componentDTO,
+ componentTemplateDTO,
+ instanceDTO,
+ pids(instanceDTO, configMap),
+ hasNext,
+ itr3.hasNext(),
+ verbose);
+ }
+ }
+ else {
formatInstance(
f,
prefix,
componentDTO,
- instanceDTO,
- pids(instanceDTO, configMap),
+ componentTemplateDTO,
+ null,
+ configMap.get(Boolean.FALSE).stream().map(c -> c.pid).collect(toList()).toString(),
hasNext,
- itr3.hasNext(),
+ false,
verbose);
}
}
@@ -182,6 +224,7 @@ public class CDICommand {
f,
prefix,
componentDTO,
+ componentTemplateDTO,
null,
configMap.get(Boolean.FALSE).stream().map(c -> c.pid).collect(toList()).toString(),
hasNext,
@@ -191,7 +234,7 @@ public class CDICommand {
}
private void formatInstance(
- Formatter f, String prefix, ComponentDTO componentDTO,
+ Formatter f, String prefix, ComponentDTO componentDTO, ComponentTemplateDTO templateDTO,
ComponentInstanceDTO instanceDTO, String pids,
boolean hasNext, boolean hasNext2, boolean verbose) {
@@ -201,7 +244,7 @@ public class CDICommand {
prefix,
(hasNext ? PSSS : SSSS),
TLLS,
- componentDTO.template.beans.toString());
+ templateDTO.beans.toString());
f.format(
"%s%s%sCONFIGURATIONS%n",
@@ -209,7 +252,7 @@ public class CDICommand {
(hasNext ? PSSS : SSSS),
TLLS);
- for (Iterator<ConfigurationTemplateDTO> itr = componentDTO.template.configurations.iterator();itr.hasNext();) {
+ for (Iterator<ConfigurationTemplateDTO> itr = templateDTO.configurations.iterator();itr.hasNext();) {
ConfigurationTemplateDTO conf = itr.next();
ConfigurationDTO configurationDTO = null;
@@ -266,14 +309,14 @@ public class CDICommand {
}
}
- if (!componentDTO.template.references.isEmpty()) {
+ if (!templateDTO.references.isEmpty()) {
f.format(
"%s%s%sREFERENCES%n",
prefix,
(hasNext ? PSSS : SSSS),
TLLS);
- for (Iterator<ReferenceTemplateDTO> itr = componentDTO.template.references.iterator(); itr.hasNext();) {
+ for (Iterator<ReferenceTemplateDTO> itr = templateDTO.references.iterator(); itr.hasNext();) {
ReferenceTemplateDTO dto = itr.next();
ReferenceDTO referenceDTO = null;
@@ -345,14 +388,14 @@ public class CDICommand {
}
}
- if (!componentDTO.template.activations.isEmpty()) {
+ if (!templateDTO.activations.isEmpty()) {
f.format(
"%s%s%sACTIVATIONS%n",
prefix,
(hasNext ? PSSS : SSSS),
TLLS);
- for (Iterator<ActivationTemplateDTO> itr = componentDTO.template.activations.iterator(); itr.hasNext();) {
+ for (Iterator<ActivationTemplateDTO> itr = templateDTO.activations.iterator(); itr.hasNext();) {
ActivationTemplateDTO dto = itr.next();
ActivationDTO activationDTO = null;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
index c9816bd..3c58d88 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
@@ -31,23 +31,25 @@ public class CDIBundle extends Phase implements Extension {
@Override
public boolean close() {
try (Syncro open = syncro.open()) {
+ if (!running) return false;
+
containerState.closing();
return next.map(
- next -> {
- submit(next.closeOp(), next::close).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in cdibundle CLOSE on {}", bundle(), f));
+ next -> {
+ submit(next.closeOp(), next::close).onFailure(
+ f -> {
+ _log.error(l -> l.error("CCR Error in cdibundle CLOSE on {}", bundle(), f));
- error(f);
- }
- );
+ error(f);
+ }
+ );
- _ccr.remove(bundle());
+ _ccr.remove(bundle());
- return true;
- }
- ).orElse(true);
+ return true;
+ }
+ ).orElse(true);
}
}
@@ -64,7 +66,7 @@ public class CDIBundle extends Phase implements Extension {
@Override
public boolean open() {
try (Syncro open = syncro.open()) {
- return next.map(
+ return running = next.map(
next -> {
_ccr.add(containerState.bundle(), containerState);
@@ -94,5 +96,6 @@ public class CDIBundle extends Phase implements Extension {
private final CCR _ccr;
private final Logger _log;
+ private volatile boolean running = false;
}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
index 9a89301..494de1c 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
@@ -29,7 +29,6 @@ import org.apache.aries.cdi.container.internal.util.Maps;
import org.apache.aries.cdi.container.internal.util.Predicates;
import org.apache.aries.cdi.container.internal.util.Syncro;
import org.apache.aries.cdi.container.internal.util.Throw;
-import org.jboss.weld.exceptions.IllegalArgumentException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cdi.ConfigurationPolicy;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
index c67a26e..4d573da 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
@@ -14,29 +14,33 @@
package org.apache.aries.cdi.container.internal.container;
+import static org.apache.aries.cdi.spi.Keys.BEANS_XML_PROPERTY;
+import static org.apache.aries.cdi.spi.Keys.BUNDLECONTEXT_PROPERTY;
+
+import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.ServiceLoader;
+import javax.enterprise.inject.se.SeContainer;
+import javax.enterprise.inject.se.SeContainerInitializer;
import javax.enterprise.inject.spi.Extension;
import org.apache.aries.cdi.container.internal.container.Op.Mode;
import org.apache.aries.cdi.container.internal.container.Op.Type;
-import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader;
import org.apache.aries.cdi.container.internal.model.ExtendedExtensionDTO;
import org.apache.aries.cdi.container.internal.model.FactoryComponent;
+import org.apache.aries.cdi.container.internal.model.OSGiBean;
import org.apache.aries.cdi.container.internal.model.SingleComponent;
import org.apache.aries.cdi.container.internal.util.Syncro;
-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.util.ServiceLoader;
+import org.osgi.framework.ServiceObjects;
import org.osgi.service.log.Logger;
+import org.osgi.util.tracker.ServiceTracker;
public class ContainerBootstrap extends Phase {
public ContainerBootstrap(
ContainerState containerState,
+ ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> containerTracker,
ConfigurationListener.Builder configurationBuilder,
SingleComponent.Builder singleBuilder,
FactoryComponent.Builder factoryBuilder) {
@@ -44,24 +48,34 @@ public class ContainerBootstrap extends Phase {
super(containerState, null);
_configurationBuilder = configurationBuilder;
+ _containerTracker = containerTracker;
_singleBuilder = singleBuilder;
_factoryBuilder = factoryBuilder;
_log = containerState.containerLogs().getLogger(getClass());
+
+ _serviceObjects = _containerTracker.getService();
+ _seContainerInitializerInstance = _serviceObjects.getService();
}
@Override
public boolean close() {
try (Syncro syncro = _lock.open()) {
- if (_bootstrap != null) {
- _log.debug(l -> l.debug("CCR container bootstrap shutdown on {}", _bootstrap));
- _bootstrap.shutdown();
- _bootstrap = null;
+ if (_seContainer != null) {
+ _log.debug(l -> l.debug("CCR container shutdown for {}", bundle()));
+ _seContainer.close();
+ try {
+ _serviceObjects.ungetService(_seContainerInitializerInstance);
+ }
+ catch (Throwable t) {
+ _log.trace(l -> l.trace("CCR Failure in returning initializer instance on {}", bundle(), t));
+ }
+ _seContainer = null;
}
return true;
}
catch (Throwable t) {
- _log.error(l -> l.error("CCR Failure in container bootstrap shutdown on {}", _bootstrap, t));
+ _log.error(l -> l.error("CCR Failure in container bootstrap shutdown on {}", bundle(), t));
return false;
}
@@ -80,7 +94,7 @@ public class ContainerBootstrap extends Phase {
return false;
}
- if (_bootstrap != null) {
+ if (_seContainer != null) {
return true;
}
@@ -88,62 +102,16 @@ public class ContainerBootstrap extends Phase {
return false;
}
- List<Metadata<Extension>> extensions = new CopyOnWriteArrayList<>();
-
- // Add the internal extensions
- extensions.add(
- new ExtensionMetadata(
- new BundleContextExtension(containerState.bundleContext()),
- containerState.id()));
- extensions.add(
- new ExtensionMetadata(
- new RuntimeExtension(containerState, _configurationBuilder, _singleBuilder, _factoryBuilder),
- containerState.id()));
- extensions.add(
- new ExtensionMetadata(
- new LoggerExtension(containerState),
- containerState.id()));
-
- Thread currentThread = Thread.currentThread();
- ClassLoader current = currentThread.getContextClassLoader();
- BundleResourcesLoader.Builder builder = new BundleResourcesLoader.Builder(containerState.bundle(), containerState.extenderBundle());
-
- try {
- currentThread.setContextClassLoader(containerState.classLoader());
-
- // Add extensions found from the bundle's class loader, such as those in the Bundle-ClassPath
- ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(extensions::add);
-
- // Add external extensions
- containerState.containerDTO().extensions.stream().map(
- ExtendedExtensionDTO.class::cast
- ).map(
- e -> {
- builder.add(e.serviceReference.getBundle());
- return new ExtensionMetadata(e.extension.getService(), e.template.serviceFilter);
- }
- ).forEach(extensions::add);
-
- _bootstrap = new WeldBootstrap();
-
- BeanDeploymentArchive beanDeploymentArchive = new ContainerDeploymentArchive(
- builder.build(),
- containerState.id(),
- containerState.beansModel().getBeanClassNames(),
- containerState.beansModel().getBeansXml());
-
- Deployment deployment = new ContainerDeployment(extensions, beanDeploymentArchive);
-
- _bootstrap.startExtensions(extensions);
- _bootstrap.startContainer(containerState.id(), new ContainerEnvironment(), deployment);
- _bootstrap.startInitialization();
- _bootstrap.deployBeans();
- _bootstrap.validateBeans();
- _bootstrap.endInitialization();
- }
- finally {
- currentThread.setContextClassLoader(current);
- }
+ _log.debug(log -> log.debug("CCR container startup for {}", bundle()));
+
+ _seContainer = _seContainerInitializerInstance
+ .setClassLoader(containerState.classLoader())
+ .addBeanClasses(containerState.beansModel().getOSGiBeans().stream().map(OSGiBean::getBeanClass).toArray(Class<?>[]::new))
+ .setProperties(containerState.containerComponentTemplateDTO().properties)
+ .addProperty(BEANS_XML_PROPERTY, containerState.beansModel().getBeansXml())
+ .addProperty(BUNDLECONTEXT_PROPERTY, bundle().getBundleContext())
+ .addExtensions(getExtensions().toArray(new Extension[0]))
+ .initialize();
return true;
}
@@ -154,10 +122,33 @@ public class ContainerBootstrap extends Phase {
return Op.of(Mode.OPEN, Type.CONTAINER_BOOTSTRAP, containerState.id());
}
+ protected List<Extension> getExtensions() {
+ List<Extension> extensions = new ArrayList<>();
+
+ // Add the internal extensions
+ extensions.add(new BundleContextExtension(containerState.bundleContext()));
+ extensions.add(new RuntimeExtension(containerState, _configurationBuilder, _singleBuilder, _factoryBuilder));
+ extensions.add(new LoggerExtension(containerState));
+
+ // Add extensions found from the bundle's class loader, such as those in the Bundle-ClassPath
+ ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(extensions::add);
+
+ // Add external extensions
+ containerState.containerDTO().extensions.stream().map(
+ ExtendedExtensionDTO.class::cast
+ ).map(
+ e -> e.extension.getService()
+ ).forEach(extensions::add);
+
+ return extensions;
+ }
- private volatile WeldBootstrap _bootstrap;
+ private volatile SeContainer _seContainer;
+ private final ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> _containerTracker;
private final ConfigurationListener.Builder _configurationBuilder;
private final FactoryComponent.Builder _factoryBuilder;
+ private final SeContainerInitializer _seContainerInitializerInstance;
+ private final ServiceObjects<SeContainerInitializer> _serviceObjects;
private final SingleComponent.Builder _singleBuilder;
private final Syncro _lock = new Syncro(true);
private final Logger _log;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java
deleted file mode 100644
index 7e838a5..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.aries.cdi.container.internal.container;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import javax.enterprise.inject.spi.Extension;
-
-import org.jboss.weld.bootstrap.api.ServiceRegistry;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.CDI11Deployment;
-import org.jboss.weld.bootstrap.spi.Metadata;
-
-public class ContainerDeployment implements CDI11Deployment {
-
- public ContainerDeployment(Iterable<Metadata<Extension>> extensions, BeanDeploymentArchive beanDeploymentArchive) {
- _extensions = extensions;
- _beanDeploymentArchive = beanDeploymentArchive;
-
- _beanDeploymentArchives = new ArrayList<BeanDeploymentArchive>();
- _beanDeploymentArchives.add(beanDeploymentArchive);
- }
-
- @Override
- public BeanDeploymentArchive getBeanDeploymentArchive(Class<?> beanClass) {
- return _beanDeploymentArchive;
- }
-
- @Override
- public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() {
- return _beanDeploymentArchives;
- }
-
- @Override
- public Iterable<Metadata<Extension>> getExtensions() {
- return _extensions;
- }
-
- @Override
- public ServiceRegistry getServices() {
- return _beanDeploymentArchive.getServices();
- }
-
- @Override
- public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> aClass) {
- return _beanDeploymentArchive;
- }
-
- private final BeanDeploymentArchive _beanDeploymentArchive;
- private final Collection<BeanDeploymentArchive> _beanDeploymentArchives;
- private final Iterable<Metadata<Extension>> _extensions;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java
deleted file mode 100644
index 4fbca9b..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * 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.Collections;
-
-import org.jboss.weld.bootstrap.api.ServiceRegistry;
-import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.bootstrap.spi.EEModuleDescriptor;
-import org.jboss.weld.bootstrap.spi.EEModuleDescriptor.ModuleType;
-import org.jboss.weld.bootstrap.spi.helpers.EEModuleDescriptorImpl;
-import org.jboss.weld.ejb.spi.EjbDescriptor;
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.serialization.spi.ProxyServices;
-
-public class ContainerDeploymentArchive
- implements BeanDeploymentArchive {
-
- public <T extends ResourceLoader & ProxyServices> ContainerDeploymentArchive(
- T loader, String id, Collection<String> beanClassNames, BeansXml beansXml) {
-
- _id = id;
- _beanClassNames = beanClassNames;
- _beansXml = beansXml;
- _services = new SimpleServiceRegistry();
-
- if (loader != null) {
- _services.add(ResourceLoader.class, loader);
- _services.add(ProxyServices.class, loader);
- _services.add(EEModuleDescriptor.class, new EEModuleDescriptorImpl(id, ModuleType.WEB));
- }
- }
-
- @Override
- public Collection<String> getBeanClasses() {
- return _beanClassNames;
- }
-
- @Override
- public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() {
- return Collections.emptyList();
- }
-
- @Override
- public BeansXml getBeansXml() {
- return _beansXml;
- }
-
- @Override
- public Collection<EjbDescriptor<?>> getEjbs() {
- return Collections.emptyList();
- }
-
- @Override
- public String getId() {
- return _id;
- }
-
- @Override
- public ServiceRegistry getServices() {
- return _services;
- }
-
- private final Collection<String> _beanClassNames;
- private final BeansXml _beansXml;
- private final String _id;
- private final ServiceRegistry _services;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java
deleted file mode 100644
index a968c32..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 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.HashSet;
-import java.util.Set;
-
-import org.jboss.weld.bootstrap.api.Environment;
-import org.jboss.weld.bootstrap.api.Service;
-
-public class ContainerEnvironment implements Environment {
-
- public ContainerEnvironment() {
- _requiredBeanDeploymentArchiveServices = new HashSet<Class<? extends Service>>();
- _requiredDeploymentServices = new HashSet<Class<? extends Service>>();
- }
-
- @Override
- public Set<Class<? extends Service>> getRequiredBeanDeploymentArchiveServices() {
- return _requiredBeanDeploymentArchiveServices;
- }
-
- @Override
- public Set<Class<? extends Service>> getRequiredDeploymentServices() {
- return _requiredDeploymentServices;
- }
-
- private final Set<Class<? extends Service>> _requiredBeanDeploymentArchiveServices;
- private final Set<Class<? extends Service>> _requiredDeploymentServices;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
index f04cb9e..bd3a8a2 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
@@ -14,9 +14,11 @@
package org.apache.aries.cdi.container.internal.container;
-import static org.apache.aries.cdi.container.internal.util.Filters.*;
-import static org.osgi.namespace.extender.ExtenderNamespace.*;
-import static org.osgi.service.cdi.CDIConstants.*;
+import static org.apache.aries.cdi.container.internal.util.Filters.asFilter;
+import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE;
+import static org.osgi.service.cdi.CDIConstants.CDI_CAPABILITY_NAME;
+import static org.osgi.service.cdi.CDIConstants.CDI_CONTAINER_ID;
+import static org.osgi.service.cdi.CDIConstants.CDI_EXTENSION_PROPERTY;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
@@ -30,26 +32,20 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
-import javax.enterprise.inject.Any;
import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.util.AnnotationLiteral;
import org.apache.aries.cdi.container.internal.ChangeCount;
import org.apache.aries.cdi.container.internal.loader.BundleClassLoader;
-import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader;
import org.apache.aries.cdi.container.internal.model.BeansModel;
import org.apache.aries.cdi.container.internal.model.BeansModelBuilder;
import org.apache.aries.cdi.container.internal.model.ExtendedConfigurationTemplateDTO;
import org.apache.aries.cdi.container.internal.model.ExtendedExtensionTemplateDTO;
import org.apache.aries.cdi.container.internal.util.Logs;
import org.apache.aries.cdi.container.internal.util.Throw;
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.serialization.spi.ProxyServices;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.dto.BundleDTO;
-import org.osgi.framework.namespace.PackageNamespace;
import org.osgi.framework.wiring.BundleCapability;
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleWire;
@@ -71,10 +67,6 @@ import org.osgi.util.tracker.ServiceTracker;
public class ContainerState {
- public static final AnnotationLiteral<Any> ANY = new AnnotationLiteral<Any>() {
- private static final long serialVersionUID = 1L;
- };
-
public ContainerState(
Bundle bundle,
Bundle extenderBundle,
@@ -195,8 +187,6 @@ public class ContainerState {
_beansModel = new BeansModelBuilder(this, _aggregateClassLoader, bundleWiring, cdiAttributes).build();
- _bundleClassLoader = bundleWiring.getClassLoader();
-
try {
new Discovery(this).discover();
}
@@ -238,10 +228,6 @@ public class ContainerState {
return _bundle;
}
- public ClassLoader bundleClassLoader() {
- return _bundleClassLoader;
- }
-
public BundleContext bundleContext() {
return _bundleContext;
}
@@ -254,7 +240,7 @@ public class ContainerState {
return _ccrLogs;
}
- public ClassLoader classLoader() {
+ public BundleClassLoader classLoader() {
return _aggregateClassLoader;
}
@@ -328,11 +314,6 @@ public class ContainerState {
_changeCount.incrementAndGet();
}
- @SuppressWarnings("unchecked")
- public <T extends ResourceLoader & ProxyServices> T loader() {
- return (T)new BundleResourcesLoader.Builder(_bundle, _extenderBundle).build();
- }
-
public PromiseFactory promiseFactory() {
return _promiseFactory;
}
@@ -378,39 +359,20 @@ public class ContainerState {
return promise;
}
- private static Bundle[] getBundles(Bundle bundle, Bundle extenderBundle) {
+ private static List<Bundle> getBundles(Bundle bundle, Bundle extenderBundle) {
List<Bundle> bundles = new ArrayList<>();
bundles.add(bundle);
bundles.add(extenderBundle);
- BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class);
-
- List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE);
-
- for (BundleWire bundleWire : requiredWires) {
- BundleCapability capability = bundleWire.getCapability();
- Map<String, Object> attributes = capability.getAttributes();
- String packageName = (String)attributes.get(PackageNamespace.PACKAGE_NAMESPACE);
- if (!packageName.startsWith("org.jboss.weld.")) {
- continue;
- }
-
- Bundle wireBundle = bundleWire.getProvider().getBundle();
- if (!bundles.contains(wireBundle)) {
- bundles.add(wireBundle);
- }
- }
-
- return bundles.toArray(new Bundle[0]);
+ return bundles;
}
- private final ClassLoader _aggregateClassLoader;
+ private final BundleClassLoader _aggregateClassLoader;
private volatile Deferred<BeanManager> _beanManagerDeferred;
private final BeansModel _beansModel;
private final Bundle _bundle;
private final BundleContext _bundleContext;
- private final ClassLoader _bundleClassLoader;
private final Map<CheckedCallback<?, ?>, Deferred<?>> _callbacks = new ConcurrentHashMap<>();
private final ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> _caTracker;
private final Logger _log;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java
deleted file mode 100644
index 7ae345c..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * 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.Extension;
-
-import org.jboss.weld.bootstrap.spi.Metadata;
-
-public class ExtensionMetadata implements Metadata<Extension> {
-
- public ExtensionMetadata(Extension extension, String location) {
- _extension = extension;
- _location = location;
- }
-
- @Override
- public Extension getValue() {
- return _extension;
- }
-
- @Override
- public String getLocation() {
- return _location;
- }
-
- private final Extension _extension;
- private final String _location;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/MarkedInjectionPoint.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/MarkedInjectionPoint.java
deleted file mode 100644
index 0433f2e..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/MarkedInjectionPoint.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * 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.lang.annotation.Annotation;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.enterprise.inject.spi.InjectionPoint;
-
-import org.apache.aries.cdi.container.internal.util.Sets;
-import org.jboss.weld.injection.ForwardingInjectionPoint;
-
-public class MarkedInjectionPoint extends ForwardingInjectionPoint {
-
- public MarkedInjectionPoint(InjectionPoint injectionPoint) {
- _delegate = injectionPoint;
- _mark = Mark.Literal.from(counter.incrementAndGet());
- _qualifiers = Sets.hashSet(injectionPoint.getQualifiers(), _mark);
- }
-
- @Override
- protected InjectionPoint delegate() {
- return _delegate;
- }
-
- public InjectionPoint getDelegate() {
- return delegate();
- }
-
- public Mark getMark() {
- return _mark;
- }
-
- @Override
- public Set<Annotation> getQualifiers() {
- return _qualifiers;
- }
-
- private static final AtomicInteger counter = new AtomicInteger();
-
- private final InjectionPoint _delegate;
- private final Mark _mark;
- private final Set<Annotation> _qualifiers;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
index 697b6f6..02d44ab 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
@@ -14,7 +14,7 @@
package org.apache.aries.cdi.container.internal.container;
-import static javax.interceptor.Interceptor.Priority.*;
+import static javax.interceptor.Interceptor.Priority.PLATFORM_AFTER;
import java.util.ArrayList;
import java.util.Dictionary;
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import javax.annotation.Priority;
@@ -182,10 +183,7 @@ public class RuntimeExtension implements Extension {
for (ActivationTemplateDTO at : _containerTemplate.activations) {
ExtendedActivationTemplateDTO extended = (ExtendedActivationTemplateDTO)at;
if (extended.declaringClass.equals(declaringClass) &&
- (((extended.producer == null) && (producer == null)) ||
- (extended.producer != null) &&
- (producer != null) &&
- Objects.equals(extended.producer.getJavaMember(), producer.getJavaMember()))) {
+ equals(extended.producer, producer)) {
activationTemplate = extended;
break;
@@ -245,6 +243,8 @@ public class RuntimeExtension implements Extension {
registerService(serviceTypes, bm, properties);
+ _log.debug(l -> l.debug("CCR Container READY for {}", _containerState.bundle()));
+
return s;
});
}
@@ -292,7 +292,7 @@ public class RuntimeExtension implements Extension {
).findFirst().map(
ExtendedReferenceDTO.class::cast
).ifPresent(
- r -> bean.setReferenceDTO(r)
+ bean::setReferenceDTO
);
}
@@ -329,6 +329,18 @@ public class RuntimeExtension implements Extension {
return producerFactory.createProducer(bean);
}
+ // Objects.equals(producer, producer1) is not expected to work so impl it as expected there
+ private boolean equals(AnnotatedMember<?> producerA, AnnotatedMember<?> producerB) {
+ if ((producerA == null) && (producerB == null)) return true;
+ if (!Objects.equals(producerA.getJavaMember(), producerB.getJavaMember())) {
+ return false;
+ }
+ if (!Objects.equals(producerA.getAnnotations(), producerB.getAnnotations())) {
+ return false;
+ }
+ return true;
+ }
+
private Promise<Boolean> initComponents() {
_containerState.containerDTO().template.components.stream().filter(
t -> t.type != ComponentType.CONTAINER
@@ -368,7 +380,7 @@ public class RuntimeExtension implements Extension {
return _containerState.submit(cl.openOp(), cl::open);
}
- private boolean matchConfiguration(OSGiBean osgiBean, ProcessInjectionPoint<?, ?> pip) {
+ private void processConfiguration(OSGiBean osgiBean, ProcessInjectionPoint<?, ?> pip) {
InjectionPoint injectionPoint = pip.getInjectionPoint();
Class<?> declaringClass = Annotates.declaringClass(injectionPoint.getAnnotated());
@@ -379,22 +391,18 @@ public class RuntimeExtension implements Extension {
injectionPoint.getQualifiers()
).build().toDTO();
- return osgiBean.getComponent().configurations.stream().map(
+ osgiBean.getComponent().configurations.stream().map(
t -> (ExtendedConfigurationTemplateDTO)t
).filter(
t -> current.equals(t)
- ).findFirst().map(
+ ).findFirst().ifPresent(
t -> {
- MarkedInjectionPoint markedInjectionPoint = new MarkedInjectionPoint(injectionPoint);
-
- pip.setInjectionPoint(markedInjectionPoint);
-
- t.bean.setInjectionPoint(injectionPoint);
- t.bean.setMark(markedInjectionPoint.getMark());
+ final Mark mark = Mark.Literal.from(MARK_IP_COUNTER.incrementAndGet());
+ pip.configureInjectionPoint().addQualifiers(mark);
- return true;
+ t.bean.setMark(mark);
}
- ).orElse(false);
+ );
}
private boolean matchReference(OSGiBean osgiBean, ProcessInjectionPoint<?, ?> pip) {
@@ -414,11 +422,10 @@ public class RuntimeExtension implements Extension {
t -> current.equals(t)
).findFirst().map(
t -> {
- MarkedInjectionPoint markedInjectionPoint = new MarkedInjectionPoint(injectionPoint);
+ final Mark mark = Mark.Literal.from(MARK_IP_COUNTER.incrementAndGet());
+ pip.configureInjectionPoint().addQualifier(mark);
- pip.setInjectionPoint(markedInjectionPoint);
-
- t.bean.setMark(markedInjectionPoint.getMark());
+ t.bean.setMark(mark);
_log.debug(l -> l.debug("CCR maping InjectionPoint {} to reference template {}", injectionPoint, t));
@@ -449,7 +456,21 @@ public class RuntimeExtension implements Extension {
}
if (componentProperties != null) {
- matchConfiguration(osgiBean, pip);
+ processConfiguration(osgiBean, pip);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private void registerServiceHandleFailure(
+ ExtendedComponentInstanceDTO componentInstance,
+ ExtendedActivationTemplateDTO activationTemplate,
+ BeanManager bm) {
+
+ try {
+ registerService(componentInstance, activationTemplate, bm);
+ }
+ catch (Throwable t) {
+ _log.error("CDI - An error occured", t);
}
}
@@ -553,7 +574,7 @@ public class RuntimeExtension implements Extension {
componentDTO.template.activations.stream().map(
ExtendedActivationTemplateDTO.class::cast
).forEach(
- a -> registerService((ExtendedComponentInstanceDTO)componentDTO.instances.get(0), a, bm)
+ a -> registerServiceHandleFailure((ExtendedComponentInstanceDTO)componentDTO.instances.get(0), a, bm)
);
return true;
@@ -568,4 +589,5 @@ public class RuntimeExtension implements Extension {
private final List<ServiceRegistration<?>> _registrations = new CopyOnWriteArrayList<>();
private final SingleComponent.Builder _singleBuilder;
+ private static final AtomicInteger MARK_IP_COUNTER = new AtomicInteger();
}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
index 9246c04..bf8f863 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
@@ -14,22 +14,26 @@
package org.apache.aries.cdi.container.internal.loader;
+import static java.util.Objects.requireNonNull;
+
import java.io.IOException;
import java.net.URL;
-import java.net.URLClassLoader;
+import java.security.ProtectionDomain;
import java.util.Collections;
import java.util.Enumeration;
+import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import org.apache.aries.cdi.spi.loader.SpiLoader;
import org.osgi.framework.Bundle;
-public class BundleClassLoader extends URLClassLoader {
-
- public BundleClassLoader(Bundle[] bundles) {
- super(new URL[0]);
+public class BundleClassLoader extends SpiLoader {
- if (bundles.length == 0) {
+ public BundleClassLoader(List<Bundle> bundles) {
+ if (bundles.isEmpty()) {
throw new IllegalArgumentException(
"At least one bundle is required");
}
@@ -53,6 +57,9 @@ public class BundleClassLoader extends URLClassLoader {
@Override
public Enumeration<URL> findResources(String name) {
for (Bundle bundle : _bundles) {
+ if ((bundle.getState() & Bundle.UNINSTALLED) == Bundle.UNINSTALLED) {
+ continue;
+ }
try {
Enumeration<URL> enumeration = bundle.getResources(name);
@@ -62,12 +69,17 @@ public class BundleClassLoader extends URLClassLoader {
}
catch (IOException ioe) {
}
+
+ if (resourcePredicate != null && resourcePredicate.test(name)) {
+ return resourceFunction.apply(name);
+ }
}
return Collections.emptyEnumeration();
}
- public Bundle[] getBundles() {
+ @Override
+ public List<Bundle> getBundles() {
return _bundles;
}
@@ -82,11 +94,34 @@ public class BundleClassLoader extends URLClassLoader {
}
@Override
+ public BundleClassLoader handleResources(
+ Predicate<String> predicate, Function<String, Enumeration<URL>> function) {
+
+ resourcePredicate = requireNonNull(predicate);
+ resourceFunction = requireNonNull(function);
+
+ return this;
+ }
+
+ @Override
+ public BundleClassLoader findClass(
+ Predicate<String> predicate, Function<String, Class<?>> function) {
+
+ classPredicate = requireNonNull(predicate);
+ classFunction = requireNonNull(function);
+
+ return this;
+ }
+
+ @Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Object classLoadingLock = getClassLoadingLock(name);
synchronized (classLoadingLock) {
for (Bundle bundle : _bundles) {
+ if ((bundle.getState() & Bundle.UNINSTALLED) == Bundle.UNINSTALLED) {
+ continue;
+ }
try {
return bundle.loadClass(name);
}
@@ -95,6 +130,10 @@ public class BundleClassLoader extends URLClassLoader {
}
}
+ if (classPredicate != null && classPredicate.test(name)) {
+ return classFunction.apply(name);
+ }
+
throw new ClassNotFoundException(name);
}
}
@@ -122,7 +161,62 @@ public class BundleClassLoader extends URLClassLoader {
}
}
- private final Bundle[] _bundles;
+ @Override
+ public Class<?> getOrRegister(final String proxyClassName, final byte[] proxyBytes,
+ final Package pck, final ProtectionDomain protectionDomain) {
+ final String key = proxyClassName.replace('/', '.');
+ Class<?> existing = _cache.get(key);
+ if (existing == null) {
+ Object classLoadingLock = getClassLoadingLock(key);
+ synchronized (classLoadingLock) {
+ existing = _cache.get(key);
+ if (existing == null) {
+ definePackageFor(pck, protectionDomain);
+ existing = super.defineClass(proxyClassName, proxyBytes, 0, proxyBytes.length);
+ resolveClass(existing);
+ _cache.put(key, existing);
+ }
+ }
+ }
+ return existing;
+ }
+
+ private void definePackageFor(final Package model, final ProtectionDomain protectionDomain) {
+ if (model == null) {
+ return;
+ }
+ if (getPackage(model.getName()) == null) {
+ if (model.isSealed() && protectionDomain != null &&
+ protectionDomain.getCodeSource() != null &&
+ protectionDomain.getCodeSource().getLocation() != null) {
+ definePackage(
+ model.getName(),
+ model.getSpecificationTitle(),
+ model.getSpecificationVersion(),
+ model.getSpecificationVendor(),
+ model.getImplementationTitle(),
+ model.getImplementationVersion(),
+ model.getImplementationVendor(),
+ protectionDomain.getCodeSource().getLocation());
+ } else {
+ definePackage(
+ model.getName(),
+ model.getSpecificationTitle(),
+ model.getSpecificationVersion(),
+ model.getSpecificationVendor(),
+ model.getImplementationTitle(),
+ model.getImplementationVersion(),
+ model.getImplementationVendor(),
+ null);
+ }
+ }
+ }
+
+ private final List<Bundle> _bundles;
private final ConcurrentMap<String, Class<?>> _cache = new ConcurrentHashMap<>();
+ private volatile Predicate<String> classPredicate;
+ private volatile Function<String, Class<?>> classFunction;
+ private volatile Function<String, Enumeration<URL>> resourceFunction;
+ private volatile Predicate<String> resourcePredicate;
}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java
deleted file mode 100644
index 621ac34..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * 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.loader;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.resources.spi.ResourceLoadingException;
-import org.jboss.weld.serialization.spi.ProxyServices;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.namespace.PackageNamespace;
-import org.osgi.framework.wiring.BundleCapability;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-
-public class BundleResourcesLoader implements ProxyServices, ResourceLoader {
-
- public static class Builder {
-
- public Builder(Bundle bundle, Bundle extenderBundle) {
- this.bundle = bundle;
- this.extenderBundle = extenderBundle;
- }
-
- public Builder add(Bundle bundle) {
- additionalBundles.add(bundle);
- return this;
- }
-
- public BundleResourcesLoader build() {
- return new BundleResourcesLoader(bundle, extenderBundle, additionalBundles);
- }
-
- private final Bundle bundle;
- private final Bundle extenderBundle;
- private final List<Bundle> additionalBundles = new ArrayList<>();
- }
-
- BundleResourcesLoader(Bundle bundle, Bundle extenderBundle, List<Bundle> additionalBundles) {
- BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class);
-
- List<Bundle> bundles = new ArrayList<>();
-
- bundles.add(bundle);
- bundles.add(extenderBundle);
-
- List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE);
-
- for (BundleWire bundleWire : requiredWires) {
- BundleCapability capability = bundleWire.getCapability();
- Map<String, Object> attributes = capability.getAttributes();
- String packageName = (String)attributes.get(PackageNamespace.PACKAGE_NAMESPACE);
- if (!packageName.startsWith("org.jboss.weld.")) {
- continue;
- }
-
- Bundle wireBundle = bundleWire.getProvider().getBundle();
- if (!bundles.contains(wireBundle)) {
- bundles.add(wireBundle);
- }
- }
-
- bundles.addAll(additionalBundles);
-
- _classLoader = new BundleClassLoader(bundles.toArray(new Bundle[0]));
- }
-
-
- @Override
- public void cleanup() {
- }
-
- @Override
- public Class<?> classForName(String className) {
- try {
- return _classLoader.loadClass(className);
- }
- catch (ClassNotFoundException e) {
- throw new ResourceLoadingException(ERROR_LOADING_CLASS + className, e);
- }
- catch (LinkageError e) {
- throw new ResourceLoadingException(ERROR_LOADING_CLASS + className, e);
- }
- catch (TypeNotPresentException e) {
- throw new ResourceLoadingException(ERROR_LOADING_CLASS + className, e);
- }
- }
-
- @Override
- public ClassLoader getClassLoader(Class<?> proxiedBeanType) {
- return _classLoader;
- }
-
- @Override
- public Class<?> loadBeanClass(String className) {
- return classForName(className);
- }
-
- @Override
- public URL getResource(String name) {
- return _classLoader.getResource(name);
- }
-
- @Override
- public Collection<URL> getResources(String name) {
- try {
- return Collections.list(_classLoader.getResources(name));
- }
- catch (IOException e) {
- return Collections.emptyList();
- }
- }
-
- private static final String ERROR_LOADING_CLASS = "Error loading class ";
-
- private final ClassLoader _classLoader;
-
-}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
index 4933d14..f39a5ff 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
@@ -18,9 +18,6 @@ import java.net.URL;
import java.util.Collection;
import java.util.Map;
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.xml.BeansXmlParser;
-
public class BeansModel {
public BeansModel(
@@ -28,22 +25,14 @@ public class BeansModel {
Collection<URL> beanDescriptorURLs) {
_beans = beans;
-
- BeansXml beansXml = BeansXml.EMPTY_BEANS_XML;
-
- if (!beanDescriptorURLs.isEmpty()) {
- BeansXmlParser beansXmlParser = new BeansXmlParser();
- beansXml = beansXmlParser.parse(beanDescriptorURLs);
- }
-
- _beansXml = beansXml;
+ _beansXml = beanDescriptorURLs;
}
public Collection<String> getBeanClassNames() {
return _beans.keySet();
}
- public BeansXml getBeansXml() {
+ public Collection<URL> getBeansXml() {
return _beansXml;
}
@@ -60,6 +49,6 @@ public class BeansModel {
}
private final Map<String, OSGiBean> _beans;
- private final BeansXml _beansXml;
+ private final Collection<URL> _beansXml;
}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java
index 59c691d..2b7deb3 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java
@@ -26,7 +26,6 @@ import java.util.Set;
import org.osgi.service.cdi.ConfigurationPolicy;
import org.osgi.service.cdi.MaximumCardinality;
import org.osgi.service.cdi.annotations.PID;
-import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
public class ComponentPropertiesModel {
@@ -98,7 +97,7 @@ public class ComponentPropertiesModel {
return _injectionPointType;
}
- public ConfigurationTemplateDTO toDTO() {
+ public ExtendedConfigurationTemplateDTO toDTO() {
ExtendedConfigurationTemplateDTO dto = new ExtendedConfigurationTemplateDTO();
dto.beanClass = _beanClass;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
index c350c0c..dc3b430 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
@@ -14,19 +14,21 @@
package org.apache.aries.cdi.container.internal.provider;
+import static java.util.Optional.ofNullable;
+
import java.lang.annotation.Annotation;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
-import java.util.Optional;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;
import javax.enterprise.util.TypeLiteral;
-import org.apache.aries.cdi.container.internal.Activator;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleReference;
+import org.osgi.framework.Constants;
public class CDIProvider implements javax.enterprise.inject.spi.CDIProvider {
@@ -44,22 +46,24 @@ public class CDIProvider implements javax.enterprise.inject.spi.CDIProvider {
@Override
public BeanManager getBeanManager() {
- ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-
- if (contextClassLoader instanceof BundleReference) {
- BundleReference br = (BundleReference)contextClassLoader;
-
- Bundle bundle = br.getBundle();
-
- return Optional.ofNullable(
- Activator.ccr.getContainerState(bundle)
- ).map(
- cs -> cs.beanManager()
- ).orElse(null);
- }
-
- throw new IllegalStateException(
- "This method can only be used when the Thread context class loader has been set to a Bundle's classloader.");
+ Bundle bundle = ofNullable(
+ Thread.currentThread().getContextClassLoader()
+ ).map(BundleReference.class::cast).map(BundleReference::getBundle).orElseThrow(
+ () -> new IllegalStateException(
+ "No Bundle found for Thread.ContextClassLoader " + Thread.currentThread())
+ );
+
+ return Arrays.stream(bundle.getRegisteredServices()).filter(
+ sr -> ofNullable(
+ sr.getProperty(Constants.OBJECTCLASS)
+ ).map(String[].class::cast).map(Arrays::asList).filter(
+ list -> list.contains(BeanManager.class.getName())
+ ).isPresent()
+ ).findFirst().map(
+ bundle.getBundleContext()::getService
+ ).map(BeanManager.class::cast).orElseThrow(
+ () -> new IllegalStateException("No BeanManager service for bundle " + bundle)
+ );
}
@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java
index e4facbe..e2b7035 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java
@@ -14,6 +14,8 @@
package org.apache.aries.cdi.container.internal.util;
+import static org.apache.aries.cdi.container.internal.util.Reflection.*;
+
import java.lang.annotation.Annotation;
import java.lang.reflect.Executable;
import java.lang.reflect.Parameter;
@@ -46,7 +48,6 @@ import javax.inject.Named;
import javax.inject.Qualifier;
import javax.inject.Scope;
-import org.jboss.weld.util.Types;
import org.osgi.service.cdi.ServiceScope;
import org.osgi.service.cdi.annotations.Service;
import org.osgi.service.cdi.annotations.ServiceInstance;
@@ -94,8 +95,7 @@ public class Annotates {
}
else if (instance instanceof Annotated) {
Annotated annotated = (Annotated)instance;
-
- declaringClass = Types.getRawTypes(new Type[] {annotated.getBaseType()})[0];
+ declaringClass = getRawType(annotated.getBaseType());
}
else if (instance instanceof ProcessManagedBean) {
ProcessManagedBean<?> bean = (ProcessManagedBean<?>)instance;
@@ -256,9 +256,7 @@ public class Annotates {
}
public static List<String> serviceClassNames(Annotated annotated) {
- return serviceClasses(annotated).stream().map(
- st -> st.getName()
- ).sorted().collect(Collectors.toList());
+ return serviceClasses(annotated).stream().map(Class::getName).sorted().collect(Collectors.toList());
}
public static ServiceScope serviceScope(Annotated annotated) {
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java
index fbc8be2..66ef70b 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java
@@ -60,7 +60,7 @@
}
)
@Capability(
- attribute = "register:=javax.enterprise.inject.se.SeContainerInitializer",
+ attribute = "register:=org.apache.aries.cdi.container.internal.provider.SeContainerInitializer",
namespace = "osgi.serviceloader",
name = "javax.enterprise.inject.se.SeContainerInitializer",
uses = {
@@ -69,7 +69,7 @@
}
)
@Capability(
- attribute = "register:=javax.enterprise.inject.spi.CDIProvider",
+ attribute = "register:=org.apache.aries.cdi.container.internal.provider.CDIProvider",
namespace = "osgi.serviceloader",
name = "javax.enterprise.inject.spi.CDIProvider",
uses = {
@@ -82,6 +82,11 @@
namespace = ExtenderNamespace.EXTENDER_NAMESPACE,
name = "osgi.serviceloader.registrar"
)
+@Requirement(
+ namespace = ServiceNamespace.SERVICE_NAMESPACE,
+ filter = "(&(objectClass=javax.enterprise.inject.se.SeContainerInitializer)(aries.cdi.spi=*))",
+ effective = "active"
+)
package org.apache.aries.cdi.container;
import org.osgi.annotation.bundle.Capability;
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
index 74b70db..2170176 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
@@ -14,14 +14,19 @@
package org.apache.aries.cdi.container.internal.phase;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
+import javax.enterprise.inject.se.SeContainerInitializer;
+
import org.apache.aries.cdi.container.internal.container.CheckedCallback;
import org.apache.aries.cdi.container.internal.container.ConfigurationListener;
import org.apache.aries.cdi.container.internal.container.ContainerBootstrap;
@@ -35,7 +40,9 @@ import org.apache.aries.cdi.container.internal.util.Logs;
import org.apache.aries.cdi.container.test.BaseCDIBundleTest;
import org.apache.aries.cdi.container.test.TestUtil;
import org.apache.aries.cdi.container.test.beans.FooService;
+import org.junit.Ignore;
import org.junit.Test;
+import org.osgi.framework.ServiceObjects;
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.namespace.extender.ExtenderNamespace;
import org.osgi.service.cdi.CDIConstants;
@@ -47,6 +54,7 @@ import org.osgi.util.tracker.ServiceTracker;
public class ContainerBootstrapTest extends BaseCDIBundleTest {
+ @Ignore
@Test
public void test_publishServices() throws Exception {
Map<String, Object> attributes = new HashMap<>();
@@ -73,8 +81,11 @@ public class ContainerBootstrapTest extends BaseCDIBundleTest {
componentDTO.instances = new CopyOnWriteArrayList<>();
componentDTO.template = containerState.containerDTO().template.components.get(0);
+ @SuppressWarnings("unchecked")
+ ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> serviceTracker = mock(ServiceTracker.class);
+
ContainerBootstrap containerBootstrap = new ContainerBootstrap(
- containerState,
+ containerState, serviceTracker,
new ConfigurationListener.Builder(containerState),
new SingleComponent.Builder(containerState, null),
new FactoryComponent.Builder(containerState, null));
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java
index b4d4892..4e4b7fd 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java
@@ -14,10 +14,12 @@
package org.apache.aries.cdi.container.internal.phase;
+import static java.util.Collections.singletonList;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.Arrays;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -60,7 +62,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
assertNotNull(containerDTO.template);
List<ComponentTemplateDTO> components = TestUtil.sort(
- containerDTO.template.components, (a, b) -> a.name.compareTo(b.name));
+ containerDTO.template.components, Comparator.comparing(a -> a.name));
assertEquals(2, components.size());
{
@@ -134,7 +136,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
assertNotNull(containerDTO.template);
List<ComponentTemplateDTO> components = TestUtil.sort(
- containerDTO.template.components, (a, b) -> a.name.compareTo(b.name));
+ containerDTO.template.components, Comparator.comparing(a -> a.name));
assertEquals(3, components.size());
{
@@ -175,7 +177,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
ActivationTemplateDTO at = ct.activations.get(0);
assertEquals(Maps.of(), at.properties);
assertEquals(ServiceScope.SINGLETON, at.scope);
- assertEquals(Arrays.asList("org.apache.aries.cdi.container.test.beans.Foo"), at.serviceClasses);
+ assertEquals(singletonList("org.apache.aries.cdi.container.test.beans.Foo"), at.serviceClasses);
}
assertEquals(2, ct.beans.size());
@@ -219,7 +221,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
assertNotNull(containerDTO.template);
List<ComponentTemplateDTO> components = TestUtil.sort(
- containerDTO.template.components, (a, b) -> a.name.compareTo(b.name));
+ containerDTO.template.components, Comparator.comparing(a -> a.name));
assertEquals(3, components.size());
{ // component "barService"
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java
deleted file mode 100644
index 0558319..0000000
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * 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.test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.jboss.weld.bootstrap.api.ServiceRegistry;
-import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.ejb.spi.EjbDescriptor;
-
-public class MockBeanDeploymentArchive implements BeanDeploymentArchive {
-
- public MockBeanDeploymentArchive(String id, String... beanClasses) {
- _id = id;
- _beanClasses = Arrays.asList(beanClasses);
- }
-
- @Override
- public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() {
- return Collections.emptyList();
- }
-
- @Override
- public Collection<String> getBeanClasses() {
- return _beanClasses;
- }
-
- @Override
- public BeansXml getBeansXml() {
- return BeansXml.EMPTY_BEANS_XML;
- }
-
- @Override
- public Collection<EjbDescriptor<?>> getEjbs() {
- return Collections.emptyList();
- }
-
- @Override
- public ServiceRegistry getServices() {
- return _services;
- }
-
- @Override
- public String getId() {
- return _id;
- }
-
- private final List<String> _beanClasses;
- private final String _id;
- private final ServiceRegistry _services = new SimpleServiceRegistry();
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java
deleted file mode 100644
index 331b726..0000000
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * 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.test;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.Extension;
-
-import org.apache.aries.cdi.container.internal.container.ContainerDeployment;
-import org.apache.aries.cdi.container.internal.container.ContainerEnvironment;
-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.junit.Assert;
-
-public class MockCdiContainer implements AutoCloseable {
-
- public MockCdiContainer(String name, String... beanClasses) {
- this(name, Collections.emptyList(), beanClasses);
- }
-
- public MockCdiContainer(String name, List<Metadata<Extension>> extensions, String... beanClasses) {
- _bda = new MockBeanDeploymentArchive(name, beanClasses);
-
- Deployment deployment = new ContainerDeployment(extensions, _bda);
-
- WeldBootstrap bootstrap = new WeldBootstrap();
-
- bootstrap.startExtensions(extensions);
- bootstrap.startContainer(new ContainerEnvironment(), deployment);
- bootstrap.startInitialization();
- bootstrap.deployBeans();
- bootstrap.validateBeans();
- bootstrap.endInitialization();
-
- _bootstrap = bootstrap;
- }
-
- @Override
- public void close() {
- _bootstrap.shutdown();
- }
-
- public Bean<?> getBean(Class<?> clazz) {
- final BeanManager managerImpl = getBeanManager();
-
- Set<javax.enterprise.inject.spi.Bean<?>> beans =
- managerImpl.getBeans(clazz, Any.Literal.INSTANCE);
-
- Assert.assertFalse(beans.isEmpty());
-
- return managerImpl.resolve(beans);
- }
-
- public BeanManager getBeanManager() {
- if (_beanManager != null) {
- return _beanManager;
- }
-
- return _beanManager = _bootstrap.getManager(_bda);
- }
-
- public WeldBootstrap getBootstrap() {
- return _bootstrap;
- }
-
- private final BeanDeploymentArchive _bda;
- private BeanManager _beanManager;
- private final WeldBootstrap _bootstrap;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java
index 413062b..edf0c55 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java
@@ -28,8 +28,6 @@ import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Qualifier;
-import org.jboss.weld.exceptions.IllegalArgumentException;
-
public class MockInjectionPoint implements InjectionPoint {
public MockInjectionPoint(AnnotatedElement annotatedElement) {
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java
index 293a4e9..5da1cd3 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java
@@ -41,8 +41,6 @@ import org.apache.aries.cdi.container.internal.model.BeansModel;
import org.apache.aries.cdi.container.internal.util.Filters;
import org.apache.aries.cdi.container.internal.util.Logs;
import org.apache.aries.cdi.container.internal.util.Sfl4jLogger;
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.serialization.spi.ProxyServices;
import org.mockito.stubbing.Answer;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
@@ -71,7 +69,7 @@ import org.osgi.util.tracker.ServiceTracker;
public class TestUtil {
public static <T extends Comparable<T>> List<T> sort(Collection<T> set) {
- return sort(set, (c1, c2) -> c1.getClass().getName().compareTo(c2.getClass().getName()));
+ return sort(set, Comparator.comparing(c -> c.getClass().getName()));
}
public static <T> List<T> sort(Collection<T> set, Comparator<T> comparator) {
@@ -126,12 +124,6 @@ public class TestUtil {
public BeansModel beansModel() {
return beansModel;
}
-
- @Override
- public <T extends ResourceLoader & ProxyServices> T loader() {
- return null;
- }
-
};
}