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 2017/09/05 22:01:15 UTC

svn commit: r1807424 [2/8] - in /aries/trunk/cdi: ./ cdi-extender/ cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/ cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ cdi-extender/src/main/java/org/apache/aries/...

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,56 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.container.internal.component;
+
+import java.lang.annotation.Annotation;
+import java.util.Set;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.apache.aries.cdi.container.internal.literal.CdiMarkLiteral;
+import org.apache.aries.cdi.container.internal.util.Sets;
+import org.jboss.weld.injection.ForwardingInjectionPoint;
+
+public class MarkedInjectionPoint extends ForwardingInjectionPoint {
+
+	public MarkedInjectionPoint(InjectionPoint injectionPoint, Annotation annotation, int mark) {
+		_delegate = injectionPoint;
+		_mark = mark;
+		_qualifiers = Sets.hashSet(injectionPoint.getQualifiers(), annotation, CdiMarkLiteral.from(_mark));
+	}
+
+	@Override
+	protected InjectionPoint delegate() {
+		return _delegate;
+	}
+
+	public InjectionPoint getDelegate() {
+		return _delegate;
+	}
+
+	public int getMark() {
+		return _mark;
+	}
+
+	@Override
+	public Set<Annotation> getQualifiers() {
+		return _qualifiers;
+	}
+
+	private final InjectionPoint _delegate;
+	private final int _mark;
+	private final Set<Annotation> _qualifiers;
+
+}
\ No newline at end of file

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java Tue Sep  5 22:01:11 2017
@@ -12,16 +12,16 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.container.internal.bean;
+package org.apache.aries.cdi.container.internal.configuration;
 
 import static org.apache.aries.cdi.container.internal.util.Reflection.cast;
 
 import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.AbstractMap;
 import java.util.Collections;
+import java.util.Dictionary;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import javax.enterprise.context.Dependent;
@@ -29,13 +29,11 @@ import javax.enterprise.context.spi.Crea
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.Decorator;
 import javax.enterprise.inject.spi.InjectionPoint;
-import javax.inject.Named;
 
-import org.apache.aries.cdi.container.internal.container.ConfigurationDependency;
-import org.apache.aries.cdi.container.internal.literal.AnyLiteral;
-import org.apache.aries.cdi.container.internal.literal.DefaultLiteral;
+import org.apache.aries.cdi.container.internal.component.ComponentModel;
+import org.apache.aries.cdi.container.internal.component.ComponentProperties;
+import org.apache.aries.cdi.container.internal.container.ContainerState;
 import org.apache.aries.cdi.container.internal.util.Conversions;
-import org.apache.aries.cdi.container.internal.util.Sets;
 import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.injection.EmptyInjectionPoint;
 import org.jboss.weld.manager.BeanManagerImpl;
@@ -44,34 +42,48 @@ import org.jboss.weld.util.Decorators;
 public class ConfigurationBean implements Bean<Object> {
 
 	public ConfigurationBean(
-		ConfigurationDependency configurationDependency, BeanManagerImpl beanManagerImpl, Type injectionPointType,
-		Set<Annotation> qualifiers) {
-
-		_configurationDependency = configurationDependency;
+		ContainerState containerState,
+		ConfigurationModel configurationModel,
+		ComponentModel componentModel,
+		InjectionPoint injectionPoint,
+		BeanManagerImpl beanManagerImpl) {
+
+		_containerState = containerState;
+		_configurationModel = configurationModel;
+		_componentModel = componentModel;
+		_injectionPoint = injectionPoint;
 		_beanManagerImpl = beanManagerImpl;
-		_typesForMatchingBeansToInjectionPoints = Sets.immutableHashSet(injectionPointType, Object.class);
-		_currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class);
-		_qualifiers = Sets.hashSet(qualifiers, DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE);
-
-		for (Annotation qualifier : _qualifiers) {
-			if (qualifier.annotationType().equals(Named.class)) {
-				_name = ((Named)qualifier).value();
-			}
+
+		Type type = _injectionPoint.getType();
+
+		if (type instanceof ParameterizedType) {
+			ParameterizedType pt = (ParameterizedType)type;
+
+			type = pt.getRawType();
 		}
+
+		_beanClass = cast(type);
 	}
 
 	@Override
 	public Object create(CreationalContext<Object> creationalContext) {
-		return create0(creationalContext);
+		Object instance = _getInjectedInstance();
+		InjectionPoint ip = _getInjectionPoint();
+		List<Decorator<?>> decorators = _getDecorators(ip);
+		if (decorators.isEmpty()) {
+			return instance;
+		}
+		return Decorators.getOuterDelegate(
+			this, instance, creationalContext, cast(_beanClass), ip, _beanManagerImpl, decorators);
 	}
 
 	@Override
-	public void destroy(Object arg0, CreationalContext<Object> arg1) {
+	public void destroy(Object instance, CreationalContext<Object> creationalContext) {
 	}
 
 	@Override
 	public Class<?> getBeanClass() {
-		return _configurationDependency.getBeanClass();
+		return _beanClass;
 	}
 
 	@Override
@@ -81,12 +93,12 @@ public class ConfigurationBean implement
 
 	@Override
 	public String getName() {
-		return _name;
+		return null;
 	}
 
 	@Override
 	public Set<Annotation> getQualifiers() {
-		return _qualifiers;
+		return _injectionPoint.getQualifiers();
 	}
 
 	@Override
@@ -101,7 +113,7 @@ public class ConfigurationBean implement
 
 	@Override
 	public Set<Type> getTypes() {
-		return _typesForMatchingBeansToInjectionPoints;
+		return Collections.singleton(_injectionPoint.getType());
 	}
 
 	@Override
@@ -116,46 +128,43 @@ public class ConfigurationBean implement
 
 	@Override
 	public String toString() {
-		return "ConfigurationBean[" + _currentInjectionPoint + "]";
-	}
-
-	protected <T> T create0(CreationalContext<T> creationalContext) {
-		Map<String, Object> map = new AbstractMap<String, Object>() {
-
-			@Override
-			public Set<java.util.Map.Entry<String, Object>> entrySet() {
-				return _configurationDependency.getConfiguration().entrySet();
-			}
-
-		};
-
-		T instance = cast(Conversions.c().convert(map).to(_configurationDependency.getBeanClass()));
-		InjectionPoint ip = getInjectionPoint(_currentInjectionPoint);
-		if (ip == null) {
-			return instance;
-		}
-		List<Decorator<?>> decorators = getDecorators(ip);
-		if (decorators.isEmpty()) {
-			return instance;
+		if (_string == null) {
+			_string = "ConfigurationBean[" + _configurationModel + "]";
 		}
-		return Decorators.getOuterDelegate(
-			cast(this), instance, creationalContext, cast(getBeanClass()), ip, _beanManagerImpl, decorators);
+
+		return _string;
 	}
 
-	protected List<Decorator<?>> getDecorators(InjectionPoint ip) {
+	private List<Decorator<?>> _getDecorators(InjectionPoint ip) {
 		return _beanManagerImpl.resolveDecorators(Collections.singleton(ip.getType()), getQualifiers());
 	}
 
-	protected InjectionPoint getInjectionPoint(CurrentInjectionPoint currentInjectionPoint) {
+	private Object _getInjectedInstance() {
+		Dictionary<String,?> dictionary = new ComponentProperties().bean(
+			_injectionPoint.getBean()
+		).componentModel(
+			_componentModel
+		).containerState(
+			_containerState
+		).pid(
+			_configurationModel.getPid()
+		).build();
+
+		return Conversions.convert(dictionary).to(_injectionPoint.getType());
+	}
+
+	private InjectionPoint _getInjectionPoint() {
+		CurrentInjectionPoint currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class);
 		InjectionPoint ip = currentInjectionPoint.peek();
 		return EmptyInjectionPoint.INSTANCE.equals(ip) ? null : ip;
 	}
 
+	private final Class<?> _beanClass;
 	private final BeanManagerImpl _beanManagerImpl;
-	private final ConfigurationDependency _configurationDependency;
-	private final CurrentInjectionPoint _currentInjectionPoint;
-	private String _name;
-	private final Set<Annotation> _qualifiers;
-	private final Set<Type> _typesForMatchingBeansToInjectionPoints;
+	private final ComponentModel _componentModel;
+	private final ConfigurationModel _configurationModel;
+	private final ContainerState _containerState;
+	private final InjectionPoint _injectionPoint;
+	private String _string;
 
 }

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,186 @@
+/**
+ * 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.configuration;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Consumer;
+
+import org.osgi.service.cdi.annotations.ConfigurationPolicy;
+
+public class ConfigurationCallback {
+
+	public static enum State {STARTED, ADDED, UPDATED, REMOVED}
+
+	public static class Builder {
+
+		public ConfigurationCallback build() {
+			//Objects.requireNonNull(_pid);
+			Objects.requireNonNull(_policy);
+			return new ConfigurationCallback(_pid, _policy, _onAdd, _onUpdate, _onRemove);
+		}
+
+		public Builder onAdd(Consumer<ConfigurationCallback> onAdd) {
+			_onAdd = onAdd;
+			return this;
+		}
+
+		public Builder onRemove(Consumer<ConfigurationCallback> onRemove) {
+			_onRemove = onRemove;
+			return this;
+		}
+
+		public Builder onUpdate(Consumer<ConfigurationCallback> onUpdate) {
+			_onUpdate = onUpdate;
+			return this;
+		}
+
+		public Builder pid(String pid) {
+			_pid = pid;
+			return this;
+		}
+
+		public Builder policy(ConfigurationPolicy policy) {
+			_policy = policy;
+			return this;
+		}
+
+		private String _pid;
+		private ConfigurationPolicy _policy;
+		private Consumer<ConfigurationCallback> _onAdd;
+		private Consumer<ConfigurationCallback> _onRemove;
+		private Consumer<ConfigurationCallback> _onUpdate;
+
+	}
+
+	private ConfigurationCallback(
+		String pid,
+		ConfigurationPolicy policy,
+		Consumer<ConfigurationCallback> onAdd,
+		Consumer<ConfigurationCallback> onUpdate,
+		Consumer<ConfigurationCallback> onRemove) {
+
+		_pid = pid;
+		_policy = policy;
+		_onAdd = Optional.ofNullable(onAdd);
+		_onRemove = Optional.ofNullable(onRemove);
+		_onUpdate = Optional.ofNullable(onUpdate);
+		_state = State.STARTED;
+	}
+
+	public void added(Dictionary<String, ?> properties) {
+		if (_policy == ConfigurationPolicy.IGNORE) return;
+		assertNotEmpty(properties);
+		switch (_state) {
+			case STARTED:
+			case REMOVED:
+				_properties = properties;
+				_state = State.ADDED;
+				_onAdd.ifPresent(f -> f.accept(this));
+				break;
+			default:
+				throw new IllegalStateException(_state.toString());
+		}
+	}
+
+	@SuppressWarnings("incomplete-switch")
+	public void init() {
+		switch (_policy) {
+			case DEFAULT:
+			case IGNORE:
+			case OPTIONAL:
+				_onAdd.ifPresent(f -> f.accept(this));
+				break;
+		}
+	}
+
+	public ConfigurationPolicy policy() {
+		return _policy;
+	}
+
+	public Dictionary<String, ?> properties() {
+		if (_policy == ConfigurationPolicy.IGNORE) return NULL_PROPERTIES;
+		return _properties;
+	}
+
+	public void removed() {
+		if (_policy == ConfigurationPolicy.IGNORE) return;
+		switch (_state) {
+			case ADDED:
+			case UPDATED:
+				_properties = NULL_PROPERTIES;
+				_state = State.REMOVED;
+				_onRemove.ifPresent(f -> f.accept(this));
+				break;
+			default:
+				throw new IllegalStateException(_state.toString());
+		}
+	}
+
+	public boolean resolved() {
+		if ((_policy == ConfigurationPolicy.REQUIRE) && (_properties == NULL_PROPERTIES)) {
+			return false;
+		}
+
+		return true;
+	}
+
+	public State state() {
+		return _state;
+	}
+
+	@Override
+	public String toString() {
+		if (_string == null) {
+			_string = String.format("ConfigurationCallback[pid='%s', policy='%s', state='%s', properties='%s']", _pid, _policy, _state, properties());
+		}
+		return _string;
+	}
+
+	public void updated(Dictionary<String, ?> properties) {
+		if (_policy == ConfigurationPolicy.IGNORE) return;
+		assertNotEmpty(properties);
+		switch (_state) {
+			case ADDED:
+			case UPDATED:
+				_properties = properties;
+				_state = State.UPDATED;
+				_onUpdate.ifPresent(f -> f.accept(this));
+				break;
+			default:
+				throw new IllegalStateException(_state.toString());
+		}
+	}
+
+	private static final void assertNotEmpty(Dictionary<String, ?> dictionary) {
+		if ((dictionary == null) || dictionary.isEmpty()) {
+			throw new IllegalArgumentException("Empty properties");
+		}
+	}
+
+	private static final Dictionary<String, ?> NULL_PROPERTIES = new Hashtable<>();
+
+	private final String _pid;
+	private final ConfigurationPolicy _policy;
+	private volatile Dictionary<String, ?> _properties = NULL_PROPERTIES;
+	private final Optional<Consumer<ConfigurationCallback>> _onAdd;
+	private final Optional<Consumer<ConfigurationCallback>> _onUpdate;
+	private final Optional<Consumer<ConfigurationCallback>> _onRemove;
+	private volatile State _state;
+	private volatile String _string;
+
+}

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,63 @@
+/**
+ * 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.configuration;
+
+import java.util.Dictionary;
+
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+
+public class ConfigurationManagedService implements ManagedService {
+
+	public ConfigurationManagedService(String pid, ConfigurationCallback callback) {
+		_pid = pid;
+		_callback = callback;
+	}
+
+	@Override
+	public synchronized void updated(Dictionary<String, ?> properties) throws ConfigurationException {
+		if ((_properties == null) && (properties != null)) {
+			_properties = properties;
+			_callback.added(properties);
+		}
+		else if ((_properties != null) && (properties != null)) {
+			_properties = properties;
+			_callback.updated(properties);
+		}
+		else if ((_properties == null) && (properties == null)) {
+			// ignore this
+		}
+		else {
+			_properties = null;
+			_callback.removed();
+		}
+	}
+
+	@Override
+	public String toString() {
+		if (_string == null) {
+			_string = String.format(
+				"ConfigurationManagedService[%s, %s]", _pid, _callback.policy());
+		}
+
+		return _string;
+	}
+
+	private final ConfigurationCallback _callback;
+	private final String _pid;
+	private volatile Dictionary<String, ?> _properties;
+	private volatile String _string;
+
+}
\ No newline at end of file

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,182 @@
+/**
+ * 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.configuration;
+
+import static org.apache.aries.cdi.container.internal.model.Model.*;
+import static org.apache.aries.cdi.container.internal.model.Constants.CDI10_URI;
+import static org.apache.aries.cdi.container.internal.model.Constants.CONFIGURATION_PID_ATTRIBUTE;
+import static org.apache.aries.cdi.container.internal.model.Constants.CONFIGURATION_POLICY_ATTRIBUTE;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.osgi.service.cdi.annotations.Configuration;
+import org.osgi.service.cdi.annotations.ConfigurationPolicy;
+import org.xml.sax.Attributes;
+
+public class ConfigurationModel {
+
+	public static class Builder {
+
+		public Builder(Type type) {
+			Objects.requireNonNull(type);
+			_type = type;
+		}
+
+		public Builder attributes(Attributes attributes) {
+			_policy = ConfigurationPolicy.get(getValue(
+					CDI10_URI, CONFIGURATION_POLICY_ATTRIBUTE, attributes, ConfigurationPolicy.DEFAULT.toString()));
+			_pid = getValues(CDI10_URI, CONFIGURATION_PID_ATTRIBUTE, attributes, new String[] {Configuration.NAME});
+			return this;
+		}
+
+		public ConfigurationModel build() {
+			_pid = ((_pid == null) || (_pid.length == 0))? new String[] {Configuration.NAME}: _pid;
+
+			if (_policy == null) {
+				_policy = ConfigurationPolicy.OPTIONAL;
+			}
+
+			return new ConfigurationModel(_type, _pid, _policy, _qualifiers);
+		}
+
+		public Builder injectionPoint(InjectionPoint injectionPoint) {
+			_qualifiers = injectionPoint.getQualifiers();
+			Configuration configuration = injectionPoint.getAnnotated().getAnnotation(Configuration.class);
+			if (configuration != null) {
+				_policy = configuration.configurationPolicy();
+				_pid = configuration.value();
+			}
+			return this;
+		}
+
+		public Builder pid(String[] pid) {
+			_pid = pid;
+			return this;
+		}
+
+		public Builder policy(ConfigurationPolicy policy) {
+			_policy = policy;
+			return this;
+		}
+
+		public Builder qualifiers(Set<Annotation> qualifiers) {
+			_qualifiers = qualifiers;
+			return this;
+		}
+
+		private String[] _pid;
+		private ConfigurationPolicy _policy;
+		private Set<Annotation> _qualifiers;
+		private Type _type;
+
+	}
+
+	private ConfigurationModel(Type type, String[] pids, ConfigurationPolicy policy, Set<Annotation> qualifiers) {
+		_type = type;
+		_pid = pids;
+		_policy = policy;
+		_qualifiers = new LinkedHashSet<>();
+		if (qualifiers != null) {
+			_qualifiers.addAll(qualifiers);
+		}
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((_policy == null) ? 0 : _policy.hashCode());
+		result = prime * result + ((_qualifiers == null) ? 0 : _qualifiers.hashCode());
+		result = prime * result + ((_type == null) ? 0 : _type.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		ConfigurationModel other = (ConfigurationModel) obj;
+		if (_policy != other._policy)
+			return false;
+		if (_qualifiers == null) {
+			if (other._qualifiers != null)
+				return false;
+		} else if (!_qualifiers.equals(other._qualifiers))
+			return false;
+		if (_type == null) {
+			if (other._type != null)
+				return false;
+		} else if (!_type.equals(other._type))
+			return false;
+		return true;
+	}
+
+	public ConfigurationPolicy getConfigurationPolicy() {
+		return _policy;
+	}
+
+	public boolean found() {
+		return _found.get();
+	}
+
+	public void found(boolean found) {
+		_found.set(found);
+	}
+
+	public String[] getPid() {
+		return _pid;
+	}
+
+	public Set<Annotation> getQualifiers() {
+		return _qualifiers;
+	}
+
+	public Type getType() {
+		return _type;
+	}
+
+	public void setQualifiers(Set<Annotation> qualifiers) {
+		_qualifiers.clear();
+		_qualifiers.addAll(qualifiers);
+	}
+
+	@Override
+	public String toString() {
+		if (_string == null) {
+			_string = String.format("configuration[type='%s', policy='%s', pid='%s']", _type, _policy, Arrays.toString(_pid));
+		}
+		return _string;
+	}
+
+	private final AtomicBoolean _found = new AtomicBoolean();
+	private final String[] _pid;
+	private final ConfigurationPolicy _policy;
+	private final Set<Annotation> _qualifiers;
+	private volatile String _string;
+	private final Type _type;
+
+}

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,102 @@
+/**
+ * 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.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.enterprise.inject.spi.Extension;
+
+import org.apache.aries.cdi.container.internal.component.ComponentRuntimeExtension;
+import org.apache.aries.cdi.container.internal.context.BundleContextExtension;
+import org.apache.aries.cdi.container.internal.extension.ExtensionMetadata;
+import org.apache.aries.cdi.container.internal.model.BeansModel;
+import org.jboss.weld.bootstrap.WeldBootstrap;
+import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
+import org.jboss.weld.bootstrap.spi.Deployment;
+import org.jboss.weld.bootstrap.spi.Metadata;
+import org.jboss.weld.manager.BeanManagerImpl;
+import org.jboss.weld.util.ServiceLoader;
+
+public class ContainerBootstrap {
+
+	public ContainerBootstrap(
+		ContainerState containerState,
+		Collection<Metadata<Extension>> externalExtensions) {
+
+		_containerState = containerState;
+		_externalExtensions = externalExtensions;
+
+		BeansModel beansModel = _containerState.beansModel();
+
+		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 ComponentRuntimeExtension(_containerState),
+				_containerState.id()));
+
+		// Add extensions found from the bundle's classloader, such as those in the Bundle-ClassPath
+		for (Metadata<Extension> meta : ServiceLoader.load(Extension.class, _containerState.classLoader())) {
+			extensions.add(meta);
+		}
+
+		// Add external extensions
+		for (Metadata<Extension> meta : _externalExtensions) {
+			extensions.add(meta);
+		}
+
+		BeanDeploymentArchive beanDeploymentArchive = new ContainerDeploymentArchive(
+			_containerState.loader(), _containerState.id(), beansModel.getBeanClassNames(),
+			beansModel.getBeansXml());
+
+		Deployment deployment = new ContainerDeployment(extensions, beanDeploymentArchive);
+
+		_bootstrap = new WeldBootstrap();
+
+		_bootstrap.startExtensions(extensions);
+		_bootstrap.startContainer(_containerState.id(), new ContainerEnvironment(), deployment);
+
+		_beanManagerImpl = _bootstrap.getManager(beanDeploymentArchive);
+		_containerState.setBeanManager(_beanManagerImpl);
+
+		_bootstrap.startInitialization();
+		_bootstrap.deployBeans();
+	}
+
+	public BeanManagerImpl getBeanManagerImpl() {
+		return _beanManagerImpl;
+	}
+
+	public WeldBootstrap getBootstrap() {
+		return _bootstrap;
+	}
+
+	public void shutdown() {
+		_bootstrap.shutdown();
+	}
+
+	private final BeanManagerImpl _beanManagerImpl;
+	private final WeldBootstrap _bootstrap;
+	private final ContainerState _containerState;
+	private final Collection<Metadata<Extension>> _externalExtensions;
+
+}
\ No newline at end of file

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java Tue Sep  5 22:01:11 2017
@@ -24,9 +24,9 @@ import org.jboss.weld.bootstrap.spi.Bean
 import org.jboss.weld.bootstrap.spi.CDI11Deployment;
 import org.jboss.weld.bootstrap.spi.Metadata;
 
-public class BundleDeployment implements CDI11Deployment {
+public class ContainerDeployment implements CDI11Deployment {
 
-	public BundleDeployment(Iterable<Metadata<Extension>> extensions, BeanDeploymentArchive beanDeploymentArchive) {
+	public ContainerDeployment(Iterable<Metadata<Extension>> extensions, BeanDeploymentArchive beanDeploymentArchive) {
 		_extensions = extensions;
 		_beanDeploymentArchive = beanDeploymentArchive;
 

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java Tue Sep  5 22:01:11 2017
@@ -17,7 +17,6 @@ package org.apache.aries.cdi.container.i
 import java.util.Collection;
 import java.util.Collections;
 
-import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader;
 import org.jboss.weld.bootstrap.api.ServiceRegistry;
 import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
 import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
@@ -25,14 +24,12 @@ import org.jboss.weld.bootstrap.spi.Bean
 import org.jboss.weld.ejb.spi.EjbDescriptor;
 import org.jboss.weld.resources.spi.ResourceLoader;
 import org.jboss.weld.serialization.spi.ProxyServices;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.wiring.BundleWiring;
 
-public class BundleDeploymentArchive implements BeanDeploymentArchive {
+public class ContainerDeploymentArchive
+	implements BeanDeploymentArchive {
 
-	public BundleDeploymentArchive(
-		BundleWiring bundleWiring, String id, Collection<String> beanClassNames, BeansXml beansXml,
-		Bundle extenderBundle) {
+	public <T extends ResourceLoader & ProxyServices> ContainerDeploymentArchive(
+		T loader, String id, Collection<String> beanClassNames, BeansXml beansXml) {
 
 		_id = id;
 		_beanClassNames = beanClassNames;
@@ -41,10 +38,10 @@ public class BundleDeploymentArchive imp
 		_ejbs = Collections.emptyList();
 		_services = new SimpleServiceRegistry();
 
-		BundleResourcesLoader loader = new BundleResourcesLoader(bundleWiring, extenderBundle);
-
-		_services.add(ResourceLoader.class, loader);
-		_services.add(ProxyServices.class, loader);
+		if (loader != null) {
+			_services.add(ResourceLoader.class, loader);
+			_services.add(ProxyServices.class, loader);
+		}
 	}
 
 	@Override

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,98 @@
+/**
+ * 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.Collections;
+import java.util.List;
+
+import javax.enterprise.inject.spi.DefinitionException;
+import javax.enterprise.inject.spi.Extension;
+
+import org.apache.aries.cdi.container.internal.component.ComponentDiscoveryExtension;
+import org.apache.aries.cdi.container.internal.extension.ExtensionMetadata;
+import org.apache.aries.cdi.container.internal.model.BeansModel;
+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;
+
+public class ContainerDiscovery {
+
+	public static void discover(ContainerState containerState) {
+		String id = containerState.id() + "-discovery";
+
+		BeansModel beansModel = containerState.beansModel();
+
+		BeanDeploymentArchive beanDeploymentArchive = new ContainerDeploymentArchive(
+			containerState.loader(), id, beansModel.getBeanClassNames(),
+			beansModel.getBeansXml());
+
+		ExtensionMetadata extension = new ExtensionMetadata(
+			new ComponentDiscoveryExtension(beansModel), id);
+
+		List<Metadata<Extension>> extensions = Collections.singletonList(extension);
+
+		Deployment deployment = new ContainerDeployment(
+			Collections.singletonList(extension), beanDeploymentArchive);
+
+		WeldBootstrap _bootstrap = new WeldBootstrap();
+
+		_bootstrap.startExtensions(extensions);
+		_bootstrap.startContainer(id, new ContainerEnvironment(), deployment);
+		_bootstrap.startInitialization();
+		_bootstrap.deployBeans();
+		//_bootstrap.validateBeans();
+		//_bootstrap.endInitialization();
+		_bootstrap.shutdown();
+
+		validate(containerState);
+	}
+
+	private static void validate(ContainerState containerState) {
+		containerState.beansModel().getComponentModels().stream().forEach(
+			componentModel -> {
+				if (!componentModel.found()) {
+					throw new DefinitionException(
+						String.format(
+							"Did not find bean for <component> description %s",
+							componentModel));
+				}
+
+				componentModel.getReferences().stream().forEach(
+					referenceModel -> {
+						if (!referenceModel.found()) {
+							throw new DefinitionException(
+								String.format(
+									"Did not find injection point for <reference> description %s",
+									referenceModel));
+						}
+					}
+				);
+
+				componentModel.getConfigurations().stream().forEach(
+					configurationModel -> {
+						if (!configurationModel.found()) {
+							throw new DefinitionException(
+								String.format(
+									"Did not find injection point for <configuration> description %s",
+									configurationModel));
+						}
+					}
+				);
+			}
+		);
+	}
+
+}
\ No newline at end of file

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java Tue Sep  5 22:01:11 2017
@@ -20,9 +20,9 @@ import java.util.Set;
 import org.jboss.weld.bootstrap.api.Environment;
 import org.jboss.weld.bootstrap.api.Service;
 
-public class SimpleEnvironment implements Environment {
+public class ContainerEnvironment implements Environment {
 
-	public SimpleEnvironment() {
+	public ContainerEnvironment() {
 		_requiredBeanDeploymentArchiveServices = new HashSet<Class<? extends Service>>();
 		_requiredDeploymentServices = new HashSet<Class<? extends Service>>();
 	}

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,339 @@
+/**
+ * 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.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.ObserverMethod;
+import javax.enterprise.util.AnnotationLiteral;
+
+import org.apache.aries.cdi.container.internal.component.ComponentModel;
+import org.apache.aries.cdi.container.internal.configuration.ConfigurationCallback;
+import org.apache.aries.cdi.container.internal.extension.ExtensionDependency;
+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.Context;
+import org.apache.aries.cdi.container.internal.model.Registrator;
+import org.apache.aries.cdi.container.internal.model.Tracker;
+import org.apache.aries.cdi.container.internal.reference.ReferenceCallback;
+import org.apache.aries.cdi.container.internal.service.ServiceDeclaration;
+import org.jboss.weld.manager.BeanManagerImpl;
+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.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceObjects;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.service.cdi.CdiConstants;
+import org.osgi.service.cdi.CdiContainer;
+import org.osgi.service.cdi.CdiEvent;
+import org.osgi.service.cdi.CdiEvent.Type;
+import org.osgi.service.cdi.annotations.ServiceEvent;
+import org.osgi.service.cm.ManagedService;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ContainerState implements CdiContainer {
+
+	public static final AnnotationLiteral<Any> ANY = new AnnotationLiteral<Any>() {
+		private static final long serialVersionUID = 1L;
+	};
+
+	public ContainerState(
+		Bundle bundle, Bundle extenderBundle) {
+
+		_bundle = Optional.ofNullable(bundle);
+		_extenderBundle = extenderBundle;
+
+		Hashtable<String, Object> properties = new Hashtable<>();
+
+		properties.put(CdiConstants.CDI_CONTAINER_STATE, CdiEvent.Type.CREATING);
+
+		_bundle.ifPresent(
+			b -> {
+				_classLoader = new BundleClassLoader(
+					BundleResourcesLoader.getBundles(bundle, extenderBundle));
+				_registration = b.getBundleContext().registerService(CdiContainer.class, this, properties);
+			}
+		);
+
+		_context = new Context() {
+
+			@Override
+			public <T> T getService(ServiceReference<T> reference) {
+				return bundleContext().getService(reference);
+			}
+
+			@Override
+			public <T> ServiceObjects<T> getServiceObjects(ServiceReference<T> reference) {
+				return bundleContext().getServiceObjects(reference);
+			}
+
+			@Override
+			public <T> boolean ungetService(ServiceReference<T> reference) {
+				return bundleContext().ungetService(reference);
+			}
+
+		};
+
+		_msRegistrator = new Registrator<ManagedService>() {
+
+			public void registerService(String[] classNames, ManagedService service, Dictionary<String, ?> properties) {
+				registrations.add(bundleContext().registerService(ManagedService.class, service, properties));
+			}
+
+		};
+
+		_bmRegistrator = new Registrator<BeanManager>() {
+
+			@Override
+			public void registerService(String[] classNames, BeanManager service, Dictionary<String, ?> properties) {
+				registrations.add(bundleContext().registerService(BeanManager.class, service, properties));
+			}
+
+		};
+
+		_serviceRegistrator = new Registrator<Object>() {
+
+			@Override
+			public void registerService(String[] classNames, Object service, Dictionary<String, ?> properties) {
+				registrations.add(bundleContext().registerService(classNames, service, properties));
+			}
+
+		};
+
+		_tracker = new Tracker() {
+
+			@Override
+			public <T> void track(String targetFilter, ReferenceCallback callback) {
+				try {
+					Filter filter = bundleContext().createFilter(targetFilter);
+
+					trackers.add(new ServiceTracker<>(bundleContext(), filter, callback));
+				}
+				catch (InvalidSyntaxException ise) {
+					if (_log.isErrorEnabled()) {
+						_log.error("CDIe - Invalid filter syntax in {}", targetFilter, ise);
+					}
+				}
+			}
+
+		};
+	}
+
+	public Registrator<BeanManager> beanManagerRegistrator() {
+		return _bmRegistrator;
+	}
+
+	public BeansModel beansModel() {
+		return _beansModel;
+	}
+
+	public Bundle bundle() {
+		return _bundle.orElse(null);
+	}
+
+	public ClassLoader bundleClassLoader() {
+		return _bundle.map(b -> b.adapt(BundleWiring.class).getClassLoader()).orElse(getClass().getClassLoader());
+	}
+
+	public BundleContext bundleContext() {
+		return _bundle.map(b -> b.getBundleContext()).orElse(null);
+	}
+
+	public ClassLoader classLoader() {
+		return _bundle.map(b -> _classLoader).orElse(getClass().getClassLoader());
+	}
+
+	public synchronized void close() {
+		try {
+			if (_registration != null) {
+				_registration.unregister();
+			}
+		}
+		catch (Exception e) {
+			if (_log.isTraceEnabled()) {
+				_log.trace("Service already unregistered {}", _registration);
+			}
+		}
+	}
+
+	public Map<ComponentModel, Map<String, ConfigurationCallback>> configurationCallbacks() {
+		return _configurationCallbacksMap;
+	}
+
+	public Context context() {
+		return _context;
+	}
+
+	public Bundle extenderBundle() {
+		return _extenderBundle;
+	}
+
+	public List<ExtensionDependency> extensionDependencies() {
+		return _extensionDependencies;
+	}
+
+	public synchronized void fire(CdiEvent event) {
+		Type type = event.getType();
+
+		if ((_lastState == CdiEvent.Type.DESTROYING) &&
+			((type == CdiEvent.Type.WAITING_FOR_CONFIGURATIONS) ||
+			(type == CdiEvent.Type.WAITING_FOR_EXTENSIONS) ||
+			(type == CdiEvent.Type.WAITING_FOR_SERVICES))) {
+
+			return;
+		}
+
+		if (_log.isErrorEnabled() && (event.getCause() != null)) {
+			_log.error("CDIe - Event {}", event, event.getCause());
+		}
+		else if (_log.isDebugEnabled()) {
+			_log.debug("CDIe - Event {}", event);
+		}
+
+		updateState(event);
+
+		if (_beanManagerImpl != null) {
+			_beanManagerImpl.fireEvent(event);
+		}
+	}
+
+	public void fire(CdiEvent.Type state) {
+		fire(new CdiEvent(state, _bundle.orElse(null), _extenderBundle));
+	}
+
+	public void fire(CdiEvent.Type state, String payload) {
+		fire(new CdiEvent(state, _bundle.orElse(null), _extenderBundle, payload, null));
+	}
+
+	public void fire(CdiEvent.Type state, Throwable cause) {
+		fire(new CdiEvent(state, _bundle.orElse(null), _extenderBundle, null, cause));
+	}
+
+	@Override
+	public BeanManagerImpl getBeanManager() {
+		return _beanManagerImpl;
+	}
+
+	public String id() {
+		return _bundle.map(b -> b.getSymbolicName() + ":" + b.getBundleId()).orElse("null");
+	}
+
+	public CdiEvent.Type lastState() {
+		return _lastState;
+	}
+
+	@SuppressWarnings("unchecked")
+	public <T extends ResourceLoader & ProxyServices> T loader() {
+		return (T)_bundle.map(b -> new BundleResourcesLoader(b, _extenderBundle)).orElse(null);
+	}
+
+	public Registrator<ManagedService> managedServiceRegistrator() {
+		return _msRegistrator;
+	}
+
+	public Map<ComponentModel, Map<String, ReferenceCallback>> referenceCallbacks() {
+		return _referenceCallbacksMap;
+	}
+
+	public Map<ComponentModel, Map<String, ObserverMethod<ServiceEvent<?>>>> referenceObservers() {
+		return _referenceObserversMap;
+	}
+
+	public Map<ComponentModel, ServiceDeclaration> serviceComponents() {
+		return _serviceComponents;
+	}
+
+	public Registrator<Object> serviceRegistrator() {
+		return _serviceRegistrator;
+	}
+
+	public void setBeanManager(BeanManagerImpl beanManagerImpl) {
+		_beanManagerImpl = beanManagerImpl;
+	}
+
+	public void setBeansModel(BeansModel beansModel) {
+		_beansModel = beansModel;
+	}
+
+	public void setExtensionDependencies(List<ExtensionDependency> extensionDependencies) {
+		_extensionDependencies = extensionDependencies;
+	}
+
+	public Tracker tracker() {
+		return _tracker;
+	}
+
+	private synchronized void updateState(CdiEvent event) {
+		Type type = event.getType();
+
+		_lastState = type;
+
+		if (_registration == null) {
+			return;
+		}
+
+		ServiceReference<CdiContainer> reference = _registration.getReference();
+
+		if (type == reference.getProperty(CdiConstants.CDI_CONTAINER_STATE)) {
+			return;
+		}
+
+		Hashtable<String, Object> properties = new Hashtable<>();
+
+		for (String key : reference.getPropertyKeys()) {
+			properties.put(key, reference.getProperty(key));
+		}
+
+		properties.put(CdiConstants.CDI_CONTAINER_STATE, type);
+
+		_registration.setProperties(properties);
+	}
+
+	private static final Logger _log = LoggerFactory.getLogger(ContainerState.class);
+
+	private volatile BeanManagerImpl _beanManagerImpl;
+	private BeansModel _beansModel;
+	private final Registrator<BeanManager> _bmRegistrator;
+	private final Optional<Bundle> _bundle;
+	private ClassLoader _classLoader;
+	private final Map<ComponentModel, Map<String, ConfigurationCallback>> _configurationCallbacksMap = new ConcurrentHashMap<>();
+	private final Context _context;
+	private final Bundle _extenderBundle;
+	private List<ExtensionDependency> _extensionDependencies;
+	private CdiEvent.Type _lastState = CdiEvent.Type.CREATING;
+	private final Registrator<ManagedService> _msRegistrator;
+	private final Map<ComponentModel, Map<String, ReferenceCallback>> _referenceCallbacksMap = new ConcurrentHashMap<>();
+	private final Map<ComponentModel, Map<String, ObserverMethod<ServiceEvent<?>>>> _referenceObserversMap = new ConcurrentHashMap<>();
+	private ServiceRegistration<CdiContainer> _registration;
+	private final Map<ComponentModel, ServiceDeclaration> _serviceComponents = new ConcurrentHashMap<>();
+	private final Registrator<Object> _serviceRegistrator;
+	private final Tracker _tracker;
+
+}
\ No newline at end of file

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java Tue Sep  5 22:01:11 2017
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.container.internal.bean;
+package org.apache.aries.cdi.container.internal.context;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
@@ -91,7 +91,11 @@ public class BundleContextBean implement
 
 	@Override
 	public String toString() {
-		return "BundleContextBean[bundleContext]";
+		if (_string == null) {
+			_string = String.format("BundleContext[%s]", _bundleContext);
+		}
+
+		return _string;
 	}
 
 	private static final Set<Annotation> DEFAULT_QUALIFIERS = Sets.hashSet(
@@ -99,5 +103,6 @@ public class BundleContextBean implement
 	private static final Set<Type> TYPES = Sets.immutableHashSet(BundleContext.class, Object.class);
 
 	private final BundleContext _bundleContext;
+	private volatile String _string;
 
 }
\ No newline at end of file

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,47 @@
+/**
+ * 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.context;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Extension;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BundleContextExtension implements Extension {
+
+	public BundleContextExtension(BundleContext bundleContext) {
+		_bundleContext = bundleContext;
+	}
+
+	void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager manager) {
+		if (_log.isDebugEnabled()) {
+			_log.debug("CDIe - Adding BundleContext {}", _bundleContext);
+		}
+
+		abd.addBean(new BundleContextBean(_bundleContext));
+
+		if (_log.isDebugEnabled()) {
+			_log.debug("CDIe - BundleContext added {}", _bundleContext);
+		}
+	}
+
+	private static final Logger _log = LoggerFactory.getLogger(BundleContextExtension.class);
+
+	private final BundleContext _bundleContext;
+}

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java Tue Sep  5 22:01:11 2017
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.container.internal.container;
+package org.apache.aries.cdi.container.internal.extension;
 
 import javax.enterprise.inject.spi.Extension;
 

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java Tue Sep  5 22:01:11 2017
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.container.internal.container;
+package org.apache.aries.cdi.container.internal.extension;
 
 import javax.enterprise.inject.spi.Extension;
 

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java Tue Sep  5 22:01:11 2017
@@ -12,23 +12,20 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.container.internal.container;
+package org.apache.aries.cdi.container.internal.literal;
 
-import javax.enterprise.inject.spi.BeanManager;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-import org.osgi.service.cdi.CdiContainer;
+import javax.inject.Qualifier;
 
-public class CdiContainerService implements CdiContainer {
+@Qualifier
+@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
+@Retention(value = RetentionPolicy.RUNTIME)
+public @interface CdiMark {
 
-	@Override
-	public BeanManager getBeanManager() {
-		return _beanManager;
-	}
+	int value();
 
-	public void setBeanManager(BeanManager beanManager) {
-		_beanManager = beanManager;
-	}
-
-	private volatile BeanManager _beanManager;
-
-}
\ No newline at end of file
+}

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java Tue Sep  5 22:01:11 2017
@@ -12,18 +12,27 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.container.internal.container;
+package org.apache.aries.cdi.container.internal.literal;
 
-import java.util.AbstractMap.SimpleImmutableEntry;
+import javax.enterprise.util.AnnotationLiteral;
 
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.ManagedService;
-
-class Entry extends SimpleImmutableEntry<ConfigurationManagedService, ServiceRegistration<ManagedService>> {
+public class CdiMarkLiteral extends AnnotationLiteral<CdiMark> implements CdiMark {
 
 	private static final long serialVersionUID = 1L;
 
-	public Entry(ConfigurationManagedService key, ServiceRegistration<ManagedService> value) {
-		super(key, value);
+	public static CdiMark from(int i) {
+		return new CdiMarkLiteral(i);
+	}
+
+	public CdiMarkLiteral(int i) {
+		_value = i;
 	}
-}
\ No newline at end of file
+
+	@Override
+	public int value() {
+		return _value;
+	}
+
+	private final int _value;
+
+}

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,79 @@
+/**
+ * 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.literal;
+
+import javax.enterprise.util.AnnotationLiteral;
+
+import org.apache.aries.cdi.container.internal.util.Strings;
+import org.osgi.service.cdi.annotations.Component;
+import org.osgi.service.cdi.annotations.ServiceScope;
+
+public class ComponentLiteral extends AnnotationLiteral<Component> implements Component {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * @param name the name of the component bean
+	 * @return a literal instance of {@link Component}
+	 */
+	public static ComponentLiteral from(String name) {
+		return new ComponentLiteral(name, new Class<?>[0], Strings.EMPTY_ARRAY, ServiceScope.DEFAULT);
+	}
+
+	/**
+	 * @param name the name of the component bean
+	 * @param types an array of types under which to publish the service
+	 * @param properties the set of properties for the service
+	 * @return a literal instance of {@link Component}
+	 */
+	public static ComponentLiteral from(String name, Class<?>[] types, String[] properties, ServiceScope scope) {
+		return new ComponentLiteral(name, types, properties, scope);
+	}
+
+	public ComponentLiteral(
+		String name, Class<?>[] types, String[] properties, ServiceScope scope) {
+
+		_name = name;
+		_types = types;
+		_properties = properties;
+		_scope = scope;
+	}
+
+	@Override
+	public Class<?>[] service() {
+		return _types;
+	}
+
+	@Override
+	public String[] property() {
+		return _properties;
+	}
+
+	@Override
+	public String name() {
+		return _name;
+	}
+
+	@Override
+	public ServiceScope serviceScope() {
+		return _scope;
+	}
+
+	private final String _name;
+	private final String[] _properties;
+	private final ServiceScope _scope;
+	private final Class<?>[] _types;
+
+}

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java Tue Sep  5 22:01:11 2017
@@ -17,29 +17,21 @@ package org.apache.aries.cdi.container.i
 import javax.enterprise.util.AnnotationLiteral;
 
 import org.osgi.service.cdi.annotations.Configuration;
+import org.osgi.service.cdi.annotations.ConfigurationPolicy;
 
 public class ConfigurationLiteral extends AnnotationLiteral<Configuration> implements Configuration {
 
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * @param pids an array of configuration pids
-	 * @return a literal instance of {@link Configuration}
-	 */
-	public static ConfigurationLiteral from(String[] pids) {
-		return new ConfigurationLiteral(pids);
-	}
+	public static final Configuration INSTANCE = new ConfigurationLiteral(
+		new String[] {Configuration.NAME}, ConfigurationPolicy.OPTIONAL);
 
-	/**
-	 * @param pids an array of configuration pids
-	 */
-	public ConfigurationLiteral(String[] pids) {
+	public ConfigurationLiteral(String[] pids, ConfigurationPolicy configurationPolicy) {
 		_pids = pids;
+		_configurationPolicy = configurationPolicy;
 	}
 
 	@Override
-	public boolean required() {
-		return true;
+	public ConfigurationPolicy configurationPolicy() {
+		return _configurationPolicy;
 	}
 
 	@Override
@@ -47,6 +39,9 @@ public class ConfigurationLiteral extend
 		return _pids;
 	}
 
+	private static final long serialVersionUID = 1L;
+
+	private final ConfigurationPolicy _configurationPolicy;
 	private final String[] _pids;
 
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java Tue Sep  5 22:01:11 2017
@@ -14,9 +14,14 @@
 
 package org.apache.aries.cdi.container.internal.literal;
 
+import java.util.Objects;
+
 import javax.enterprise.util.AnnotationLiteral;
 
 import org.osgi.service.cdi.annotations.Reference;
+import org.osgi.service.cdi.annotations.ReferenceCardinality;
+import org.osgi.service.cdi.annotations.ReferencePolicy;
+import org.osgi.service.cdi.annotations.ReferencePolicyOption;
 import org.osgi.service.cdi.annotations.ReferenceScope;
 
 public class ReferenceLiteral extends AnnotationLiteral<Reference> implements Reference {
@@ -32,24 +37,79 @@ public class ReferenceLiteral extends An
 	}
 
 	public ReferenceLiteral(String target) {
+		this(
+			_blank,
+			Object.class,
+			ReferenceCardinality.DEFAULT,
+			ReferencePolicy.DEFAULT,
+			ReferencePolicyOption.DEFAULT,
+			ReferenceScope.DEFAULT,
+			target);
+	}
+
+	public ReferenceLiteral(
+		String name,
+		Class<?> service,
+		ReferenceCardinality cardinality,
+		ReferencePolicy policy,
+		ReferencePolicyOption option,
+		ReferenceScope scope,
+		String target) {
+
+		Objects.requireNonNull(target);
+
+		_name = name;
+		_service = service;
+		_cardinality = cardinality;
+		_policy = policy;
+		_option = option;
+		_scope = scope;
 		_target = target;
 	}
 
 	@Override
-	public ReferenceScope scope() {
-		return ReferenceScope.BUNDLE;
+	public ReferenceCardinality cardinality() {
+		return _cardinality;
 	}
 
 	@Override
-	public String target() {
-		return _target;
+	public String name() {
+		return _name;
+	}
+
+	@Override
+	public ReferencePolicy policy() {
+		return _policy;
+	}
+
+	@Override
+	public ReferencePolicyOption policyOption() {
+		return _option;
+	}
+
+	@Override
+	public ReferenceScope scope() {
+		return _scope;
 	}
 
 	@Override
 	public Class<?> service() {
-		return Object.class;
+		return _service;
 	}
 
+	@Override
+	public String target() {
+		return _target;
+	}
+
+	private final static String _blank = "";
+
+	private final ReferenceCardinality _cardinality;
+	private final String _name;
+	private final ReferencePolicyOption _option;
+	private final ReferencePolicy _policy;
+	private final ReferenceScope _scope;
+	private final Class<?> _service;
 	private final String _target;
 
-}
+}
\ No newline at end of file

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java&r1=1806482&r2=1807424&rev=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java Tue Sep  5 22:01:11 2017
@@ -16,48 +16,17 @@ package org.apache.aries.cdi.container.i
 
 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 class AbstractLoader implements ProxyServices, ResourceLoader {
 
-	public BundleResourcesLoader(BundleWiring bundleWiring, Bundle extenderBundle) {
-		BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class);
-
-		List<Bundle> bundles = new ArrayList<>();
-
-		bundles.add(bundleWiring.getBundle());
-		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);
-			}
-		}
-
-		_classLoader = new BundleClassLoader(bundles.toArray(new Bundle[0]));
+	public AbstractLoader(ClassLoader classLoader) {
+		_classLoader = classLoader;
 	}
 
 	@Override

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java Tue Sep  5 22:01:11 2017
@@ -26,7 +26,7 @@ import org.osgi.framework.Bundle;
 
 public class BundleClassLoader extends URLClassLoader {
 
-	public BundleClassLoader(Bundle... bundles) {
+	public BundleClassLoader(Bundle[] bundles) {
 		super(new URL[0]);
 
 		if (bundles.length == 0) {
@@ -83,41 +83,43 @@ public class BundleClassLoader extends U
 
 	@Override
 	protected Class<?> findClass(String name) throws ClassNotFoundException {
-		for (Bundle bundle : _bundles) {
-			try {
-				return bundle.loadClass(name);
-			}
-			catch (ClassNotFoundException cnfe) {
-				continue;
+		Object classLoadingLock = getClassLoadingLock(name);
+
+		synchronized (classLoadingLock) {
+			for (Bundle bundle : _bundles) {
+				try {
+					return bundle.loadClass(name);
+				}
+				catch (ClassNotFoundException cnfe) {
+					continue;
+				}
 			}
-		}
 
-		throw new ClassNotFoundException(name);
+			throw new ClassNotFoundException(name);
+		}
 	}
 
 	@Override
 	protected Class<?> loadClass(String name, boolean resolve)
 		throws ClassNotFoundException {
 
-		Class<?> clazz = _cache.get(name);
+		Object classLoadingLock = getClassLoadingLock(name);
+
+		synchronized (classLoadingLock) {
+			Class<?> clazz = _cache.get(name);
 
-		if (clazz == null) {
-			synchronized (this) {
+			if (clazz == null) {
 				clazz = findClass(name);
 
 				if (resolve) {
 					resolveClass(clazz);
 				}
 
-				Class<?> existing = _cache.putIfAbsent(name, clazz);
-
-				if (existing != null) {
-					clazz = existing;
-				}
+				_cache.put(name, clazz);
 			}
-		}
 
-		return clazz;
+			return clazz;
+		}
 	}
 
 	private final Bundle[] _bundles;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java Tue Sep  5 22:01:11 2017
@@ -33,12 +33,12 @@ import org.osgi.framework.wiring.BundleW
 
 public class BundleResourcesLoader implements ProxyServices, ResourceLoader {
 
-	public BundleResourcesLoader(BundleWiring bundleWiring, Bundle extenderBundle) {
+	public BundleResourcesLoader(Bundle bundle, Bundle extenderBundle) {
 		BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class);
 
 		List<Bundle> bundles = new ArrayList<>();
 
-		bundles.add(bundleWiring.getBundle());
+		bundles.add(bundle);
 		bundles.add(extenderBundle);
 
 		List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE);
@@ -60,6 +60,7 @@ public class BundleResourcesLoader imple
 		_classLoader = new BundleClassLoader(bundles.toArray(new Bundle[0]));
 	}
 
+
 	@Override
 	public void cleanup() {
 	}
@@ -109,4 +110,30 @@ public class BundleResourcesLoader imple
 
 	private final ClassLoader _classLoader;
 
+	public static 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]);
+	}
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java Tue Sep  5 22:01:11 2017
@@ -30,6 +30,8 @@ import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.aries.cdi.container.internal.util.Throw;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXNotRecognizedException;
@@ -37,6 +39,10 @@ import org.xml.sax.SAXNotSupportedExcept
 
 public abstract class AbstractModelBuilder {
 
+	static final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+	static final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
+	static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
+
 	public BeansModel build() {
 		List<URL> beanDescriptorURLs = new ArrayList<URL>();
 		List<URL> osgiBeanDescriptorURLs = new ArrayList<URL>();
@@ -73,21 +79,21 @@ public abstract class AbstractModelBuild
 		return parse(osgiBeanDescriptorURLs, beanDescriptorURLs);
 	}
 
-	abstract Map<String, Object> getAttributes();
+	public abstract Map<String, Object> getAttributes();
 
-	abstract ClassLoader getClassLoader();
+	public abstract ClassLoader getClassLoader();
 
-	abstract URL getResource(String resource);
+	public abstract URL getResource(String resource);
 
-	abstract List<String> getDefaultResources();
+	public abstract List<String> getDefaultResources();
 
 	private OSGiBeansHandler getHandler(List<URL> beanDescriptorURLs) {
-		return new OSGiBeansHandler(beanDescriptorURLs);
+		return new OSGiBeansHandler(beanDescriptorURLs, getClassLoader());
 	}
 
 	private BeansModel parse(List<URL> osgiBeansDescriptorURLs, List<URL> beanDescriptorURLs) {
 		SAXParserFactory factory = SAXParserFactory.newInstance();
-		factory.setValidating(false);
+		factory.setValidating(true);
 		factory.setNamespaceAware(true);
 
 		if (osgiBeansDescriptorURLs.isEmpty()) {
@@ -98,6 +104,14 @@ public abstract class AbstractModelBuild
 
 		try {
 			parser = factory.newSAXParser();
+
+			try {
+				parser.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA);
+				parser.setProperty(SCHEMA_SOURCE, loadXsds());
+			}
+			catch (SAXNotRecognizedException | SAXNotSupportedException e) {
+				// No op, we just don't validate the XML
+			}
 		}
 		catch (ParserConfigurationException | SAXException e) {
 			return Throw.exception(e);
@@ -110,17 +124,9 @@ public abstract class AbstractModelBuild
 				InputSource source = new InputSource(inputStream);
 
 				if (source.getByteStream().available() == 0) {
-					throw new IllegalArgumentException(
-						"Specified osgi-beans descriptor is empty: " + osgiBeansDescriptorURL);
-				}
+					_log.warn("CDIe - Ignoring {} because it contains 0 bytes", osgiBeansDescriptorURL);
 
-				try {
-					parser.setProperty(
-						"http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
-					parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", loadXsds());
-				}
-				catch (IllegalArgumentException | SAXNotRecognizedException | SAXNotSupportedException e) {
-					// No op, we just don't validate the XML
+					continue;
 				}
 
 				parser.parse(source, handler);
@@ -156,4 +162,6 @@ public abstract class AbstractModelBuild
 		return xsds.toArray(new InputSource[0]);
 	}
 
+	private static final Logger _log = LoggerFactory.getLogger(AbstractModelBuilder.class);
+
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java Tue Sep  5 22:01:11 2017
@@ -16,21 +16,19 @@ package org.apache.aries.cdi.container.i
 
 import java.net.URL;
 import java.util.Collection;
+import java.util.Map;
 
+import org.apache.aries.cdi.container.internal.component.ComponentModel;
 import org.jboss.weld.bootstrap.spi.BeansXml;
 import org.jboss.weld.xml.BeansXmlParser;
 
 public class BeansModel {
 
 	public BeansModel(
-		Collection<String> beanClasses, Collection<ConfigurationModel> configurationModels,
-		Collection<ReferenceModel> referenceModels, Collection<ServiceModel> serviceModels,
+		Map<String, ComponentModel> components,
 		Collection<URL> beanDescriptorURLs) {
 
-		_beanClasses = beanClasses;
-		_configurationModels = configurationModels;
-		_referenceModels = referenceModels;
-		_serviceModels = serviceModels;
+		_components = components;
 
 		BeansXml beansXml = BeansXml.EMPTY_BEANS_XML;
 
@@ -42,30 +40,31 @@ public class BeansModel {
 		_beansXml = beansXml;
 	}
 
+	public void addComponentModel(String componentClass, ComponentModel componentModel) {
+		_components.put(componentClass, componentModel);
+	}
+
 	public Collection<String> getBeanClassNames() {
-		return _beanClasses;
+		return _components.keySet();
 	}
 
 	public BeansXml getBeansXml() {
 		return _beansXml;
 	}
 
-	public Collection<ConfigurationModel> getConfigurationModels() {
-		return _configurationModels;
+	public ComponentModel getComponentModel(String componentClass) {
+		return _components.get(componentClass);
 	}
 
-	public Collection<ReferenceModel> getReferenceModels() {
-		return _referenceModels;
+	public Collection<ComponentModel> getComponentModels() {
+		return _components.values();
 	}
 
-	public Collection<ServiceModel> getServiceModels() {
-		return _serviceModels;
+	public void removeComponentModel(String beanClassName) {
+		_components.remove(beanClassName);
 	}
 
-	private final Collection<String> _beanClasses;
 	private final BeansXml _beansXml;
-	private final Collection<ConfigurationModel> _configurationModels;
-	private final Collection<ReferenceModel> _referenceModels;
-	private final Collection<ServiceModel> _serviceModels;
+	private final Map<String, ComponentModel> _components;
 
 }
\ No newline at end of file

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java?rev=1807424&r1=1807423&r2=1807424&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java Tue Sep  5 22:01:11 2017
@@ -31,9 +31,9 @@ import org.osgi.framework.wiring.BundleW
 
 public class BeansModelBuilder extends AbstractModelBuilder {
 
-	public BeansModelBuilder(BundleWiring bundleWiring, Bundle extenderBundle) {
+	public BeansModelBuilder(ClassLoader classLoader, BundleWiring bundleWiring) {
+		_classLoader = classLoader;
 		_bundleWiring = bundleWiring;
-		_extenderBundle = extenderBundle;
 		_bundle = _bundleWiring.getBundle();
 
 		List<BundleWire> wires = bundleWiring.getRequiredWires(EXTENDER_NAMESPACE);
@@ -56,28 +56,28 @@ public class BeansModelBuilder extends A
 	}
 
 	@Override
-	Map<String, Object> getAttributes() {
+	public Map<String, Object> getAttributes() {
 		return _attributes;
 	}
 
 	@Override
-	ClassLoader getClassLoader() {
-		return _extenderBundle.adapt(BundleWiring.class).getClassLoader();
+	public ClassLoader getClassLoader() {
+		return _classLoader;
 	}
 
 	@Override
-	URL getResource(String resource) {
+	public URL getResource(String resource) {
 		return _bundle.getResource(resource);
 	}
 
 	@Override
-	List<String> getDefaultResources() {
+	public List<String> getDefaultResources() {
 		return new ArrayList<>(_bundleWiring.listResources("OSGI-INF/cdi", "*.xml", BundleWiring.LISTRESOURCES_LOCAL));
 	}
 
 	private final Map<String, Object> _attributes;
 	private final Bundle _bundle;
+	private final ClassLoader _classLoader;
 	private final BundleWiring _bundleWiring;
-	private final Bundle _extenderBundle;
 
 }

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java?rev=1807424&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java Tue Sep  5 22:01:11 2017
@@ -0,0 +1,73 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.container.internal.model;
+
+public enum CollectionType {
+	/**
+	 * The service collection type is used to indicate the collection holds the
+	 * bound service objects.
+	 * <p>
+	 * This is the default collection type.
+	 */
+	SERVICE("service"),
+
+	/**
+	 * The reference collection type is used to indicate the collection holds
+	 * Service References for the bound services.
+	 */
+	REFERENCE("reference"),
+
+	/**
+	 * The serviceobjects collection type is used to indicate the collection
+	 * holds Component Service Objects for the bound services.
+	 */
+	SERVICEOBJECTS("serviceobjects"),
+
+	/**
+	 * The properties collection type is used to indicate the collection holds
+	 * unmodifiable Maps containing the service properties of the bound
+	 * services.
+	 * <p>
+	 * The Maps must implement {@code Comparable} with the {@code compareTo}
+	 * method comparing service property maps using the same ordering as
+	 * {@code ServiceReference.compareTo} based upon service ranking and service
+	 * id.
+	 */
+	PROPERTIES("properties"),
+
+	/**
+	 * The tuple collection type is used to indicate the collection holds
+	 * unmodifiable Map.Entries whose key is an unmodifiable Map containing the
+	 * service properties of the bound service, as specified in
+	 * {@link #PROPERTIES}, and whose value is the bound service object.
+	 * <p>
+	 * The Map.Entries must implement {@code Comparable} with the
+	 * {@code compareTo} method comparing service property maps using the same
+	 * ordering as {@code ServiceReference.compareTo} based upon service ranking
+	 * and service id.
+	 */
+	TUPLE("tuple");
+
+	private final String value;
+
+	CollectionType(String value) {
+		this.value = value;
+	}
+
+	@Override
+	public String toString() {
+		return value;
+	}
+}