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/23 20:42:08 UTC

[aries-cdi] branch rotty3000/cdi-spi updated: better SPI

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


The following commit(s) were added to refs/heads/rotty3000/cdi-spi by this push:
     new 938d0e0  better SPI
938d0e0 is described below

commit 938d0e08d3e0483f6b1fa6d42c49e7a74f7e8f3c
Author: Raymond Augé <ro...@apache.org>
AuthorDate: Sat Nov 23 15:41:39 2019 -0500

    better SPI
    
    Signed-off-by: Raymond Augé <ro...@apache.org>
---
 README.md                                          |  19 +-
 .../aries/cdi/container/internal/Activator.java    |  24 +-
 .../internal/container/ContainerBootstrap.java     |  86 ++++---
 .../internal/container/RuntimeExtension.java       |   1 -
 .../cdi/container/internal/util/Annotates.java     |   2 +-
 .../aries/cdi/container/internal/util/Maps.java    |  47 ++--
 .../apache/aries/cdi/container/package-info.java   |   2 +-
 .../internal/phase/ContainerBootstrapTest.java     |   5 +-
 .../java/org/apache/aries/cdi/owb/Activator.java   |  13 +-
 .../aries/cdi/owb/OSGiDefiningClassService.java    |   1 +
 ...alizer.java => OWBCDIContainerInitializer.java} | 111 ++------
 ...java => OWBCDIContainerInitializerFactory.java} |  18 +-
 .../cdi/owb/OsgiApplicationBoundaryService.java    |  44 ++--
 .../org/apache/aries/cdi/owb/package-info.java     |   5 +-
 .../aries/cdi/spi/CDIContainerInitializer.java     |  81 ++++++
 .../main/java/org/apache/aries/cdi/spi/Keys.java   |  41 ---
 .../java/org/apache/aries/cdi/weld/Activator.java  |  14 +-
 .../cdi/weld/WeldCDIContainerInitializer.java      | 156 ++++++++++++
 ...ava => WeldCDIContainerInitializerFactory.java} |  19 +-
 .../aries/cdi/weld/WeldSeContainerInitializer.java | 280 ---------------------
 .../org/apache/aries/cdi/weld/package-info.java    |   5 +-
 21 files changed, 417 insertions(+), 557 deletions(-)

diff --git a/README.md b/README.md
index 0f607ab..892535d 100644
--- a/README.md
+++ b/README.md
@@ -188,24 +188,7 @@ The requirements to satisfy this SPI are quite simple:
 
 - Aries CDI Extender requires:
 
-  -  a **prototype scoped** service that implements `javax.enterprise.inject.se.SeContainerInitializer`
-
-  - this service must have a service property `aries.cdi.spi`  whose value is not important but the recommendation is a human readable name of the implementation
-
-  - Aries CDI will pass two values via the properties methods of `javax.enterprise.inject.se.SeContainerInitializer` as defined by `org.apache.aries.cdi.spi.Keys`
-
-  - the  `SeContainerInitializer` will be called like this:
-
-    ```java
-    			_seContainer = _seContainerInitializerInstance
-    				.setClassLoader((org.apache.aries.cdi.spi.loader.SpiLoader)spiLoader)
-    				.addBeanClasses(classes)
-    				.setProperties(properties)
-    				.addProperty(BEANS_XML_PROPERTY, containerState.beansModel().getBeansXml())
-    				.addProperty(BUNDLECONTEXT_PROPERTY, bundle().getBundleContext())
-    				.addExtensions(extensions)
-    				.initialize();
-    ```
+  -  a **prototype scoped** service that implements `org.apache.aries.cdi.spi.CDIContainerInitializer`
 
   - The behaviour of this container should be to start the `@ApplicationScoped` context immediately. This allows for services from the container component to be published right away.
 
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 ca885f1..5d416d7 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,7 +14,6 @@
 
 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;
@@ -30,8 +29,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 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;
 import org.apache.aries.cdi.container.internal.container.ConfigurationListener;
@@ -45,6 +42,7 @@ import org.apache.aries.cdi.container.internal.model.FactoryComponent;
 import org.apache.aries.cdi.container.internal.model.SingleActivator;
 import org.apache.aries.cdi.container.internal.model.SingleComponent;
 import org.apache.aries.cdi.container.internal.util.Logs;
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.apache.felix.utils.extender.AbstractExtender;
 import org.apache.felix.utils.extender.Extension;
 import org.osgi.annotation.bundle.Header;
@@ -80,31 +78,31 @@ public class Activator extends AbstractExtender {
 	private final Logger _log;
 	private final Logs _logs;
 	private final PromiseFactory _promiseFactory;
-	private final ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> _containerTracker;
+	private final ServiceTracker<CDIContainerInitializer, ServiceObjects<CDIContainerInitializer>> _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>>() {
+			bundleContext, CDIContainerInitializer.class,
+			new ServiceTrackerCustomizer<CDIContainerInitializer, ServiceObjects<CDIContainerInitializer>>() {
 
 				@Override
-				public ServiceObjects<SeContainerInitializer> addingService(
-						ServiceReference<SeContainerInitializer> reference) {
+				public ServiceObjects<CDIContainerInitializer> addingService(
+					ServiceReference<CDIContainerInitializer> reference) {
+
 					return bundleContext.getServiceObjects(reference);
 				}
 
 				@Override
-				public void modifiedService(ServiceReference<SeContainerInitializer> reference,
-						ServiceObjects<SeContainerInitializer> service) {
+				public void modifiedService(ServiceReference<CDIContainerInitializer> reference,
+					ServiceObjects<CDIContainerInitializer> service) {
 				}
 
 				@Override
-				public void removedService(ServiceReference<SeContainerInitializer> reference,
-						ServiceObjects<SeContainerInitializer> service) {
+				public void removedService(ServiceReference<CDIContainerInitializer> reference,
+					ServiceObjects<CDIContainerInitializer> service) {
 				}
 			}
 		);
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 5b63569..c2a543a 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,15 +14,12 @@
 
 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.net.URL;
 import java.util.ArrayList;
+import java.util.Dictionary;
 import java.util.List;
 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;
@@ -32,8 +29,12 @@ 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.Maps;
 import org.apache.aries.cdi.container.internal.util.Syncro;
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceObjects;
+import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
 import org.osgi.service.log.Logger;
 import org.osgi.util.tracker.ServiceTracker;
 
@@ -41,7 +42,7 @@ public class ContainerBootstrap extends Phase {
 
 	public ContainerBootstrap(
 		ContainerState containerState,
-		ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> containerTracker,
+		ServiceTracker<CDIContainerInitializer, ServiceObjects<CDIContainerInitializer>> containerTracker,
 		ConfigurationListener.Builder configurationBuilder,
 		SingleComponent.Builder singleBuilder,
 		FactoryComponent.Builder factoryBuilder) {
@@ -55,22 +56,22 @@ public class ContainerBootstrap extends Phase {
 		_log = containerState.containerLogs().getLogger(getClass());
 
 		_serviceObjects = _containerTracker.getService();
-		_seContainerInitializerInstance = _serviceObjects.getService();
+		_initializer = _serviceObjects.getService();
 	}
 
 	@Override
 	public boolean close() {
 		try (Syncro syncro = _lock.open()) {
-			if (_seContainer != null) {
+			if (_containerInstance != null) {
 				_log.debug(l -> l.debug("CCR container shutdown for {}", bundle()));
-				_seContainer.close();
+				_containerInstance.close();
 				try {
-					_serviceObjects.ungetService(_seContainerInitializerInstance);
+					_serviceObjects.ungetService(_initializer);
 				}
 				catch (Throwable t) {
 					_log.trace(l -> l.trace("CCR Failure in returning initializer instance on {}", bundle(), t));
 				}
-				_seContainer = null;
+				_containerInstance = null;
 			}
 
 			return true;
@@ -95,7 +96,7 @@ public class ContainerBootstrap extends Phase {
 				return false;
 			}
 
-			if (_seContainer != null) {
+			if (_containerInstance != null) {
 				return true;
 			}
 
@@ -105,14 +106,18 @@ public class ContainerBootstrap extends Phase {
 
 			_log.debug(log -> log.debug("CCR container startup for {}", bundle()));
 
-			_seContainer = _seContainerInitializerInstance
-				// always use a new class loader
-				.setClassLoader(new BundleClassLoader(containerState.bundle(), containerState.extenderBundle()))
+			BundleClassLoader loader = new BundleClassLoader(containerState.bundle(), containerState.extenderBundle());
+
+			processExtensions(loader, _initializer);
+
+			containerState.containerComponentTemplateDTO().properties.forEach(_initializer::addProperty);
+
+			_containerInstance = _initializer
 				.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]))
+				.addBeanXmls(containerState.beansModel().getBeansXml().toArray(new URL[0]))
+				.setBundleContext(bundle().getBundleContext())
+				// always use a new class loader
+				.setClassLoader(loader)
 				.initialize();
 
 			return true;
@@ -124,33 +129,42 @@ public class ContainerBootstrap extends Phase {
 		return Op.of(Mode.OPEN, Type.CONTAINER_BOOTSTRAP, containerState.id());
 	}
 
-	protected List<Extension> getExtensions() {
-		List<Extension> extensions = new ArrayList<>();
-
+	protected void processExtensions(BundleClassLoader loader, CDIContainerInitializer initializer) {
 		// Add the internal extensions
-		extensions.add(new BundleContextExtension(containerState.bundleContext()));
-		extensions.add(new RuntimeExtension(containerState, _configurationBuilder, _singleBuilder, _factoryBuilder));
-		extensions.add(new LoggerExtension(containerState));
+		initializer.addExtensions(new BundleContextExtension(containerState.bundleContext()));
+		initializer.addExtensions(new RuntimeExtension(containerState, _configurationBuilder, _singleBuilder, _factoryBuilder));
+		initializer.addExtensions(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);
+		ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(initializer::addExtensions);
+
+		List<Dictionary<String, Object>> serviceProperties = new ArrayList<>();
 
 		// Add external extensions
-		containerState.containerDTO().extensions.stream().map(
-			ExtendedExtensionDTO.class::cast
-		).map(
-			e -> e.extension.getService()
-		).forEach(extensions::add);
+		for (ExtensionDTO extensionDTO : containerState.containerDTO().extensions) {
+			ExtendedExtensionDTO extendedExtensionDTO = (ExtendedExtensionDTO)extensionDTO;
+
+			initializer.addExtensions(extendedExtensionDTO.extension.getService());
+
+			Bundle extensionBundle = extendedExtensionDTO.extension.getServiceReference().getBundle();
+			if (!loader.getBundles().contains(extensionBundle)) {
+				loader.getBundles().add(extensionBundle);
+			}
+
+			// Collect the service properties of the extension
+			serviceProperties.add(extendedExtensionDTO.extension.getServiceReference().getProperties());
+		}
 
-		return extensions;
+		// Losslessly merge all the properties together and then pass them to the initializer
+		Maps.merge(serviceProperties).forEach(initializer::addProperty);
 	}
 
-	private volatile SeContainer _seContainer;
-	private final ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> _containerTracker;
+	private volatile AutoCloseable _containerInstance;
+	private final ServiceTracker<CDIContainerInitializer, ServiceObjects<CDIContainerInitializer>> _containerTracker;
 	private final ConfigurationListener.Builder _configurationBuilder;
 	private final FactoryComponent.Builder _factoryBuilder;
-	private final SeContainerInitializer _seContainerInitializerInstance;
-	private final ServiceObjects<SeContainerInitializer> _serviceObjects;
+	private final CDIContainerInitializer _initializer;
+	private final ServiceObjects<CDIContainerInitializer> _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/RuntimeExtension.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
index 02d44ab..e5927c2 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
@@ -460,7 +460,6 @@ public class RuntimeExtension implements Extension {
 		}
 	}
 
-	@SuppressWarnings({ "rawtypes", "unchecked" })
 	private void registerServiceHandleFailure(
 		ExtendedComponentInstanceDTO componentInstance,
 		ExtendedActivationTemplateDTO activationTemplate,
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 e2b7035..93da73a 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,7 +14,7 @@
 
 package org.apache.aries.cdi.container.internal.util;
 
-import static org.apache.aries.cdi.container.internal.util.Reflection.*;
+import static org.apache.aries.cdi.container.internal.util.Reflection.getRawType;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Executable;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Maps.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Maps.java
index ca61323..5b457a0 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Maps.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Maps.java
@@ -14,19 +14,23 @@
 
 package org.apache.aries.cdi.container.internal.util;
 
+import static java.util.Collections.list;
+import static java.util.Objects.requireNonNull;
+
 import java.lang.annotation.Annotation;
+import java.util.AbstractMap;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.osgi.service.cdi.annotations.BeanPropertyType;
 import org.osgi.util.converter.TypeReference;
@@ -51,13 +55,14 @@ public class Maps {
 		}
 	}
 
+	public static <T> Stream<Map.Entry<String, T>> streamOf(Dictionary<String, T> dictionary) {
+		return list(dictionary.keys()).stream().map(key -> new AbstractMap.SimpleEntry<>(key, dictionary.get(key)));
+	}
+
 	public static Map<String, Object> of(Dictionary<String, ?> dict) {
 		Map<String, Object> map = new HashMap<>();
 
-		for (Enumeration<String> enu = dict.keys(); enu.hasMoreElements();) {
-			String key = enu.nextElement();
-			map.put(key, dict.get(key));
-		}
+		streamOf(dict).forEach(e -> map.put(e.getKey(), e.getValue()));
 
 		return map;
 	}
@@ -65,11 +70,7 @@ public class Maps {
 	public static Dictionary<String, ?> dict(Map<String, Object> map) {
 		Dictionary<String, Object> dict = new Hashtable<>();
 
-		if (map != null) {
-			for (Entry<String, Object> entry : map.entrySet()) {
-				dict.put(entry.getKey(), entry.getValue());
-			}
-		}
+		requireNonNull(map).forEach(dict::put);
 
 		return dict;
 	}
@@ -100,15 +101,28 @@ public class Maps {
 	}
 
 	public static Map<String, Object> merge(Collection<Annotation> annotations) {
-		return annotations.stream().filter(
+		return merge(annotations.stream().filter(
 			ann -> Objects.nonNull(ann.annotationType().getAnnotation(BeanPropertyType.class))
 		).map(
 			ann -> Conversions.convert(ann).sourceAs(ann.annotationType()).to(new TypeReference<Map<String, Object>>() {})
-		).map(Map::entrySet).flatMap(Collection::stream).collect(
+		).map(Map::entrySet).flatMap(Collection::stream));
+	}
+
+	public static Map<String, Object> merge(List<Dictionary<String, Object>> dictionaries) {
+		return merge(dictionaries.stream().flatMap(Maps::streamOf));
+	}
+
+	@SafeVarargs
+	public static Map<String, Object> merge(Map<String, Object>... maps) {
+		return merge(Arrays.stream(maps).map(Map::entrySet).flatMap(Collection::stream));
+	}
+
+	public static Map<String, Object> merge(Stream<Map.Entry<String, Object>> mapEntries) {
+		return mapEntries.collect(
 			Collectors.toMap(
 				Map.Entry::getKey,
 				Map.Entry::getValue,
-				Maps::merge
+				Maps::mergeValues
 			)
 		);
 	}
@@ -122,10 +136,11 @@ public class Maps {
 		);
 	}
 
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	public static List<?> merge(Object a, Object b) {
+	@SuppressWarnings("unchecked")
+	public static List<?> mergeValues(Object a, Object b) {
 		List<?> aList = Conversions.convert(a).to(new TypeReference<List<?>>() {});
 		List<?> bList = Conversions.convert(b).to(new TypeReference<List<?>>() {});
+		@SuppressWarnings({ "rawtypes" })
 		List checkedList = Collections.checkedList(new ArrayList(), aList.get(0).getClass());
 		checkedList.addAll(aList);
 		checkedList.addAll(bList);
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 66ef70b..55ede24 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
@@ -84,7 +84,7 @@
 )
 @Requirement(
 	namespace = ServiceNamespace.SERVICE_NAMESPACE,
-	filter = "(&(objectClass=javax.enterprise.inject.se.SeContainerInitializer)(aries.cdi.spi=*))",
+	filter = "(objectClass=org.apache.aries.cdi.spi.CDIContainerInitializer)",
 	effective = "active"
 )
 package org.apache.aries.cdi.container;
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 2170176..24cc74a 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
@@ -25,8 +25,6 @@ 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;
@@ -40,6 +38,7 @@ 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.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.osgi.framework.ServiceObjects;
@@ -82,7 +81,7 @@ public class ContainerBootstrapTest extends BaseCDIBundleTest {
 		componentDTO.template = containerState.containerDTO().template.components.get(0);
 
 		@SuppressWarnings("unchecked")
-		ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> serviceTracker = mock(ServiceTracker.class);
+		ServiceTracker<CDIContainerInitializer, ServiceObjects<CDIContainerInitializer>> serviceTracker = mock(ServiceTracker.class);
 
 		ContainerBootstrap containerBootstrap = new ContainerBootstrap(
 			containerState, serviceTracker,
diff --git a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/Activator.java b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/Activator.java
index 8a17c96..7474276 100644
--- a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/Activator.java
+++ b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/Activator.java
@@ -22,9 +22,9 @@ import static org.osgi.service.cdi.CDIConstants.CDI_EXTENSION_PROPERTY;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
-import javax.enterprise.inject.se.SeContainerInitializer;
 import javax.enterprise.inject.spi.Extension;
 
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.osgi.annotation.bundle.Header;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
@@ -42,12 +42,11 @@ public class Activator implements BundleActivator {
 	public void start(BundleContext bundleContext) throws Exception {
 		System.setProperty("openwebbeans.web.sci.active", "false"); // we handle it ourself, disable this jetty feature
 		Dictionary<String, Object> properties = new Hashtable<>();
-		properties.put(SERVICE_DESCRIPTION, "Aries CDI - OpenWebBeans SeContainerInitializer Factory");
+		properties.put(SERVICE_DESCRIPTION, "Aries CDI - OpenWebBeans CDIContainerInitializer Factory");
 		properties.put(SERVICE_VENDOR, "Apache Software Foundation");
-		properties.put("aries.cdi.spi", "OpenWebBeans");
 
-		_seContainerInitializer = bundleContext.registerService(
-			SeContainerInitializer.class, new OWBSeContainerInitializerFactory(bundleContext), properties);
+		_containerInitializer = bundleContext.registerService(
+			CDIContainerInitializer.class, new OWBCDIContainerInitializerFactory(bundleContext), properties);
 
 		if (webEnabled) {
 			properties = new Hashtable<>();
@@ -62,13 +61,13 @@ public class Activator implements BundleActivator {
 
 	@Override
 	public void stop(BundleContext context) throws Exception {
-		_seContainerInitializer.unregister();
+		_containerInitializer.unregister();
 		if (_webExtension != null) {
 			_webExtension.unregister();
 		}
 	}
 
-	private ServiceRegistration<SeContainerInitializer> _seContainerInitializer;
+	private ServiceRegistration<CDIContainerInitializer> _containerInitializer;
 	private ServiceRegistration<Extension> _webExtension;
 
 }
diff --git a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OSGiDefiningClassService.java b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OSGiDefiningClassService.java
index 62c5e71..8186eb7 100644
--- a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OSGiDefiningClassService.java
+++ b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OSGiDefiningClassService.java
@@ -45,6 +45,7 @@ public class OSGiDefiningClassService implements DefiningClassService {
 	 * @return the proxy class instance.
 	 */
 	@Override
+	@SuppressWarnings("unchecked")
 	public <T> Class<T> defineAndLoad(final String name, final byte[] bytes, final Class<T> proxied) {
 		if (requiresUnsafe(proxied)) { // todo: today we don't really support that
 			final ClassLoader classLoader = proxied.getClassLoader();
diff --git a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBSeContainerInitializer.java b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBCDIContainerInitializer.java
similarity index 71%
rename from cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBSeContainerInitializer.java
rename to cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBCDIContainerInitializer.java
index f37abdb..97c46ac 100644
--- a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBSeContainerInitializer.java
+++ b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBCDIContainerInitializer.java
@@ -2,15 +2,12 @@ package org.apache.aries.cdi.owb;
 
 import static java.util.Collections.list;
 import static java.util.Objects.requireNonNull;
-import static org.apache.aries.cdi.spi.Keys.BEANS_XML_PROPERTY;
-import static org.apache.aries.cdi.spi.Keys.BUNDLECONTEXT_PROPERTY;
 
 import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -23,11 +20,11 @@ import java.util.Set;
 
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.se.SeContainer;
-import javax.enterprise.inject.se.SeContainerInitializer;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.util.TypeLiteral;
 
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.apache.aries.cdi.spi.loader.SpiLoader;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.config.WebBeansFinder;
@@ -46,115 +43,58 @@ import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 
-public class OWBSeContainerInitializer extends SeContainerInitializer {
+public class OWBCDIContainerInitializer extends CDIContainerInitializer {
 
-	public OWBSeContainerInitializer(BundleContext bundleContext) {
+	public OWBCDIContainerInitializer(BundleContext bundleContext) {
 		owbBundleContext = bundleContext;
 	}
 
 	@Override
-	public SeContainerInitializer addBeanClasses(Class<?>... classes) {
+	public CDIContainerInitializer addBeanClasses(Class<?>... classes) {
 		beanClasses.addAll(Arrays.asList(classes));
 		return this;
 	}
 
 	@Override
-	public SeContainerInitializer addPackages(Class<?>... packageClasses) {
-		// TODO Auto-generated method stub
+	public CDIContainerInitializer addBeanXmls(URL... beanXmls) {
+		beanDescriptorURLs.addAll(Arrays.asList(beanXmls));
 		return this;
 	}
 
 	@Override
-	public SeContainerInitializer addPackages(boolean scanRecursively, Class<?>... packageClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addPackages(Package... packages) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addPackages(boolean scanRecursively, Package... packages) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addExtensions(Extension... extensions) {
+	public CDIContainerInitializer addExtensions(Extension... extensions) {
 		this.extensions.addAll(Arrays.asList(extensions));
 		return this;
 	}
 
 	@Override
-	public SeContainerInitializer addExtensions(Class<? extends Extension>... extensions) {
-		this.extensionClasses.addAll(Arrays.asList(extensions));
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer enableInterceptors(Class<?>... interceptorClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer enableDecorators(Class<?>... decoratorClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer selectAlternatives(Class<?>... alternativeClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer selectAlternativeStereotypes(
-		Class<? extends Annotation>... alternativeStereotypeClasses) {
-
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addProperty(String key, Object value) {
+	public CDIContainerInitializer addProperty(String key, Object value) {
 		properties.putIfAbsent(key, value);
 		return this;
 	}
 
 	@Override
-	public SeContainerInitializer setProperties(Map<String, Object> properties) {
-		properties.putAll(properties);
+	public CDIContainerInitializer setBundleContext(BundleContext bundleContext) {
+		clientBundleContext = bundleContext;
 		return this;
 	}
 
 	@Override
-	public SeContainerInitializer disableDiscovery() {
-		// TODO Auto-generated method stub
+	public CDIContainerInitializer setClassLoader(SpiLoader spiLoader) {
+		this.spiLoader = spiLoader;
 		return this;
 	}
 
 	@Override
-	public SeContainerInitializer setClassLoader(ClassLoader classLoader) {
-		this.classLoader = (SpiLoader)classLoader;
-		return this;
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
 	public SeContainer initialize() {
-		requireNonNull(classLoader).handleResources(
+		requireNonNull(spiLoader).handleResources(
 			s -> (s != null) && s.startsWith("META-INF/openwebbeans/"),
 			this::getResources
 		).findClass(
 			s -> (s != null) && (s.startsWith("org.apache.webbeans.") || s.startsWith("sun.misc.")),
 			this::loadClass);
 
-		classLoader.getBundles().add(owbBundleContext.getBundle());
+		spiLoader.getBundles().add(owbBundleContext.getBundle());
 
 		BundleWiring bundleWiring = owbBundleContext.getBundle().adapt(BundleWiring.class);
 		List<BundleWire> requiredWires = bundleWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE);
@@ -168,8 +108,8 @@ public class OWBSeContainerInitializer extends SeContainerInitializer {
 			}
 
 			Bundle wireBundle = bundleWire.getProvider().getBundle();
-			if (!classLoader.getBundles().contains(wireBundle)) {
-				classLoader.getBundles().add(wireBundle);
+			if (!spiLoader.getBundles().contains(wireBundle)) {
+				spiLoader.getBundles().add(wireBundle);
 			}
 		}
 
@@ -177,9 +117,8 @@ public class OWBSeContainerInitializer extends SeContainerInitializer {
 		ClassLoader current = currentThread.getContextClassLoader();
 
 		try {
-			currentThread.setContextClassLoader(classLoader);
-			clientBundleContext = requireNonNull(BundleContext.class.cast(properties.get(BUNDLECONTEXT_PROPERTY)));
-			startObject = clientBundleContext;
+			currentThread.setContextClassLoader(spiLoader);
+			startObject = requireNonNull(clientBundleContext);
 
 			final Map<Class<?>, Object> services = new HashMap<>();
 			properties.setProperty(
@@ -188,13 +127,13 @@ public class OWBSeContainerInitializer extends SeContainerInitializer {
 
 			services.put(
 				OSGiDefiningClassService.ClassLoaders.class,
-				new OSGiDefiningClassService.ClassLoaders(current, classLoader));
+				new OSGiDefiningClassService.ClassLoaders(current, spiLoader));
 			services.put(
 				ApplicationBoundaryService.class,
-				new OsgiApplicationBoundaryService(current, classLoader));
+				new OsgiApplicationBoundaryService(current, spiLoader));
 			services.put(
 				ScannerService.class,
-				new CdiScannerService(beanClasses, Collection.class.cast(properties.get(BEANS_XML_PROPERTY))));
+				new CdiScannerService(beanClasses, beanDescriptorURLs));
 			services.put(BundleContext.class, clientBundleContext);
 
 			if (Activator.webEnabled) {
@@ -236,7 +175,7 @@ public class OWBSeContainerInitializer extends SeContainerInitializer {
 			};
 
 			final DefaultSingletonService singletonService = getSingletonService();
-			singletonService.register(classLoader, bootstrap);
+			singletonService.register(spiLoader, bootstrap);
 			final ContainerLifecycle lifecycle = bootstrap.getService(ContainerLifecycle.class);
 			lifecycle.startApplication(startObject);
 
@@ -275,11 +214,11 @@ public class OWBSeContainerInitializer extends SeContainerInitializer {
 	}
 
 	private volatile WebBeansContext bootstrap;
+	private final List<URL> beanDescriptorURLs = new ArrayList<>();
 	private volatile BundleContext clientBundleContext;
-	private volatile SpiLoader classLoader;
+	private volatile SpiLoader spiLoader;
 	private final Set<Class<?>> beanClasses = new HashSet<>();
 	private final List<Extension> extensions = new ArrayList<>();
-	private final List<Class<? extends Extension>> extensionClasses = new ArrayList<>();
 	private final BundleContext owbBundleContext;
 	private final Properties properties = new Properties();
 	private Object startObject;
@@ -294,7 +233,7 @@ public class OWBSeContainerInitializer extends SeContainerInitializer {
 			Thread currentThread = Thread.currentThread();
 			ClassLoader current = currentThread.getContextClassLoader();
 			try {
-				currentThread.setContextClassLoader(requireNonNull(classLoader));
+				currentThread.setContextClassLoader(requireNonNull(spiLoader));
 				bootstrap.getService(ContainerLifecycle.class).stopApplication(startObject);
 			}
 			finally {
diff --git a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBSeContainerInitializerFactory.java b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBCDIContainerInitializerFactory.java
similarity index 63%
rename from cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBSeContainerInitializerFactory.java
rename to cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBCDIContainerInitializerFactory.java
index 87e1b7c..db10ecd 100644
--- a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBSeContainerInitializerFactory.java
+++ b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OWBCDIContainerInitializerFactory.java
@@ -14,29 +14,31 @@
 
 package org.apache.aries.cdi.owb;
 
-import javax.enterprise.inject.se.SeContainerInitializer;
-
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.PrototypeServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 
-public class OWBSeContainerInitializerFactory implements PrototypeServiceFactory<SeContainerInitializer> {
+public class OWBCDIContainerInitializerFactory implements PrototypeServiceFactory<CDIContainerInitializer> {
 
-	public OWBSeContainerInitializerFactory(BundleContext bundleContext) {
+	public OWBCDIContainerInitializerFactory(BundleContext bundleContext) {
 		this.bundleContext = bundleContext;
 	}
 
 	@Override
-	public SeContainerInitializer getService(
-		Bundle bundle, ServiceRegistration<SeContainerInitializer> registration) {
+	public CDIContainerInitializer getService(
+		Bundle bundle,
+		ServiceRegistration<CDIContainerInitializer> registration) {
 
-		return new OWBSeContainerInitializer(bundleContext);
+		return new OWBCDIContainerInitializer(bundleContext);
 	}
 
 	@Override
 	public void ungetService(
-		Bundle bundle, ServiceRegistration<SeContainerInitializer> registration, SeContainerInitializer service) {
+		Bundle bundle,
+		ServiceRegistration<CDIContainerInitializer> registration,
+		CDIContainerInitializer service) {
 	}
 
 	private final BundleContext bundleContext;
diff --git a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OsgiApplicationBoundaryService.java b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OsgiApplicationBoundaryService.java
index a9da88f..b3985f9 100644
--- a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OsgiApplicationBoundaryService.java
+++ b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/OsgiApplicationBoundaryService.java
@@ -16,29 +16,29 @@ package org.apache.aries.cdi.owb;
 import org.apache.webbeans.spi.ApplicationBoundaryService;
 
 public class OsgiApplicationBoundaryService implements ApplicationBoundaryService {
-    private final ClassLoader bundleLoader;
-    private final ClassLoader loader;
+	private final ClassLoader bundleLoader;
+	private final ClassLoader loader;
 
-    public OsgiApplicationBoundaryService(final ClassLoader bundleLoader, final ClassLoader loader) {
-        this.bundleLoader = bundleLoader;
-        this.loader = loader;
-    }
+	public OsgiApplicationBoundaryService(final ClassLoader bundleLoader, final ClassLoader loader) {
+		this.bundleLoader = bundleLoader;
+		this.loader = loader;
+	}
 
-    @Override
-    public ClassLoader getApplicationClassLoader() {
-        return bundleLoader;
-    }
+	@Override
+	public ClassLoader getApplicationClassLoader() {
+		return bundleLoader;
+	}
 
-    @Override
-    public ClassLoader getBoundaryClassLoader(final Class aClass) {
-        final ClassLoader classToProxyCl = aClass.getClassLoader();
-        if (classToProxyCl == null || classToProxyCl == loader) {
-            return loader;
-        }
-        if (classToProxyCl == bundleLoader) {
-            return classToProxyCl;
-        }
-        // todo: refine if needed
-        return classToProxyCl;
-    }
+	@Override
+	public ClassLoader getBoundaryClassLoader(@SuppressWarnings("rawtypes") final Class aClass) {
+		final ClassLoader classToProxyCl = aClass.getClassLoader();
+		if (classToProxyCl == null || classToProxyCl == loader) {
+			return loader;
+		}
+		if (classToProxyCl == bundleLoader) {
+			return classToProxyCl;
+		}
+		// todo: refine if needed
+		return classToProxyCl;
+	}
 }
diff --git a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/package-info.java b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/package-info.java
index 063d4c7..5e523d8 100644
--- a/cdi-owb/src/main/java/org/apache/aries/cdi/owb/package-info.java
+++ b/cdi-owb/src/main/java/org/apache/aries/cdi/owb/package-info.java
@@ -13,10 +13,7 @@
  */
 
 @org.osgi.annotation.bundle.Capability(
-	attribute = {
-		"objectClass:List<String>=javax.enterprise.inject.se.SeContainerInitializer",
-		"aries.cdi.spi=OpenWebBeans"
-	},
+	attribute = "objectClass:List<String>=org.apache.aries.cdi.spi.CDIContainerInitializer",
 	namespace = org.osgi.namespace.service.ServiceNamespace.SERVICE_NAMESPACE
 )
 @org.osgi.service.cdi.annotations.RequireCDIImplementation
diff --git a/cdi-spi/src/main/java/org/apache/aries/cdi/spi/CDIContainerInitializer.java b/cdi-spi/src/main/java/org/apache/aries/cdi/spi/CDIContainerInitializer.java
new file mode 100644
index 0000000..93d27b5
--- /dev/null
+++ b/cdi-spi/src/main/java/org/apache/aries/cdi/spi/CDIContainerInitializer.java
@@ -0,0 +1,81 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.spi;
+
+import java.net.URL;
+
+import javax.enterprise.inject.spi.Extension;
+
+import org.apache.aries.cdi.spi.loader.SpiLoader;
+import org.osgi.annotation.versioning.ProviderType;
+import org.osgi.framework.BundleContext;
+
+@ProviderType
+public abstract class CDIContainerInitializer {
+
+	/**
+	 * Adds the listed classes to the resulting synthetic bean archive
+	 * @param classes
+	 * @return this
+	 */
+	public abstract CDIContainerInitializer addBeanClasses(Class<?>... classes);
+
+	/**
+	 * Adds the listed bean.xml files the resulting synthetic bean archive
+	 * @param beanXmls
+	 * @return this
+	 */
+	public abstract CDIContainerInitializer addBeanXmls(URL... beanXmls);
+
+	/**
+	 * Adds the given Extension instances to the synthetic bean archive
+	 *
+	 * @param extensions
+	 * @return this
+	 */
+	public abstract CDIContainerInitializer addExtensions(Extension... extensions);
+
+	/**
+	 * Adds a configuration property to the container
+	 *
+	 * @param key
+	 * @param value
+	 * @return this
+	 */
+	public abstract CDIContainerInitializer addProperty(String key, Object value);
+
+	/**
+	 * Sets the SpiLoader for this synthetic bean archive
+	 *
+	 * @param spiLoader
+	 * @return this
+	 */
+	public abstract CDIContainerInitializer setClassLoader(SpiLoader spiLoader);
+
+	/**
+	 * Sets the {@link BundleContext} for which this synthetic bean archive is created
+	 * @param beanXmls
+	 * @return this
+	 */
+	public abstract CDIContainerInitializer setBundleContext(BundleContext bundleContext);
+
+	/**
+	 * Bootstraps the container that has been built from this CDIContainerInitializer
+	 *
+	 * @return a new SeContainer representing this synthetic bean archive
+	 */
+	public abstract AutoCloseable initialize();
+
+}
diff --git a/cdi-spi/src/main/java/org/apache/aries/cdi/spi/Keys.java b/cdi-spi/src/main/java/org/apache/aries/cdi/spi/Keys.java
deleted file mode 100644
index e2fb32b..0000000
--- a/cdi-spi/src/main/java/org/apache/aries/cdi/spi/Keys.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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.spi;
-
-import java.net.URL;
-
-import javax.enterprise.inject.se.SeContainerInitializer;
-
-public class Keys {
-
-	private Keys() {}
-
-	private static final String ROOT_PREFIX = "org.apache.aries.cdi.spi.";
-
-	/**
-	 * Key used for passing a {@code Collection<URL>} containing the list of {@code beans.xml}
-	 * {@link URL urls} using {@link SeContainerInitializer#addProperty(String, Object)} or
-	 * {@link SeContainerInitializer#setProperties(java.util.Map)}.
-	 */
-	public static final String BEANS_XML_PROPERTY = ROOT_PREFIX + "beansXml";
-
-	/**
-	 * Key used for passing a {@code BundleContext} of the CDI bundle using
-	 * {@link SeContainerInitializer#addProperty(String, Object)} or
-	 * {@link SeContainerInitializer#setProperties(java.util.Map)}.
-	 */
-	public static final String BUNDLECONTEXT_PROPERTY = ROOT_PREFIX + "bundleContext";
-
-
-}
diff --git a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/Activator.java b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/Activator.java
index 3d83511..e7da0ec 100644
--- a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/Activator.java
+++ b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/Activator.java
@@ -21,8 +21,7 @@ import static org.osgi.framework.Constants.SERVICE_VENDOR;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
-import javax.enterprise.inject.se.SeContainerInitializer;
-
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.osgi.annotation.bundle.Header;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
@@ -37,19 +36,18 @@ public class Activator implements BundleActivator {
 	@Override
 	public void start(BundleContext bundleContext) throws Exception {
 		Dictionary<String, Object> properties = new Hashtable<>();
-		properties.put(SERVICE_DESCRIPTION, "Aries CDI - Weld SeContainerInitializer Factory");
+		properties.put(SERVICE_DESCRIPTION, "Aries CDI - Weld CDIContainerInitializer Factory");
 		properties.put(SERVICE_VENDOR, "Apache Software Foundation");
-		properties.put("aries.cdi.spi", "Weld");
 
-		_seContainerInitializer = bundleContext.registerService(
-			SeContainerInitializer.class, new WeldSeContainerInitializerFactory(bundleContext), properties);
+		_containerInitializer = bundleContext.registerService(
+			CDIContainerInitializer.class, new WeldCDIContainerInitializerFactory(bundleContext), properties);
 	}
 
 	@Override
 	public void stop(BundleContext context) throws Exception {
-		_seContainerInitializer.unregister();
+		_containerInitializer.unregister();
 	}
 
-	private ServiceRegistration<SeContainerInitializer> _seContainerInitializer;
+	private ServiceRegistration<CDIContainerInitializer> _containerInitializer;
 
 }
diff --git a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldCDIContainerInitializer.java b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldCDIContainerInitializer.java
new file mode 100644
index 0000000..c7745ea
--- /dev/null
+++ b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldCDIContainerInitializer.java
@@ -0,0 +1,156 @@
+package org.apache.aries.cdi.weld;
+
+import static java.util.Collections.list;
+import static java.util.Objects.requireNonNull;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.enterprise.inject.spi.Extension;
+
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
+import org.apache.aries.cdi.spi.loader.SpiLoader;
+import org.jboss.weld.bootstrap.WeldBootstrap;
+import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
+import org.jboss.weld.bootstrap.spi.BeansXml;
+import org.jboss.weld.bootstrap.spi.Deployment;
+import org.jboss.weld.bootstrap.spi.Metadata;
+import org.jboss.weld.xml.BeansXmlParser;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+
+public class WeldCDIContainerInitializer extends CDIContainerInitializer {
+
+	public WeldCDIContainerInitializer(BundleContext bundleContext) {
+		weldBundleContext = bundleContext;
+	}
+
+	@Override
+	public CDIContainerInitializer addBeanClasses(Class<?>... classes) {
+		beanClasses.addAll(Arrays.asList(classes));
+		return this;
+	}
+
+	@Override
+	public CDIContainerInitializer addBeanXmls(URL... beanXmls) {
+		beanDescriptorURLs.addAll(Arrays.asList(beanXmls));
+		return this;
+	}
+
+	@Override
+	public CDIContainerInitializer addExtensions(Extension... extensions) {
+		this.extensions.addAll(Arrays.asList(extensions));
+		return this;
+	}
+
+	@Override
+	public CDIContainerInitializer addProperty(String key, Object value) {
+		properties.putIfAbsent(key, value);
+		return this;
+	}
+
+	@Override
+	public CDIContainerInitializer setBundleContext(BundleContext bundleContext) {
+		clientBundleContext = bundleContext;
+		return this;
+	}
+
+	@Override
+	public CDIContainerInitializer setClassLoader(SpiLoader spiLoader) {
+		this.spiLoader = spiLoader;
+		return this;
+	}
+
+	@Override
+	public AutoCloseable initialize() {
+		Thread currentThread = Thread.currentThread();
+		ClassLoader current = currentThread.getContextClassLoader();
+		BundleResourcesLoader resourceLoader = new BundleResourcesLoader(requireNonNull(spiLoader), weldBundleContext.getBundle());
+
+		try {
+			currentThread.setContextClassLoader(spiLoader);
+
+			Optional.ofNullable(requireNonNull(clientBundleContext).getBundle().getHeaders()).ifPresent(
+				headers -> list(headers.elements()).stream()
+					.filter(it -> it.startsWith("org.jboss.weld."))
+					.forEach(key -> properties.setProperty(key, headers.get(key))
+				)
+			);
+
+			// Add external extensions
+			List<Metadata<Extension>> metaExtensions = extensions.stream().map(
+				e -> new ExtensionMetadata(e, location(e))
+			).collect(Collectors.toList());
+
+			BeansXml beansXml = BeansXml.EMPTY_BEANS_XML;
+
+			if (!beanDescriptorURLs.isEmpty()) {
+				BeansXmlParser beansXmlParser = new BeansXmlParser();
+				beansXml = beansXmlParser.parse(beanDescriptorURLs);
+			}
+
+			String id = clientBundleContext.getBundle().toString();
+
+			bootstrap = new WeldBootstrap();
+
+			beanDeploymentArchive = new ContainerDeploymentArchive(
+				resourceLoader,
+				id,
+				beanClasses.stream().map(Class::getName).collect(Collectors.toList()),
+				beansXml);
+
+			Deployment deployment = new ContainerDeployment(metaExtensions, beanDeploymentArchive);
+
+			bootstrap.startExtensions(metaExtensions);
+			bootstrap.startContainer(id, new ContainerEnvironment(), deployment);
+			bootstrap.startInitialization();
+			bootstrap.deployBeans();
+			bootstrap.validateBeans();
+			bootstrap.endInitialization();
+
+			return new WeldSeContainer();
+		}
+		finally {
+			currentThread.setContextClassLoader(current);
+		}
+	}
+
+	private String location(Extension extension) {
+		return BundleReference.class.cast(extension.getClass().getClassLoader()).getBundle().toString();
+	}
+
+	private volatile BeanDeploymentArchive beanDeploymentArchive;
+	private final List<URL> beanDescriptorURLs = new ArrayList<>();
+	private volatile WeldBootstrap bootstrap;
+	private volatile BundleContext clientBundleContext;
+	private volatile SpiLoader spiLoader;
+	private final Set<Class<?>> beanClasses = new HashSet<>();
+	private final List<Extension> extensions = new ArrayList<>();
+	private final BundleContext weldBundleContext;
+	private final Properties properties = new Properties();
+
+	private class WeldSeContainer implements AutoCloseable {
+
+		@Override
+		public void close() {
+			Thread currentThread = Thread.currentThread();
+			ClassLoader current = currentThread.getContextClassLoader();
+			try {
+				currentThread.setContextClassLoader(requireNonNull(spiLoader));
+				bootstrap.shutdown();
+			}
+			finally {
+				currentThread.setContextClassLoader(current);
+			}
+		}
+
+	}
+
+}
diff --git a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldSeContainerInitializerFactory.java b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldCDIContainerInitializerFactory.java
similarity index 63%
rename from cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldSeContainerInitializerFactory.java
rename to cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldCDIContainerInitializerFactory.java
index 3ec972f..1ca91e1 100644
--- a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldSeContainerInitializerFactory.java
+++ b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldCDIContainerInitializerFactory.java
@@ -14,29 +14,32 @@
 
 package org.apache.aries.cdi.weld;
 
-import javax.enterprise.inject.se.SeContainerInitializer;
-
+import org.apache.aries.cdi.spi.CDIContainerInitializer;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.PrototypeServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 
-public class WeldSeContainerInitializerFactory implements PrototypeServiceFactory<SeContainerInitializer> {
+public class WeldCDIContainerInitializerFactory
+	implements PrototypeServiceFactory<CDIContainerInitializer> {
 
-	public WeldSeContainerInitializerFactory(BundleContext bundleContext) {
+	public WeldCDIContainerInitializerFactory(BundleContext bundleContext) {
 		this.bundleContext = bundleContext;
 	}
 
 	@Override
-	public SeContainerInitializer getService(
-		Bundle bundle, ServiceRegistration<SeContainerInitializer> registration) {
+	public CDIContainerInitializer getService(
+		Bundle bundle,
+		ServiceRegistration<CDIContainerInitializer> registration) {
 
-		return new WeldSeContainerInitializer(bundleContext);
+		return new WeldCDIContainerInitializer(bundleContext);
 	}
 
 	@Override
 	public void ungetService(
-		Bundle bundle, ServiceRegistration<SeContainerInitializer> registration, SeContainerInitializer service) {
+		Bundle bundle,
+		ServiceRegistration<CDIContainerInitializer> registration,
+		CDIContainerInitializer service) {
 	}
 
 	private final BundleContext bundleContext;
diff --git a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldSeContainerInitializer.java b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldSeContainerInitializer.java
deleted file mode 100644
index 1de5bff..0000000
--- a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/WeldSeContainerInitializer.java
+++ /dev/null
@@ -1,280 +0,0 @@
-package org.apache.aries.cdi.weld;
-
-import static java.util.Collections.list;
-import static java.util.Objects.requireNonNull;
-import static org.apache.aries.cdi.spi.Keys.BEANS_XML_PROPERTY;
-import static org.apache.aries.cdi.spi.Keys.BUNDLECONTEXT_PROPERTY;
-
-import java.lang.annotation.Annotation;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.enterprise.inject.Instance;
-import javax.enterprise.inject.se.SeContainer;
-import javax.enterprise.inject.se.SeContainerInitializer;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.Extension;
-import javax.enterprise.util.TypeLiteral;
-
-import org.apache.aries.cdi.spi.loader.SpiLoader;
-import org.jboss.weld.bootstrap.WeldBootstrap;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.bootstrap.spi.Deployment;
-import org.jboss.weld.bootstrap.spi.Metadata;
-import org.jboss.weld.xml.BeansXmlParser;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleReference;
-
-public class WeldSeContainerInitializer extends SeContainerInitializer {
-
-	public WeldSeContainerInitializer(BundleContext bundleContext) {
-		weldBundleContext = bundleContext;
-	}
-
-	@Override
-	public SeContainerInitializer addBeanClasses(Class<?>... classes) {
-		beanClasses.addAll(Arrays.asList(classes));
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addPackages(Class<?>... packageClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addPackages(boolean scanRecursively, Class<?>... packageClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addPackages(Package... packages) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addPackages(boolean scanRecursively, Package... packages) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addExtensions(Extension... extensions) {
-		this.extensions.addAll(Arrays.asList(extensions));
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addExtensions(Class<? extends Extension>... extensions) {
-		this.extensionClasses.addAll(Arrays.asList(extensions));
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer enableInterceptors(Class<?>... interceptorClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer enableDecorators(Class<?>... decoratorClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer selectAlternatives(Class<?>... alternativeClasses) {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer selectAlternativeStereotypes(
-		Class<? extends Annotation>... alternativeStereotypeClasses) {
-
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer addProperty(String key, Object value) {
-		properties.putIfAbsent(key, value);
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer setProperties(Map<String, Object> properties) {
-		properties.putAll(properties);
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer disableDiscovery() {
-		// TODO Auto-generated method stub
-		return this;
-	}
-
-	@Override
-	public SeContainerInitializer setClassLoader(ClassLoader classLoader) {
-		this.classLoader = (SpiLoader)classLoader;
-		return this;
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public SeContainer initialize() {
-		Thread currentThread = Thread.currentThread();
-		ClassLoader current = currentThread.getContextClassLoader();
-		BundleResourcesLoader resourceLoader = new BundleResourcesLoader(requireNonNull(classLoader), weldBundleContext.getBundle());
-
-		try {
-			currentThread.setContextClassLoader(classLoader);
-			clientBundleContext = requireNonNull(BundleContext.class.cast(properties.get(BUNDLECONTEXT_PROPERTY)));
-
-			Optional.ofNullable(clientBundleContext.getBundle().getHeaders()).ifPresent(
-				headers -> list(headers.elements()).stream()
-					.filter(it -> it.startsWith("org.jboss.weld."))
-					.forEach(key -> properties.setProperty(key, headers.get(key))
-				)
-			);
-
-			// Add external extensions
-			List<Metadata<Extension>> metaExtensions = extensions.stream().map(
-				extension -> {
-					Bundle extensionBundle = BundleReference.class.cast(extension.getClass().getClassLoader()).getBundle();
-					classLoader.getBundles().add(extensionBundle);
-					return new ExtensionMetadata(extension, extensionBundle.toString());
-				}
-			).collect(Collectors.toList());
-
-			BeansXml beansXml = BeansXml.EMPTY_BEANS_XML;
-
-			Collection<URL> beanDescriptorURLs = Collection.class.cast(properties.get(BEANS_XML_PROPERTY));
-
-			if (!beanDescriptorURLs.isEmpty()) {
-				BeansXmlParser beansXmlParser = new BeansXmlParser();
-				beansXml = beansXmlParser.parse(beanDescriptorURLs);
-			}
-
-			String id = clientBundleContext.getBundle().toString();
-
-			bootstrap = new WeldBootstrap();
-
-			beanDeploymentArchive = new ContainerDeploymentArchive(
-				resourceLoader,
-				id,
-				beanClasses.stream().map(Class::getName).collect(Collectors.toList()),
-				beansXml);
-
-			Deployment deployment = new ContainerDeployment(metaExtensions, beanDeploymentArchive);
-
-			bootstrap.startExtensions(metaExtensions);
-			bootstrap.startContainer(id, new ContainerEnvironment(), deployment);
-			bootstrap.startInitialization();
-			bootstrap.deployBeans();
-			bootstrap.validateBeans();
-			bootstrap.endInitialization();
-
-			return new WeldSeContainer();
-		}
-		finally {
-			currentThread.setContextClassLoader(current);
-		}
-	}
-
-	private volatile BeanDeploymentArchive beanDeploymentArchive;
-	private volatile WeldBootstrap bootstrap;
-	private volatile BundleContext clientBundleContext;
-	private volatile SpiLoader classLoader;
-	private final Set<Class<?>> beanClasses = new HashSet<>();
-	private final List<Extension> extensions = new ArrayList<>();
-	private final List<Class<? extends Extension>> extensionClasses = new ArrayList<>();
-	private final BundleContext weldBundleContext;
-	private final Properties properties = new Properties();
-
-	private class WeldSeContainer implements SeContainer {
-
-		private volatile boolean running = true;
-
-		@Override
-		public void close() {
-			running = false;
-			Thread currentThread = Thread.currentThread();
-			ClassLoader current = currentThread.getContextClassLoader();
-			try {
-				currentThread.setContextClassLoader(requireNonNull(classLoader));
-				bootstrap.shutdown();
-			}
-			finally {
-				currentThread.setContextClassLoader(current);
-			}
-		}
-
-		@Override
-		public Instance<Object> select(Annotation... qualifiers) {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().select(qualifiers);
-		}
-
-		@Override
-		public <U> Instance<U> select(Class<U> subtype, Annotation... qualifiers) {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().select(subtype, qualifiers);
-		}
-
-		@Override
-		public <U> Instance<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().select(subtype, qualifiers);
-		}
-
-		@Override
-		public boolean isUnsatisfied() {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().isUnsatisfied();
-		}
-
-		@Override
-		public boolean isAmbiguous() {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().isAmbiguous();
-		}
-
-		@Override
-		public void destroy(Object instance) {
-			bootstrap.getManager(beanDeploymentArchive).createInstance().destroy(instance);
-		}
-
-		@Override
-		public Iterator<Object> iterator() {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().iterator();
-		}
-
-		@Override
-		public boolean isRunning() {
-			return running;
-		}
-
-		@Override
-		public BeanManager getBeanManager() {
-			return bootstrap.getManager(beanDeploymentArchive);
-		}
-
-		@Override
-		public Object get() {
-			return bootstrap.getManager(beanDeploymentArchive).createInstance().get();
-		}
-
-	}
-
-}
diff --git a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/package-info.java b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/package-info.java
index 0e4cdfe..218f42e 100644
--- a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/package-info.java
+++ b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/package-info.java
@@ -13,10 +13,7 @@
  */
 
 @org.osgi.annotation.bundle.Capability(
-	attribute = {
-		"objectClass:List<String>=javax.enterprise.inject.se.SeContainerInitializer",
-		"aries.cdi.spi=Weld"
-	},
+	attribute = "objectClass:List<String>=org.apache.aries.cdi.spi.CDIContainerInitializer",
 	namespace = org.osgi.namespace.service.ServiceNamespace.SERVICE_NAMESPACE
 )
 @org.osgi.service.cdi.annotations.RequireCDIImplementation