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;
+       }
+}


Reply via email to