You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2018/04/14 01:09:11 UTC

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

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Constants.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Constants.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Constants.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/Constants.java Sat Apr 14 01:09:09 2018
@@ -27,29 +27,10 @@ public class Constants {
 	public static final String CDI10_URI = "http://www.osgi.org/xmlns/cdi/v1.0.0";
 	public static final Set<String> CDI_URIS = Sets.immutableHashSet(CDI10_URI);
 
-	public static final String ARRAY_ELEMENT = "array";
-	public static final String CARDINALITY_ATTRIBUTE = "cardinality";
+	public static final String BEAN_ELEMENT = "bean";
 	public static final String CLASS_ATTRIBUTE = "class";
-	public static final String COMPONENT_ELEMENT = "component";
-	public static final String CONFIGURATION_ELEMENT = "configuration";
-	public static final String CONFIGURATION_PID_ATTRIBUTE = "configuration-pid";
-	public static final String CONFIGURATION_POLICY_ATTRIBUTE = "configuration-policy";
-	public static final String INTERFACE_ATTRIBUTE = "interface";
-	public static final String LIST_ELEMENT = "list";
 	public static final String NAME_ATTRIBUTE = "name";
-	public static final String POLICY_ATTRIBUTE = "policy";
-	public static final String POLICY_OPTION_ATTRIBUTE = "policy-option";
-	public static final String PROPERTY_ELEMENT = "property";
-	public static final String PROVIDE_ELEMENT = "provide";
-	public static final String REFERENCE_ELEMENT = "reference";
-	public static final String SCOPE_ATTRIBUTE= "scope";
-	public static final String SERVICE_ATTRIBUTE = "service";
-	public static final String SERVICE_SCOPE_ATTRIBUTE = "service-scope";
-	public static final String SET_ELEMENT = "set";
-	public static final String TARGET_ATTRIBUTE = "target";
-	public static final String TYPE_ATTRIBUTE = "type";
-	public static final String VALUE_ATTRIBUTE = "value";
-	public static final String VALUE_ELEMENT = "value";
-	public static final String VALUE_TYPE_ATTRIBUTE = "value-type";
+	public static final String QUALIFIER_BLACKLIST_ELEMENT = "qualifier-blacklist";
+	public static final String QUALIFIER_ELEMENT = "qualifier";
 
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/OSGiBeansHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/OSGiBeansHandler.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/OSGiBeansHandler.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/OSGiBeansHandler.java Sat Apr 14 01:09:09 2018
@@ -14,34 +14,22 @@
 
 package org.apache.aries.cdi.container.internal.model;
 
-import static org.apache.aries.cdi.container.internal.model.Constants.ARRAY_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.CLASS_ATTRIBUTE;
+import static org.apache.aries.cdi.container.internal.model.Constants.BEAN_ELEMENT;
 import static org.apache.aries.cdi.container.internal.model.Constants.CDI10_URI;
 import static org.apache.aries.cdi.container.internal.model.Constants.CDI_URIS;
-import static org.apache.aries.cdi.container.internal.model.Constants.COMPONENT_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.CONFIGURATION_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.INTERFACE_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.LIST_ELEMENT;
+import static org.apache.aries.cdi.container.internal.model.Constants.CLASS_ATTRIBUTE;
 import static org.apache.aries.cdi.container.internal.model.Constants.NAME_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.PROPERTY_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.PROVIDE_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.REFERENCE_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.SERVICE_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.SET_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.TYPE_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.VALUE_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.VALUE_ELEMENT;
-import static org.apache.aries.cdi.container.internal.model.Constants.VALUE_TYPE_ATTRIBUTE;
+import static org.apache.aries.cdi.container.internal.model.Constants.QUALIFIER_ELEMENT;
 
 import java.net.URL;
-import java.util.Formatter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.aries.cdi.container.internal.component.ComponentModel;
-import org.apache.aries.cdi.container.internal.configuration.ConfigurationModel;
-import org.apache.aries.cdi.container.internal.reference.ReferenceModel;
+import org.apache.aries.cdi.container.internal.component.OSGiBean;
+import org.apache.aries.cdi.container.internal.exception.BeanElementException;
+import org.apache.aries.cdi.container.internal.exception.BlacklistQualifierException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;
@@ -56,148 +44,51 @@ public class OSGiBeansHandler extends De
 	}
 
 	public BeansModel createBeansModel() {
-		return new BeansModel(_components, _beanDescriptorURLs);
-	}
-
-	@Override
-	public void characters(char[] c, int start, int length) {
-		if (_propertySB == null) {
-			return;
-		}
-
-		_propertySB.append(c, start, length);
+		return new BeansModel(_beans, _qualifierBlackList, _errors, _beanDescriptorURLs);
 	}
 
 	@Override
 	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-		if (matches(ARRAY_ELEMENT, uri, localName) && (_propertyValue == null)) {
-			_collectionType = CollectionType.ARRAY;
-		}
-		if (matches(COMPONENT_ELEMENT, uri, localName)) {
-			try {
-				Class<?> clazz = _classLoader.loadClass(
-					Model.getValue(CDI10_URI, CLASS_ATTRIBUTE, attributes));
+		if (matches(BEAN_ELEMENT, uri, localName)) {
+			String className = Model.getValue(CDI10_URI, CLASS_ATTRIBUTE, attributes);
 
-				_componentModel = new ComponentModel.Builder(clazz).attributes(attributes);
-			}
-			catch (ClassNotFoundException cnfe) {
-				if (_log.isErrorEnabled()) {
-					_log.error("CDIe - {}", cnfe.getMessage(), cnfe);
-				}
-			}
-		}
-		if (matches(CONFIGURATION_ELEMENT, uri, localName)) {
 			try {
-				Class<?> clazz = _classLoader.loadClass(
-					Model.getValue(CDI10_URI, TYPE_ATTRIBUTE, attributes));
+				Class<?> clazz = _classLoader.loadClass(className);
 
-				_componentModel.configuration(new ConfigurationModel.Builder(clazz).attributes(attributes).build());
+				_beanModel = new OSGiBean.Builder(clazz);
 			}
-			catch (ClassNotFoundException cnfe) {
-				if (_log.isErrorEnabled()) {
-					_log.error("CDIe - {}", cnfe.getMessage(), cnfe);
-				}
+			catch (ReflectiveOperationException roe) {
+				_errors.add(
+					new BeanElementException(
+						"Error loading bean class from element: " + className,
+						roe));
 			}
 		}
-		if (matches(LIST_ELEMENT, uri, localName) && (_propertyValue == null)) {
-			_collectionType = CollectionType.LIST;
-		}
-		if (matches(PROPERTY_ELEMENT, uri, localName)) {
-			_propertyName = attributes.getValue(NAME_ATTRIBUTE).trim();
-			_propertyType = attributes.getValue(VALUE_TYPE_ATTRIBUTE);
-			if (_propertyType == null) {
-				_propertyType = "String";
-			}
-			String value = attributes.getValue(uri, VALUE_ATTRIBUTE);
-			if (value != null) {
-				_propertyValue = value.trim();
-			}
-			else {
-				_propertySB = new StringBuilder();
-			}
-		}
-		if (matches(PROVIDE_ELEMENT, uri, localName)) {
-			String value = attributes.getValue(INTERFACE_ATTRIBUTE).trim();
-			_componentModel.provide(value);
-		}
-		if (matches(REFERENCE_ELEMENT, uri, localName)) {
-			try {
-				Class<?> clazz = _classLoader.loadClass(
-					Model.getValue(CDI10_URI, SERVICE_ATTRIBUTE, attributes));
+		if (matches(QUALIFIER_ELEMENT, uri, localName)) {
+			String className = Model.getValue(CDI10_URI, NAME_ATTRIBUTE, attributes);
 
-				_referenceModel = new ReferenceModel.Builder(attributes).service(clazz).build();
+			try {
+				_qualifier = _classLoader.loadClass(className);
 			}
-			catch (ClassNotFoundException cnfe) {
-				if (_log.isErrorEnabled()) {
-					_log.error("CDIe - {}", cnfe.getMessage(), cnfe);
-				}
+			catch (ReflectiveOperationException roe) {
+				_errors.add(
+					new BlacklistQualifierException(
+						"Error loading blacklisted qualifier from element: " + className,
+						roe));
 			}
 		}
-		if (matches(SET_ELEMENT, uri, localName) && (_propertyValue == null)) {
-			_collectionType = CollectionType.SET;
-		}
-		if (matches(VALUE_ELEMENT, uri, localName) && (_collectionType != null)) {
-			_propertySB = new StringBuilder();
-		}
 	}
 
 	@Override
 	public void endElement(String uri, String localName, String qName) throws SAXException {
-		if (matches(ARRAY_ELEMENT, uri, localName)) {
-			_collectionType = null;
-		}
-		if (matches(COMPONENT_ELEMENT, uri, localName)) {
-			ComponentModel componentModel = _componentModel.build();
-			_components.put(componentModel.getBeanClass().getName(), componentModel);
-			_componentModel = null;
-		}
-		if (matches(LIST_ELEMENT, uri, localName)) {
-			_collectionType = null;
-		}
-		if (matches(PROPERTY_ELEMENT, uri, localName)) {
-			if ((_propertyValue == null) && (_propertySB != null)) {
-				_propertyValue = _propertySB.toString().trim();
-			}
-			if (_propertyValue != null) {
-				try (Formatter f = new Formatter()) {
-					f.format("%s:%s=%s", _propertyName, _propertyType, _propertyValue);
-					_componentModel.property(f.toString());
-				}
-			}
-			_propertySB = null;
-			_propertyName = null;
-			_propertyType = null;
-			_propertyValue = null;
-		}
-		if (matches(REFERENCE_ELEMENT, uri, localName)) {
-			_componentModel.reference(_referenceModel);
-			_referenceModel = null;
-		}
-		if (matches(SET_ELEMENT, uri, localName)) {
-			_collectionType = null;
-		}
-		if (matches(VALUE_ELEMENT, uri, localName) && (_collectionType != null)) {
-			StringBuilder sb = new StringBuilder();
-			sb.append(_propertyName);
-			sb.append(":");
-			if (_collectionType == CollectionType.LIST) {
-				sb.append("List<");
-				sb.append(_propertyType);
-				sb.append(">");
-			}
-			else if (_collectionType == CollectionType.SET) {
-				sb.append("Set<");
-				sb.append(_propertyType);
-				sb.append(">");
-			}
-			else {
-				sb.append(_propertyType);
-			}
-			sb.append("=");
-			sb.append(_propertySB.toString().trim());
-
-			_componentModel.property(sb.toString());
-			_propertySB = null;
+		if (matches(BEAN_ELEMENT, uri, localName)) {
+			OSGiBean osgiBean = _beanModel.build();
+			_beans.put(osgiBean.getBeanClass().getName(), osgiBean);
+			_beanModel = null;
+		}
+		if (matches(QUALIFIER_ELEMENT, uri, localName) && (_qualifier != null)) {
+			_qualifierBlackList.add(_qualifier);
+			_qualifier = null;
 		}
 	}
 
@@ -208,22 +99,15 @@ public class OSGiBeansHandler extends De
 		return false;
 	}
 
-	enum CollectionType {
-		ARRAY, LIST, SET
-	}
-
 	private final static Logger _log = LoggerFactory.getLogger(
 		OSGiBeansHandler.class);
 
 	private final ClassLoader _classLoader;
-	private final Map<String, ComponentModel> _components = new HashMap<>();
+	private final Map<String, OSGiBean> _beans = new HashMap<>();
 	private final List<URL> _beanDescriptorURLs;
-	private String _propertyName;
-	private StringBuilder _propertySB;
-	private String _propertyType;
-	private String _propertyValue;
-	private CollectionType _collectionType;
-	private ReferenceModel _referenceModel;
-	private ComponentModel.Builder _componentModel;
+	private OSGiBean.Builder _beanModel;
+	private List<Throwable> _errors = new ArrayList<>();
+	private Class<?> _qualifier;
+	private final List<Class<?>> _qualifierBlackList = new ArrayList<>();
 
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ObserverMethodAnnotated.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ObserverMethodAnnotated.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ObserverMethodAnnotated.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ObserverMethodAnnotated.java Sat Apr 14 01:09:09 2018
@@ -9,11 +9,11 @@ import javax.enterprise.inject.spi.Annot
 import javax.enterprise.inject.spi.ObserverMethod;
 
 import org.apache.aries.cdi.container.internal.util.Sets;
-import org.osgi.service.cdi.annotations.ServiceEvent;
+import org.osgi.service.cdi.reference.ReferenceEvent;
 
 public class ObserverMethodAnnotated implements Annotated {
 
-	public ObserverMethodAnnotated(ObserverMethod<ServiceEvent<?>> observerMethod) {
+	public ObserverMethodAnnotated(ObserverMethod<ReferenceEvent<?>> observerMethod) {
 		_observerMethod = observerMethod;
 		_qualifiers = _observerMethod.getObservedQualifiers();
 	}
@@ -67,7 +67,7 @@ public class ObserverMethodAnnotated imp
 		return null;
 	}
 
-	private final ObserverMethod<ServiceEvent<?>> _observerMethod;
+	private final ObserverMethod<ReferenceEvent<?>> _observerMethod;
 	private final Set<Annotation> _qualifiers;
 
 }
\ No newline at end of file

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceEventImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceEventImpl.java?rev=1829114&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceEventImpl.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ReferenceEventImpl.java Sat Apr 14 01:09:09 2018
@@ -0,0 +1,151 @@
+/**
+ * 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;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.Consumer;
+
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cdi.reference.ReferenceEvent;
+import org.osgi.service.cdi.reference.ReferenceServiceObjects;
+
+public class ReferenceEventImpl<T> implements ReferenceEvent<T> {
+
+	public static enum Event { ADDING, MODIFIED, REMOVED }
+
+	private final T _t;
+	private final ReferenceEventImpl.Event _event;
+
+	public ReferenceEventImpl(T t, ReferenceEventImpl.Event event) {
+		_t = t;
+		_event = event;
+	}
+
+	@Override
+	public void onAdding(Consumer<T> action) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onAddingServiceReference(Consumer<ServiceReference<T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onAddingServiceObjects(Consumer<ReferenceServiceObjects<T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onAddingProperties(Consumer<Map<String, ?>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onAddingTuple(Consumer<Entry<Map<String, ?>, T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onUpdate(Consumer<T> action) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onUpdateServiceReference(Consumer<ServiceReference<T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onUpdateServiceObjects(Consumer<ReferenceServiceObjects<T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onUpdateProperties(Consumer<Map<String, ?>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onUpdateTuple(Consumer<Entry<Map<String, ?>, T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onRemove(Consumer<T> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onRemoveServiceReference(Consumer<ServiceReference<T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onRemoveServiceObjects(Consumer<ReferenceServiceObjects<T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onRemoveProperties(Consumer<Map<String, ?>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void onRemoveTuple(Consumer<Entry<Map<String, ?>, T>> consumer) {
+		// TODO Auto-generated method stub
+
+	}
+
+//	@Override
+//	public ServiceEvent<T> adding(Consumer<T> consumer) {
+//		if (_event == Event.ADDING) {
+//			consumer.accept(_t);
+//		};
+//		return this;
+//	}
+//
+//	@Override
+//	public ServiceEvent<T> modified(Consumer<T> consumer) {
+//		if (_event == Event.MODIFIED) {
+//			consumer.accept(_t);
+//		}
+//		return this;
+//	}
+//
+//	@Override
+//	public ServiceEvent<T> removed(Consumer<T> consumer) {
+//		if (_event == Event.REMOVED) {
+//			consumer.accept(_t);
+//		}
+//		return this;
+//	}
+
+}
\ No newline at end of file

Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Init.java (from r1828903, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Init.java)
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Init.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Init.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Init.java&r1=1828903&r2=1829114&rev=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Init.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Init.java Sat Apr 14 01:09:09 2018
@@ -26,9 +26,9 @@ import org.osgi.framework.wiring.BundleW
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class Phase_Init implements Phase {
+public class Init implements Phase {
 
-	public Phase_Init(Bundle bundle, ContainerState containerState) {
+	public Init(Bundle bundle, ContainerState containerState) {
 		_containerState = containerState;
 
 		BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
@@ -80,7 +80,7 @@ public class Phase_Init implements Phase
 		}
 	}
 
-	private static final Logger _log = LoggerFactory.getLogger(Phase_Init.class);
+	private static final Logger _log = LoggerFactory.getLogger(Init.class);
 
 	private final ContainerState _containerState;
 	private volatile Phase _extensionPhase;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Configuration.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Configuration.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Configuration.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Configuration.java Sat Apr 14 01:09:09 2018
@@ -14,26 +14,12 @@
 
 package org.apache.aries.cdi.container.internal.phase;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.Consumer;
 
 import javax.enterprise.inject.spi.Extension;
 
-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.configuration.ConfigurationManagedService;
 import org.apache.aries.cdi.container.internal.container.ContainerState;
 import org.jboss.weld.bootstrap.spi.Metadata;
-import org.osgi.framework.Constants;
-import org.osgi.service.cdi.CdiEvent;
-import org.osgi.service.cdi.annotations.Configuration;
-import org.osgi.service.cdi.annotations.ConfigurationPolicy;
 
 public class Phase_Configuration implements Phase {
 
@@ -41,13 +27,25 @@ public class Phase_Configuration impleme
 		ContainerState containerState,
 		Collection<Metadata<Extension>> extensions) {
 
-		_containerState = containerState;
-		_extensions = extensions;
+//		_containerState = containerState;
+//		_extensions = extensions;
+//
+//		_componentModels = _containerState.beansModel().getComponentModels();
+	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
 
-		_componentModels = _containerState.beansModel().getComponentModels();
 	}
 
 	@Override
+	public void open() {
+		// TODO Auto-generated method stub
+
+	}
+
+/*	@Override
 	public void close() {
 		_lock.lock();
 
@@ -224,4 +222,4 @@ public class Phase_Configuration impleme
 	private final Collection<Metadata<Extension>> _extensions;
 	private final Lock _lock = new ReentrantLock();
 	private volatile Phase _nextPhase;
-}
\ No newline at end of file
+*/}
\ No newline at end of file

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Extension.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Extension.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Extension.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Extension.java Sat Apr 14 01:09:09 2018
@@ -14,36 +14,12 @@
 
 package org.apache.aries.cdi.container.internal.phase;
 
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import javax.enterprise.inject.spi.Extension;
-
 import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.apache.aries.cdi.container.internal.extension.ExtensionDependency;
-import org.apache.aries.cdi.container.internal.extension.ExtensionMetadata;
-import org.jboss.weld.bootstrap.spi.Metadata;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.service.cdi.CdiConstants;
-import org.osgi.service.cdi.CdiEvent;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class Phase_Extension implements Phase {
 
 	public Phase_Extension(ContainerState containerState) {
-		_containerState = containerState;
+/*		_containerState = containerState;
 		_bundleContext = _containerState.bundle().getBundleContext();
 
 		BundleWiring bundleWiring = _containerState.bundle().adapt(BundleWiring.class);
@@ -52,9 +28,21 @@ public class Phase_Extension implements
 		_extensions = new ConcurrentSkipListMap<>(Comparator.reverseOrder());
 
 		_containerState.setExtensionDependencies(_extensionDependencies);
+*/	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+
 	}
 
 	@Override
+	public void open() {
+		// TODO Auto-generated method stub
+
+	}
+
+/*	@Override
 	public void close() {
 		if (_extensionTracker != null) {
 			_extensionTracker.close();
@@ -197,5 +185,5 @@ public class Phase_Extension implements
 		}
 
 	}
-
+*/
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Publish.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Publish.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Publish.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Publish.java Sat Apr 14 01:09:09 2018
@@ -18,14 +18,8 @@ import java.util.Collection;
 
 import javax.enterprise.inject.spi.Extension;
 
-import org.apache.aries.cdi.container.internal.container.ContainerBootstrap;
 import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.jboss.weld.bootstrap.WeldBootstrap;
 import org.jboss.weld.bootstrap.spi.Metadata;
-import org.osgi.service.cdi.CdiEvent;
-import org.osgi.service.cdi.annotations.ServiceScope;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class Phase_Publish implements Phase {
 
@@ -33,11 +27,23 @@ public class Phase_Publish implements Ph
 		ContainerState containerState,
 		Collection<Metadata<Extension>> extensions) {
 
-		_containerState = containerState;
+/*		_containerState = containerState;
 		_extensions = extensions;
+*/	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+
 	}
 
 	@Override
+	public void open() {
+		// TODO Auto-generated method stub
+
+	}
+
+/*	@Override
 	public void close() {
 		_containerState.serviceRegistrator().close();
 		_containerState.beanManagerRegistrator().close();
@@ -99,5 +105,5 @@ public class Phase_Publish implements Ph
 	private volatile ContainerBootstrap _cb;
 	private final ContainerState _containerState;
 	private final Collection<Metadata<Extension>> _extensions;
-
+*/
 }
\ No newline at end of file

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Reference.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Reference.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Reference.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/phase/Phase_Reference.java Sat Apr 14 01:09:09 2018
@@ -15,25 +15,11 @@
 package org.apache.aries.cdi.container.internal.phase;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.Consumer;
 
 import javax.enterprise.inject.spi.Extension;
-import javax.enterprise.inject.spi.ObserverMethod;
 
-import org.apache.aries.cdi.container.internal.component.ComponentModel;
 import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.apache.aries.cdi.container.internal.reference.ReferenceCallback;
-import org.apache.aries.cdi.container.internal.reference.ReferenceModel;
 import org.jboss.weld.bootstrap.spi.Metadata;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.service.cdi.CdiEvent;
-import org.osgi.service.cdi.annotations.ServiceEvent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class Phase_Reference implements Phase {
 
@@ -41,13 +27,25 @@ public class Phase_Reference implements
 		ContainerState containerState,
 		Collection<Metadata<Extension>> extensions) {
 
-		_containerState = containerState;
+/*		_containerState = containerState;
 		_extensions = extensions;
 
 		_componentModels = _containerState.beansModel().getComponentModels();
+*/	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+
 	}
 
 	@Override
+	public void open() {
+		// TODO Auto-generated method stub
+
+	}
+
+/*	@Override
 	public void close() {
 		_lock.lock();
 
@@ -185,5 +183,5 @@ public class Phase_Reference implements
 	private final Collection<Metadata<Extension>> _extensions;
 	private final Lock _lock = new ReentrantLock(true);
 	private volatile Phase _nextPhase;
-
+*/
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceBean.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceBean.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceBean.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceBean.java Sat Apr 14 01:09:09 2018
@@ -29,16 +29,15 @@ import javax.enterprise.inject.spi.Decor
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.inject.Named;
 
-import org.apache.aries.cdi.container.internal.component.ComponentModel;
+import org.apache.aries.cdi.container.internal.component.OSGiBean;
 import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.osgi.service.cdi.annotations.ReferenceCardinality;
 
 public class ReferenceBean implements Bean<Object> {
 
 	public ReferenceBean(
 		ContainerState containerState,
 		ReferenceModel referenceModel,
-		ComponentModel componentModel,
+		OSGiBean componentModel,
 		InjectionPoint injectionPoint,
 		BeanManager beanManager) {
 
@@ -72,7 +71,7 @@ public class ReferenceBean implements Be
 
 	@Override
 	public Class<?> getBeanClass() {
-		return _referenceModel.getBeanClass();
+		return null; // TODO _referenceModel.getBeanClass();
 	}
 
 	@Override
@@ -102,7 +101,7 @@ public class ReferenceBean implements Be
 
 	@Override
 	public Set<Type> getTypes() {
-		return _referenceModel.getTypes();
+		return null; // TODO _referenceModel.getTypes();
 	}
 
 	@Override
@@ -112,7 +111,7 @@ public class ReferenceBean implements Be
 
 	@Override
 	public boolean isNullable() {
-		return _referenceModel.getCardinality() == ReferenceCardinality.OPTIONAL ? true : false;
+		return false;//_referenceModel.getCardinality() == ReferenceCardinality.OPTIONAL ? true : false;
 	}
 
 	@Override
@@ -129,13 +128,13 @@ public class ReferenceBean implements Be
 	private Object _getInjectedInstance() {
 		Map<String, ReferenceCallback> map = _containerState.referenceCallbacks().get(_componentModel);
 
-		ReferenceCallback referenceCallback = map.get(_referenceModel.getName());
+//		ReferenceCallback referenceCallback = map.get(_referenceModel.getName());
 
-		return referenceCallback.tracked().values().iterator().next();
+		return null; // TODO referenceCallback.tracked().values().iterator().next();
 	}
 
 	private final BeanManager _beanManager;
-	private final ComponentModel _componentModel;
+	private final OSGiBean _componentModel;
 	private final ContainerState _containerState;
 	private final InjectionPoint _injectionPoint;
 	private final String _name;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceCallback.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceCallback.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceCallback.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceCallback.java Sat Apr 14 01:09:09 2018
@@ -14,39 +14,30 @@
 
 package org.apache.aries.cdi.container.internal.reference;
 
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.Consumer;
-
-import javax.enterprise.inject.spi.ObserverMethod;
-
-import org.apache.aries.cdi.container.internal.component.ComponentModel;
-import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.apache.aries.cdi.container.internal.model.CollectionType;
-import org.apache.aries.cdi.container.internal.model.Context;
-import org.apache.aries.cdi.container.internal.model.ServiceEventImpl;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.cdi.annotations.ReferenceCardinality;
-import org.osgi.service.cdi.annotations.ServiceEvent;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 public class ReferenceCallback implements ServiceTrackerCustomizer<Object, Object> {
 
-	public static class Builder {
+	@Override
+	public Object addingService(ServiceReference<Object> reference) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void modifiedService(ServiceReference<Object> reference, Object service) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void removedService(ServiceReference<Object> reference, Object service) {
+		// TODO Auto-generated method stub
+
+	}
+
+/*	public static class Builder {
 
 		public Builder(Context context) {
 			this(null, null, context);
@@ -182,7 +173,7 @@ public class ReferenceCallback implement
 			else {
 				_tracked.put(reference, object);
 
-				observer().ifPresent(o -> o.notify(event(object, ServiceEventImpl.Event.ADDING)));
+				observer().ifPresent(o -> o.notify(event(object, ReferenceEventImpl.Event.ADDING)));
 			}
 
 			_onAdd.ifPresent(f -> f.accept(this));
@@ -204,7 +195,7 @@ public class ReferenceCallback implement
 				entry -> {
 					_tracked.put(entry.getKey(), entry.getValue());
 
-					observer().ifPresent(o -> o.notify(event(entry.getValue(), ServiceEventImpl.Event.ADDING)));
+					observer().ifPresent(o -> o.notify(event(entry.getValue(), ReferenceEventImpl.Event.ADDING)));
 
 					return true;
 				}
@@ -251,7 +242,7 @@ public class ReferenceCallback implement
 				else {
 					_tracked.put(reference, object);
 
-					observer().ifPresent(o -> o.notify(event(object, ServiceEventImpl.Event.MODIFIED)));
+					observer().ifPresent(o -> o.notify(event(object, ReferenceEventImpl.Event.MODIFIED)));
 				}
 			}
 
@@ -275,7 +266,7 @@ public class ReferenceCallback implement
 			else {
 				final Object instance = _tracked.remove(reference);
 
-				observer().ifPresent(o -> o.notify(event(instance, ServiceEventImpl.Event.REMOVED)));
+				observer().ifPresent(o -> o.notify(event(instance, ReferenceEventImpl.Event.REMOVED)));
 			}
 
 			_onRemove.ifPresent(f -> f.accept(this));
@@ -285,8 +276,8 @@ public class ReferenceCallback implement
 		}
 	}
 
-	<T> ServiceEvent<T> event(T t, ServiceEventImpl.Event event) {
-		return new ServiceEventImpl<T>(t, event);
+	<T> ServiceEvent<T> event(T t, ReferenceEventImpl.Event event) {
+		return new ReferenceEventImpl<T>(t, event);
 	}
 
 	public boolean resolved() {
@@ -404,5 +395,5 @@ public class ReferenceCallback implement
 		private List<String> _keys;
 
 	}
-
+*/
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/reference/ReferenceModel.java Sat Apr 14 01:09:09 2018
@@ -14,273 +14,138 @@
 
 package org.apache.aries.cdi.container.internal.reference;
 
-import static org.apache.aries.cdi.container.internal.model.Model.*;
 import static org.apache.aries.cdi.container.internal.util.Reflection.cast;
-import static java.lang.String.format;
-import static org.apache.aries.cdi.container.internal.model.Constants.CARDINALITY_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.CDI10_URI;
-import static org.apache.aries.cdi.container.internal.model.Constants.NAME_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.POLICY_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.POLICY_OPTION_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.SCOPE_ATTRIBUTE;
-import static org.apache.aries.cdi.container.internal.model.Constants.TARGET_ATTRIBUTE;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
+import java.lang.reflect.Member;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.WildcardType;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.spi.Annotated;
+import javax.enterprise.inject.spi.AnnotatedCallable;
+import javax.enterprise.inject.spi.AnnotatedConstructor;
 import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedParameter;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Named;
+import javax.inject.Provider;
 
 import org.apache.aries.cdi.container.internal.model.CollectionType;
 import org.apache.aries.cdi.container.internal.util.Conversions;
 import org.apache.aries.cdi.container.internal.util.Maps;
-import org.apache.aries.cdi.container.internal.util.Sets;
-import org.apache.aries.cdi.container.internal.util.Types;
 import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.cdi.annotations.Greedy;
 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;
-import org.osgi.service.cdi.annotations.ServiceEvent;
+import org.osgi.service.cdi.reference.ReferenceServiceObjects;
+import org.osgi.service.cdi.runtime.dto.template.MaximumCardinality;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO.Policy;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO.PolicyOption;
 import org.osgi.util.converter.TypeReference;
-import org.xml.sax.Attributes;
 
 public class ReferenceModel {
 
 	public static class Builder {
 
-		public Builder(Attributes attributes) {
-			_cardinality = _cardinality(attributes);
-			_name = _name(attributes);
-			_option = _option(attributes);
-			_policy = _policy(attributes);
-			_scope = _scope(attributes);
-			_target = _target(attributes);
-		}
-
-		public Builder(Set<Annotation> qualifiers) {
-			_qualifiers = qualifiers;
-			Reference reference = getQualifier(_qualifiers, Reference.class);
-			if (reference != null) {
-				_cardinality = reference.cardinality();
-				_name = reference.name();
-				_option = reference.policyOption();
-				_policy = reference.policy();
-				_scope = reference.scope();
-				_service = reference.service();
-				_target = reference.target();
-			}
-		}
-
 		public ReferenceModel build() {
-			if ((_annotated == null) && (_service == null)) {
-				throw new IllegalArgumentException(
-					"Either injectionPoint or service must be set!");
-			}
+			return new ReferenceModel(_annotated, _member, _qualifiers, _type, _referenceClass);
+		}
 
-			if (_annotated == null) {
-				_annotated = new ReferenceAnnotated(_service);
-			}
+		public Builder injectionPoint(InjectionPoint injectionPoint) {
+			_annotated = injectionPoint.getAnnotated();
+			_member = injectionPoint.getMember();
+			_qualifiers = injectionPoint.getQualifiers();
+			_type = injectionPoint.getType();
 
-			Type type = upwrapCDITypes(_annotated.getBaseType());
+			if (_annotated instanceof AnnotatedParameter) {
+				AnnotatedParameter<?> parameter = (AnnotatedParameter<?>)_annotated;
 
-			_policy = calculatePolicy(_policy);
-			_option = calculatePolicyOption(_option);
-			_scope = calculateScope(_scope);
-			Multiplicity multiplicity = calculateMultiplicity(_annotated.getBaseType());// we need the pure type to check "Instance"
-			_cardinality = calculateCardinality(_cardinality, multiplicity, type);
-			CollectionType collectionType = calculateCollectionType(type);
-			Class<?> beanClass = calculateBeanClass(type);
-			_service = calculateServiceClass(_service, _cardinality, collectionType, type, _annotated);
-			_name = calculateName(_name, _service, _annotated);
+				_referenceClass = parameter.getDeclaringCallable().getDeclaringType().getJavaClass();
+			}
+			if (_annotated instanceof AnnotatedField) {
+				AnnotatedField<?> field = (AnnotatedField<?>)_annotated;
 
-			return new ReferenceModel(_service, _cardinality, _name, _policy, _option, _target, _scope, _qualifiers, beanClass, type, collectionType);
-		}
+				_referenceClass = field.getDeclaringType().getJavaClass();
+			}
 
-		public Builder cardinality(ReferenceCardinality cardinality) {
-			_cardinality = cardinality;
 			return this;
 		}
 
-		public Builder annotated(Annotated annotated) {
-			_annotated = annotated;
-			return this;
-		}
+		private Annotated _annotated;
+		private Member _member;
+		private Set<Annotation> _qualifiers;
+		private Class<?> _referenceClass;
+		private Type _type;
 
-		public Builder name(String name) {
-			_name = name;
-			return this;
-		}
+	}
 
-		public Builder option(ReferencePolicyOption option) {
-			_option = option;
-			return this;
-		}
+	public static enum Scope {
+		BUNDLE, PROTOTYPE, SINGLETON
+	}
 
-		public Builder policy(ReferencePolicy policy) {
-			_policy = policy;
-			return this;
-		}
+	private ReferenceModel(
+		Annotated annotated,
+		Member member,
+		Set<Annotation> qualifiers,
+		Type type,
+		Class<?> referenceClass) {
 
-		public Builder scope(ReferenceScope scope) {
-			_scope = scope;
-			return this;
-		}
+		_annotated = annotated;
+		_member = member;
+		_qualifiers = qualifiers;
+		_injectionPointType = type;
+		_referenceClass = referenceClass;
 
-		public Builder service(Class<?> service) {
-			_service = service;
-			return this;
-		}
+		calculateServiceType(_injectionPointType);
 
-		public Builder target(String target) {
-			_target = target;
-			return this;
-		}
+		Reference reference = _annotated.getAnnotation(Reference.class);
 
-		@SuppressWarnings("unchecked")
-		private static <T extends Annotation> T getQualifier(
-			Set<Annotation> qualifiers, Class<T> clazz) {
-			for (Annotation annotation : qualifiers) {
-				if (clazz.isAssignableFrom(annotation.annotationType())) {
-					return (T)annotation;
-				}
+		if ((reference != null) && (reference.value() != null) && (reference.value() != Object.class)) {
+			if (!_serviceType.isAssignableFrom(reference.value())) {
+				throw new IllegalArgumentException(
+					"The service type specified in @Reference (" + reference.value() +
+						") is not compatible with the type calculated from the injection point: " +
+							_serviceType);
 			}
-			return null;
+			_serviceType = reference.value();
 		}
 
-		private ReferenceCardinality _cardinality;
-		private Annotated _annotated;
-		private String _name;
-		private ReferencePolicyOption _option;
-		private ReferencePolicy _policy;
-		private Set<Annotation> _qualifiers;
-		private ReferenceScope _scope;
-		private Class<?> _service;
-		private String _target;
+		Type rawType = _injectionPointType;
 
-	}
+		if (rawType instanceof ParameterizedType) {
+			ParameterizedType pt = cast(_injectionPointType);
 
-	private ReferenceModel(
-		Class<?> service,
-		ReferenceCardinality cardinality,
-		String name,
-		ReferencePolicy policy,
-		ReferencePolicyOption option,
-		String target,
-		ReferenceScope scope,
-		Set<Annotation> qualifiers,
-		Class<?> beanClass,
-		Type injectionPointType,
-		CollectionType collectionType) {
-
-		_service = service;
-		_cardinality = cardinality;
-		_name = name;
-		_policy = policy;
-		_option = option;
-		_target = target;
-		_scope = scope;
-		_qualifiers = new LinkedHashSet<>();
-		if (qualifiers != null) {
-			_qualifiers.addAll(qualifiers);
+			rawType = pt.getRawType();
 		}
-		_beanClass = beanClass;
-		_injectionPointType = injectionPointType;
-		_collectionType = collectionType;
 
-		_types = Sets.immutableHashSet(_injectionPointType, Object.class);
-	}
+		_beanClass = cast(rawType);
 
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((_beanClass == null) ? 0 : _beanClass.hashCode());
-		result = prime * result + ((_cardinality == null) ? 0 : _cardinality.hashCode());
-		result = prime * result + ((_name == null) ? 0 : _name.hashCode());
-		result = prime * result + ((_option == null) ? 0 : _option.hashCode());
-		result = prime * result + ((_policy == null) ? 0 : _policy.hashCode());
-		result = prime * result + ((_scope == null) ? 0 : _scope.hashCode());
-		result = prime * result + ((_service == null) ? 0 : _service.hashCode());
-		result = prime * result + ((_target == null) ? 0 : _target.hashCode());
-		return result;
-	}
+		_name = calculateName(_serviceType, _annotated);
 
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		ReferenceModel other = (ReferenceModel) obj;
-		if (_beanClass == null) {
-			if (other._beanClass != null)
-				return false;
-		} else if (!_beanClass.equals(other._beanClass))
-			return false;
-		if (_cardinality != other._cardinality)
-			return false;
-		if (_name == null) {
-			if (other._name != null)
-				return false;
-		} else if (!_name.equals(other._name))
-			return false;
-		if (_option != other._option)
-			return false;
-		if (_policy != other._policy)
-			return false;
-		if (_scope != other._scope)
-			return false;
-		if (_service == null) {
-			if (other._service != null)
-				return false;
-		} else if (!_service.equals(other._service))
-			return false;
-		if (_target == null) {
-			if (other._target != null)
-				return false;
-		} else if (!_target.equals(other._target))
-			return false;
-		return true;
-	}
-
-	public boolean found() {
-		return _found.get();
+		if (_annotated.isAnnotationPresent(Greedy.class)) {
+			_greedy = true;
+		}
 	}
 
-	public void found(boolean found) {
-		_found.set(found);
+	public Annotated getAnnotated() {
+		return _annotated;
 	}
 
 	public Class<?> getBeanClass() {
 		return _beanClass;
 	}
 
-	public ReferenceCardinality getCardinality() {
-		return _cardinality;
-	}
-
 	public CollectionType getCollectionType() {
 		return _collectionType;
 	}
@@ -293,43 +158,43 @@ public class ReferenceModel {
 		return _name;
 	}
 
-	public ReferencePolicy getPolicy() {
-		return _policy;
-	}
-
-	public ReferencePolicyOption getPolicyOption() {
-		return _option;
+	public Member getMember() {
+		return _member;
 	}
 
 	public Set<Annotation> getQualifiers() {
 		return _qualifiers;
 	}
 
-	public ReferenceScope getScope() {
-		return _scope;
-	}
-
-	public Class<?> getServiceClass() {
-		return _service;
+	public Class<?> getServiceType() {
+		return _serviceType;
 	}
 
 	public String getTarget() {
-		return _target;
+		return _targetFilter;
 	}
 
 	public Set<Type> getTypes() {
-		return _types;
+		return null; // TODO _types;
+	}
+
+	public boolean dynamic() {
+		return _dynamic;
 	}
 
-	public void setQualifiers(Set<Annotation> qualifiers) {
-		_qualifiers.clear();
-		_qualifiers.addAll(qualifiers);
+	public boolean optional() {
+		return _optional;
+	}
+
+	public boolean unary() {
+		return _multiplicity == MaximumCardinality.ONE;
 	}
 
 	@Override
 	public String toString() {
 		if (_string == null) {
-			_string = String.format("reference[name='%s', service='%s', scope='%s', target='%s']", _name, _service, _scope, _target);
+			//_string = String.format("reference[name='%s', service='%s', scope='%s', target='%s']", _name, _service, _scope, _target);
+			_string = super.toString();
 		}
 		return _string;
 	}
@@ -337,7 +202,7 @@ public class ReferenceModel {
 	public static String buildFilter(
 			Class<?> serviceType,
 			String target,
-			ReferenceScope scope,
+			Scope scope,
 			Set<Annotation> qualifiers)
 		throws InvalidSyntaxException {
 
@@ -349,27 +214,13 @@ public class ReferenceModel {
 		sb.append(serviceType.getName());
 		sb.append(")");
 
-		if (scope == ReferenceScope.PROTOTYPE) {
+		if (scope == Scope.PROTOTYPE) {
 			sb.append("(");
 			sb.append(Constants.SERVICE_SCOPE);
 			sb.append("=");
 			sb.append(Constants.SCOPE_PROTOTYPE);
 			sb.append(")");
 		}
-		else if (scope == ReferenceScope.SINGLETON) {
-			sb.append("(");
-			sb.append(Constants.SERVICE_SCOPE);
-			sb.append("=");
-			sb.append(Constants.SCOPE_SINGLETON);
-			sb.append(")");
-		}
-		else if (scope == ReferenceScope.BUNDLE) {
-			sb.append("(");
-			sb.append(Constants.SERVICE_SCOPE);
-			sb.append("=");
-			sb.append(Constants.SCOPE_BUNDLE);
-			sb.append(")");
-		}
 
 		String targetFilter = target == null ? "" : target;
 
@@ -400,344 +251,398 @@ public class ReferenceModel {
 		return sb.toString();
 	}
 
-	private static Class<?> calculateBeanClass(Type type) {
-		if (type instanceof ParameterizedType) {
-			ParameterizedType pType = (ParameterizedType)type;
-
-			type = pType.getRawType();
-		}
-		else if (type instanceof WildcardType) {
-			throw new IllegalArgumentException(
-				"Cannot use a wildcard as the bean: " + type);
-		}
+//	private static Class<?> calculateBeanClass(Type type) {
+//		if (type instanceof ParameterizedType) {
+//			ParameterizedType pType = (ParameterizedType)type;
+//
+//			type = pType.getRawType();
+//		}
+//		else if (type instanceof WildcardType) {
+//			throw new IllegalArgumentException(
+//				"Cannot use a wildcard as the bean: " + type);
+//		}
+//
+//		return cast(type);
+//	}
+
+//	private static CollectionType calculateCollectionType(Type type) {
+//		if (type instanceof ParameterizedType) {
+//			ParameterizedType parameterizedType = cast(type);
+//
+//			Type rawType = parameterizedType.getRawType();
+//
+//			if ((List.class == cast(rawType)) ||
+//				Collection.class.isAssignableFrom(cast(rawType))) {
+//
+//				Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
+//
+//				return calculateCollectionType(actualTypeArguments[0]);
+//			}
+//			else if (Map.class == cast(rawType)) {
+//				Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
+//
+//				Type first = actualTypeArguments[0];
+//				Type second = actualTypeArguments[1];
+//
+//				if (!(first instanceof ParameterizedType) &&
+//					String.class.isAssignableFrom(cast(first))) {
+//
+//					if ((!(second instanceof ParameterizedType) && (second == Object.class)) ||
+//						(second instanceof WildcardType)) {
+//
+//						return CollectionType.PROPERTIES;
+//					}
+//				}
+//			}
+//			else if (Map.Entry.class == cast(rawType)) {
+//				return CollectionType.TUPLE;
+//			}
+//			else if (ServiceObjects.class == cast(rawType)) {
+//				return CollectionType.SERVICEOBJECTS;
+//			}
+//			else if (ServiceReference.class == cast(rawType)) {
+//				return CollectionType.REFERENCE;
+//			}
+//		}
+//		else if (Map.Entry.class == cast(type)) {
+//			return CollectionType.TUPLE;
+//		}
+//		else if (ServiceObjects.class == cast(type)) {
+//			return CollectionType.SERVICEOBJECTS;
+//		}
+//		else if (ServiceReference.class == cast(type)) {
+//			return CollectionType.REFERENCE;
+//		}
+//
+//		return CollectionType.SERVICE;
+//	}
+
+//	private static ReferenceCardinality calculateCardinality(
+//		ReferenceCardinality cardinality, Multiplicity multiplicity, Type type) {
+//
+//		if ((multiplicity == Multiplicity.UNARY) &&
+//			((cardinality == ReferenceCardinality.AT_LEAST_ONE) || (cardinality == ReferenceCardinality.MULTIPLE))) {
+//
+//			throw new IllegalArgumentException(
+//				format(
+//					"Unary injection point type %s cannot be defined by multiple cardinality %s",
+//					type, cardinality));
+//		}
+//		else if ((multiplicity == Multiplicity.MULTIPLE) &&
+//				((cardinality == ReferenceCardinality.OPTIONAL) || (cardinality == ReferenceCardinality.MANDATORY))) {
+//
+//			throw new IllegalArgumentException(
+//				format(
+//					"Multiple injection point type %s cannot be defined by unary cardinality %s",
+//					type, cardinality));
+//		}
+//
+//		if ((cardinality == null) || (cardinality == ReferenceCardinality.DEFAULT)) {
+//			switch(multiplicity) {
+//				case MULTIPLE:
+//					return ReferenceCardinality.MULTIPLE;
+//				case UNARY:
+//					return ReferenceCardinality.MANDATORY;
+//			}
+//		}
+//
+//		return cardinality;
+//	}
+
+//	private static Multiplicity calculateMultiplicity(Type type) {
+//		if (type instanceof ParameterizedType) {
+//			ParameterizedType parameterizedType = cast(type);
+//
+//			Type rawType = parameterizedType.getRawType();
+//
+//			if ((Instance.class == cast(rawType)) ||
+//				Collection.class.isAssignableFrom(cast(rawType)) ||
+//				ServiceEvent.class == cast(rawType)) {
+//
+//				return Multiplicity.MULTIPLE;
+//			}
+//		}
+//
+//		return Multiplicity.UNARY;
+//	}
 
-		return cast(type);
-	}
+	private String calculateName(Class<?> service, Annotated annotated) {
+		Named named = annotated.getAnnotation(Named.class);
 
-	private static CollectionType calculateCollectionType(Type type) {
-		if (type instanceof ParameterizedType) {
-			ParameterizedType parameterizedType = cast(type);
+		if (named != null) {
+			if (named.value() == null | named.value().equals("")) {
+				throw new IllegalArgumentException(
+					"It's illegal to specify @Name without specifying a value with @Reference: " +
+						annotated);
+			}
+			return named.value();
+		}
 
-			Type rawType = parameterizedType.getRawType();
+		String prefix = _referenceClass.getName() + ".";
 
-			if ((List.class == cast(rawType)) ||
-				Collection.class.isAssignableFrom(cast(rawType))) {
+		if (annotated instanceof AnnotatedParameter) {
+			AnnotatedParameter<?> parameter = (AnnotatedParameter<?>)annotated;
 
-				Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
+			AnnotatedCallable<?> declaringCallable = parameter.getDeclaringCallable();
 
-				return calculateCollectionType(actualTypeArguments[0]);
+			if (declaringCallable instanceof AnnotatedConstructor) {
+				return prefix + "new" + parameter.getPosition();
 			}
-			else if (Map.class == cast(rawType)) {
-				Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
-
-				Type first = actualTypeArguments[0];
-				Type second = actualTypeArguments[1];
+			else {
+				AnnotatedMethod<?> method = (AnnotatedMethod<?>)declaringCallable;
 
-				if (!(first instanceof ParameterizedType) &&
-					String.class.isAssignableFrom(cast(first))) {
+				return prefix + method.getJavaMember().getName() + parameter.getPosition();
+			}
+		}
+		else {
+			AnnotatedField<?> annotatedField = (AnnotatedField<?>)annotated;
 
-					if ((!(second instanceof ParameterizedType) && (second == Object.class)) ||
-						(second instanceof WildcardType)) {
+			return prefix + annotatedField.getJavaMember().getName();
+		}
+	}
 
-						return CollectionType.PROPERTIES;
-					}
-				}
+	private void calculateServiceType(Type type) {
+		if (!(type instanceof ParameterizedType)) {
+			if (!(type instanceof Class)) {
+				throw new IllegalArgumentException(
+					"The service type must not be generic: " + type);
 			}
-			else if (Map.Entry.class == cast(rawType)) {
-				return CollectionType.TUPLE;
+			else if (Map.class == cast(type)) {
+				throw new IllegalArgumentException(
+					"Map must specify a generic type arguments: " + type);
 			}
-			else if (ServiceObjects.class == cast(rawType)) {
-				return CollectionType.SERVICEOBJECTS;
+			else if (Map.Entry.class == cast(type)) {
+				throw new IllegalArgumentException(
+					"Map.Entry must specify a generic type arguments: " + type);
 			}
-			else if (ServiceReference.class == cast(rawType)) {
-				return CollectionType.REFERENCE;
+			else if (ReferenceServiceObjects.class == cast(type)) {
+				throw new IllegalArgumentException(
+					"ReferenceServiceObjects must specify a generic type argument: " + type);
+			}
+			else if (ServiceReference.class == cast(type)) {
+				throw new IllegalArgumentException(
+					"ServiceReference must specify a generic type argument: " + type);
 			}
-		}
-		else if (Map.Entry.class == cast(type)) {
-			return CollectionType.TUPLE;
-		}
-		else if (ServiceObjects.class == cast(type)) {
-			return CollectionType.SERVICEOBJECTS;
-		}
-		else if (ServiceReference.class == cast(type)) {
-			return CollectionType.REFERENCE;
-		}
 
-		return CollectionType.SERVICE;
-	}
+			_serviceType = cast(type);
 
-	private static ReferenceCardinality calculateCardinality(
-		ReferenceCardinality cardinality, Multiplicity multiplicity, Type type) {
+			return;
+		}
 
-		if ((multiplicity == Multiplicity.UNARY) &&
-			((cardinality == ReferenceCardinality.AT_LEAST_ONE) || (cardinality == ReferenceCardinality.MULTIPLE))) {
+		ParameterizedType parameterizedType = cast(type);
 
-			throw new IllegalArgumentException(
-				format(
-					"Unary injection point type %s cannot be defined by multiple cardinality %s",
-					type, cardinality));
-		}
-		else if ((multiplicity == Multiplicity.MULTIPLE) &&
-				((cardinality == ReferenceCardinality.OPTIONAL) || (cardinality == ReferenceCardinality.MANDATORY))) {
+		Type rawType = parameterizedType.getRawType();
 
+		if (Instance.class == cast(rawType)) {
 			throw new IllegalArgumentException(
-				format(
-					"Multiple injection point type %s cannot be defined by unary cardinality %s",
-					type, cardinality));
+				"Instance<T> is not supported with @Reference: " + type);
 		}
 
-		if ((cardinality == null) || (cardinality == ReferenceCardinality.DEFAULT)) {
-			switch(multiplicity) {
-				case MULTIPLE:
-					return ReferenceCardinality.MULTIPLE;
-				case UNARY:
-					return ReferenceCardinality.MANDATORY;
-			}
-		}
-
-		return cardinality;
-	}
-
-	private static Multiplicity calculateMultiplicity(Type type) {
-		if (type instanceof ParameterizedType) {
-			ParameterizedType parameterizedType = cast(type);
+		if ((!_dynamic) && (Provider.class == cast(rawType))) {
+			_dynamic = true;
 
-			Type rawType = parameterizedType.getRawType();
+			calculateServiceType(parameterizedType.getActualTypeArguments()[0]);
 
-			if ((Instance.class == cast(rawType)) ||
-				Collection.class.isAssignableFrom(cast(rawType)) ||
-				ServiceEvent.class == cast(rawType)) {
-
-				return Multiplicity.MULTIPLE;
-			}
+			return;
 		}
 
-		return Multiplicity.UNARY;
-	}
+		if ((!_optional) && (Optional.class == cast(rawType))) {
+			_optional = true;
 
-	public static String calculateName(String name, Class<?> service, Annotated annotated) {
-		if ((name != null) && (name.length() > 0)) {
-			return name;
-		}
-
-		if (annotated != null) {
-			if (annotated instanceof AnnotatedParameter) {
-				AnnotatedParameter<?> annotatedParameter = (AnnotatedParameter<?>)annotated;
-
-				return Types.getName(service) + annotatedParameter.getPosition();
-			}
-			if (annotated instanceof AnnotatedField) {
-				AnnotatedField<?> annotatedField = (AnnotatedField<?>)annotated;
+			calculateServiceType(parameterizedType.getActualTypeArguments()[0]);
 
-				return annotatedField.getJavaMember().getName();
-			}
+			return;
 		}
 
-		return Types.getName(service);
-	}
+		if ((_multiplicity == MaximumCardinality.ONE) &&
+			((Collection.class == cast(rawType)) ||
+			(Iterable.class == cast(rawType)) ||
+			(List.class == cast(rawType)))) {
 
-	private static ReferencePolicy calculatePolicy(ReferencePolicy policy) {
-		if ((policy == null) || (policy == ReferencePolicy.DEFAULT)) {
-			return ReferencePolicy.STATIC;
-		}
+			_optional = true;
+			_multiplicity = MaximumCardinality.MANY;
 
-		return policy;
-	}
+			calculateServiceType(parameterizedType.getActualTypeArguments()[0]);
 
-	private static ReferencePolicyOption calculatePolicyOption(ReferencePolicyOption option) {
-		if ((option == null) || (option == ReferencePolicyOption.DEFAULT)) {
-			return ReferencePolicyOption.RELUCTANT;
+			return;
 		}
 
-		return option;
-	}
-
-	private static ReferenceScope calculateScope(ReferenceScope scope) {
-		if ((scope == null) || (scope == ReferenceScope.DEFAULT)) {
-			return ReferenceScope.DEFAULT;
-		}
-
-		return scope;
-	}
-
-	private static Class<?> calculateServiceClass(Type injectionPointType) {
-		Type type = injectionPointType;
-
-		if (!(type instanceof ParameterizedType)) {
-			return cast(type);
-		}
+		Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
 
-		ParameterizedType parameterizedType = cast(type);
+		Type argument = actualTypeArguments[0];
 
-		Type rawType = parameterizedType.getRawType();
+		if (Map.class == cast(rawType)) {
+			if (String.class != cast(argument)) {
+				throw new IllegalArgumentException(
+					"Maps of properties must use the form Map<String, (? | Object)>: " + type);
+			}
 
-		if ((List.class == cast(rawType)) ||
-			Collection.class.isAssignableFrom(cast(rawType))) {
+			argument = actualTypeArguments[1];
 
-			Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
+			if ((Object.class != cast(argument)) &&
+				(!(argument instanceof WildcardType))) {
 
-			type = actualTypeArguments[0];
+				throw new IllegalArgumentException(
+					"Maps of properties must use the form Map<String, (? | Object)>: " + type);
+			}
 
-			if (type instanceof ParameterizedType) {
-				parameterizedType = (ParameterizedType)type;
+			_collectionType = CollectionType.PROPERTIES;
 
-				rawType = parameterizedType.getRawType();
-			}
-			else if ((type instanceof WildcardType) ||
-					Map.Entry.class.isAssignableFrom(cast(type))) {
+			Reference reference = _annotated.getAnnotation(Reference.class);
 
-				return null;
-			}
-			else {
-				rawType = type;
+			if ((reference == null) || (reference.value() == null)) {
+				throw new IllegalArgumentException(
+					"Maps of properties must specify service type with @Reference.value(): " + argument);
 			}
-		}
 
-		if (!Map.Entry.class.isAssignableFrom(cast(rawType)) &&
-			!ServiceObjects.class.isAssignableFrom(cast(rawType)) &&
-			!ServiceReference.class.isAssignableFrom(cast(rawType))) {
+			_serviceType = reference.value();
 
-			return cast(rawType);
+			return;
 		}
 
-		Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
-
-		Type argument = actualTypeArguments[0];
-
-		if (Map.Entry.class.isAssignableFrom(cast(rawType))) {
+		if (Map.Entry.class == cast(rawType)) {
 			if (!checkKey(argument)) {
 				throw new IllegalArgumentException(
-					"Tuples must have a key of type Map<String, [? or Object]>: " + argument);
+					"Tuples must have a key of type Map<String, (? | Object)>: " + argument);
 			}
 
 			argument = actualTypeArguments[1];
-		}
-
-		if (argument instanceof ParameterizedType) {
-			ParameterizedType parameterizedType1 = cast(argument);
 
-			return cast(parameterizedType1.getRawType());
-		}
-		else if (argument instanceof WildcardType) {
-			WildcardType wildcardType = (WildcardType)argument;
+			if (!(argument instanceof Class)) {
+				throw new IllegalArgumentException(
+					"The service type must not be generic: " + argument);
+			}
 
-			if ((wildcardType.getUpperBounds().length == 1)) {
-				argument = wildcardType.getUpperBounds()[0];
+			_collectionType = CollectionType.TUPLE;
 
-				if (Object.class.equals(argument)) {
-					return null;
-				}
-				else if (argument instanceof Class) {
-					return cast(argument);
-				}
-			}
+			_serviceType = cast(argument);
 
-			throw new IllegalArgumentException(
-				"@Reference cannot use nested parameterized types or multiple upper bounds: " + injectionPointType);
+			return;
 		}
 
-		return cast(argument);
-	}
-
-	private static Class<?> calculateServiceClass(
-		Class<?> service, ReferenceCardinality cardinality, CollectionType collectionType, Type injectionPointType, Annotated annotated) {
+		if (ReferenceServiceObjects.class == cast(rawType)) {
+			_collectionType = CollectionType.SERVICEOBJECTS;
 
-		Class<?> calculatedServiceClass = calculateServiceClass(injectionPointType);
+			calculateServiceType(argument);
 
-		if ((service == null) || (service == Object.class)) {
-			if (calculatedServiceClass == null) {
-				throw new IllegalArgumentException(
-					"Could not determine the service type from @Reference on annotated " +
-						annotated);
-			}
+			return;
+		}
 
-			switch(collectionType) {
-				case PROPERTIES:
-					if (calculatedServiceClass == Map.class) {
-						throw new IllegalArgumentException(
-							"A @Reference cannot bind service properties to a Map<String, Object> without " +
-								"specifying the @Reference.service property: " + annotated);
-					}
-					break;
-				case REFERENCE:
-					if (calculatedServiceClass == ServiceReference.class) {
-						throw new IllegalArgumentException(
-							"A @Reference cannot bind a ServiceReference without specifying either the " +
-								"@Reference.service property or a generic type argument (e.g. ServiceReference<Foo>: " +
-									annotated);
-					}
-					break;
-				case SERVICEOBJECTS:
-					if	(calculatedServiceClass == ServiceObjects.class) {
-						throw new IllegalArgumentException(
-							"A @Reference cannot bind a ServiceObjects without specifying either the " +
-								"@Reference.service property or a generic type argument (e.g. ServiceObjects<Foo>: " +
-									annotated);
-					}
-					break;
-				case TUPLE:
-					if (calculatedServiceClass == Map.Entry.class) {
-						throw new IllegalArgumentException(
-							"A @Reference cannot bind a Map.Entry without specifying either the " +
-								"@Reference.service property or a generic type argument (e.g. Map.Entry<Map<String, Object>, Foo>: " +
-									annotated);
-					}
-					break;
-				default:
-			}
-
-			return calculatedServiceClass;
-		}
-
-		switch(collectionType) {
-			case PROPERTIES:
-				if (Map.class.isAssignableFrom(calculatedServiceClass)) {
-					return service;
-				}
-				break;
-			case REFERENCE:
-				if ((calculatedServiceClass == null) ||
-					ServiceReference.class.isAssignableFrom(calculatedServiceClass)) {
-					return service;
-				}
-				break;
-			case SERVICEOBJECTS:
-				if ((calculatedServiceClass == null) ||
-					ServiceObjects.class.isAssignableFrom(calculatedServiceClass)) {
-					return service;
-				}
-				break;
-			case TUPLE:
-				if ((calculatedServiceClass != null) &&
-					Map.Entry.class.isAssignableFrom(calculatedServiceClass)) {
-
-					if (!checkKey(calculatedServiceClass)) {
-						throw new IllegalArgumentException(
-							"Tuples must have a key of type Map<String, [? or Object]>: " + calculatedServiceClass);
-					}
+		if (ServiceReference.class == cast(rawType)) {
+			_collectionType = CollectionType.REFERENCE;
 
-					return service;
-				}
-				else if ((calculatedServiceClass == null) ||
-					calculatedServiceClass.isAssignableFrom(service)) {
+			calculateServiceType(argument);
 
-					return service;
-				}
-				break;
-			case SERVICE:
-				if (((calculatedServiceClass == null) &&
-						((cardinality == ReferenceCardinality.MULTIPLE) ||
-						(cardinality == ReferenceCardinality.AT_LEAST_ONE))) ||
-					((calculatedServiceClass != null) &&
-						calculatedServiceClass.isAssignableFrom(service))) {
-					return service;
-				}
+			return;
 		}
 
-		throw new IllegalArgumentException(
-			"@Reference.service " + service + " is not compatible with annotated " + annotated);
+		_serviceType = cast(rawType);
+
+		if (_serviceType.getTypeParameters().length > 0) {
+			throw new IllegalArgumentException(
+				"Illegal service type: " + argument);
+		}
 	}
 
+//	private static Class<?> calculateServiceClass(
+//		Class<?> service, ReferenceCardinality cardinality, CollectionType collectionType, Type injectionPointType, Annotated annotated) {
+//
+//		Class<?> calculatedServiceClass = calculateServiceClass(injectionPointType);
+//
+//		if ((service == null) || (service == Object.class)) {
+//			if (calculatedServiceClass == null) {
+//				throw new IllegalArgumentException(
+//					"Could not determine the service type from @Reference on annotated " +
+//						annotated);
+//			}
+//
+//			switch(collectionType) {
+//				case PROPERTIES:
+//					if (calculatedServiceClass == Map.class) {
+//						throw new IllegalArgumentException(
+//							"A @Reference cannot bind service properties to a Map<String, Object> without " +
+//								"specifying the @Reference.service property: " + annotated);
+//					}
+//					break;
+//				case REFERENCE:
+//					if (calculatedServiceClass == ServiceReference.class) {
+//						throw new IllegalArgumentException(
+//							"A @Reference cannot bind a ServiceReference without specifying either the " +
+//								"@Reference.service property or a generic type argument (e.g. ServiceReference<Foo>: " +
+//									annotated);
+//					}
+//					break;
+//				case SERVICEOBJECTS:
+//					if	(calculatedServiceClass == ServiceObjects.class) {
+//						throw new IllegalArgumentException(
+//							"A @Reference cannot bind a ServiceObjects without specifying either the " +
+//								"@Reference.service property or a generic type argument (e.g. ServiceObjects<Foo>: " +
+//									annotated);
+//					}
+//					break;
+//				case TUPLE:
+//					if (calculatedServiceClass == Map.Entry.class) {
+//						throw new IllegalArgumentException(
+//							"A @Reference cannot bind a Map.Entry without specifying either the " +
+//								"@Reference.service property or a generic type argument (e.g. Map.Entry<Map<String, Object>, Foo>: " +
+//									annotated);
+//					}
+//					break;
+//				default:
+//			}
+//
+//			return calculatedServiceClass;
+//		}
+//
+//		switch(collectionType) {
+//			case PROPERTIES:
+//				if (Map.class.isAssignableFrom(calculatedServiceClass)) {
+//					return service;
+//				}
+//				break;
+//			case REFERENCE:
+//				if ((calculatedServiceClass == null) ||
+//					ServiceReference.class.isAssignableFrom(calculatedServiceClass)) {
+//					return service;
+//				}
+//				break;
+//			case SERVICEOBJECTS:
+//				if ((calculatedServiceClass == null) ||
+//					ServiceObjects.class.isAssignableFrom(calculatedServiceClass)) {
+//					return service;
+//				}
+//				break;
+//			case TUPLE:
+//				if ((calculatedServiceClass != null) &&
+//					Map.Entry.class.isAssignableFrom(calculatedServiceClass)) {
+//
+//					if (!checkKey(calculatedServiceClass)) {
+//						throw new IllegalArgumentException(
+//							"Tuples must have a key of type Map<String, [? or Object]>: " + calculatedServiceClass);
+//					}
+//
+//					return service;
+//				}
+//				else if ((calculatedServiceClass == null) ||
+//					calculatedServiceClass.isAssignableFrom(service)) {
+//
+//					return service;
+//				}
+//				break;
+//			case SERVICE:
+//				if (((calculatedServiceClass == null) &&
+//						((cardinality == ReferenceCardinality.MULTIPLE) ||
+//						(cardinality == ReferenceCardinality.AT_LEAST_ONE))) ||
+//					((calculatedServiceClass != null) &&
+//						calculatedServiceClass.isAssignableFrom(service))) {
+//					return service;
+//				}
+//		}
+//
+//		throw new IllegalArgumentException(
+//			"@Reference.service " + service + " is not compatible with annotated " + annotated);
+//	}
+
 	// check the key type to make sure it complies with Map<String, ?> OR Map<String, Object>
 	private static boolean checkKey(Type mapEntryType) {
 		if (!(mapEntryType instanceof ParameterizedType)) {
@@ -766,105 +671,51 @@ public class ReferenceModel {
 		return true;
 	}
 
-	private static ReferenceCardinality _cardinality(Attributes attributes) {
-		return ReferenceCardinality.get(
-			getValue(CDI10_URI, CARDINALITY_ATTRIBUTE, attributes, ReferenceCardinality.DEFAULT.toString()));
-	}
-
-	private static String _name(Attributes attributes) {
-		return getValue(CDI10_URI, NAME_ATTRIBUTE, attributes);
+//	private static Type upwrapCDITypes(Type type) {
+//		if (type instanceof ParameterizedType) {
+//			ParameterizedType pType = (ParameterizedType)type;
+//
+//			Type rawType = pType.getRawType();
+//
+//			if (Instance.class == Reflection.cast(rawType) ||
+//				ServiceEvent.class == Reflection.cast(rawType)) {
+//
+//				type = pType.getActualTypeArguments()[0];
+//			}
+//		}
+//
+//		return type;
+//	}
+
+	public ReferenceTemplateDTO toDTO() {
+		ReferenceTemplateDTO dto = new ReferenceTemplateDTO();
+		dto.maximumCardinality = _multiplicity;
+		dto.minimumCardinality = (_multiplicity == MaximumCardinality.ONE) ? (_optional?0:1) : (0);
+		dto.name = _name;
+		dto.policy = (_dynamic) ? Policy.DYNAMIC : Policy.STATIC;
+		dto.policyOption = (_greedy) ? PolicyOption.GREEDY: PolicyOption.RELUCTANT;
+		dto.targetFilter = _targetFilter;
+		dto.serviceType = _serviceType.getName();
+		return dto;
 	}
 
-	private static ReferencePolicyOption _option(Attributes attributes) {
-		return ReferencePolicyOption.get(
-			getValue(CDI10_URI, POLICY_OPTION_ATTRIBUTE, attributes, ReferencePolicyOption.DEFAULT.toString()));
-	}
-
-	private static ReferencePolicy _policy(Attributes attributes) {
-		return ReferencePolicy.get(
-			getValue(CDI10_URI, POLICY_ATTRIBUTE, attributes, ReferencePolicy.DEFAULT.toString()));
-	}
-
-	private static ReferenceScope _scope(Attributes attributes) {
-		return ReferenceScope.get(getValue(
-			CDI10_URI, SCOPE_ATTRIBUTE, attributes, ReferenceScope.DEFAULT.toString()));
-	}
-
-	private static String _target(Attributes attributes) {
-		return getValue(CDI10_URI, TARGET_ATTRIBUTE, attributes);
-	}
-
-	private static Type upwrapCDITypes(Type type) {
-		if (type instanceof ParameterizedType) {
-			ParameterizedType pType = (ParameterizedType)type;
-
-			Type rawType = pType.getRawType();
-
-			if (Instance.class == cast(rawType) ||
-				ServiceEvent.class == cast(rawType)) {
-
-				type = pType.getActualTypeArguments()[0];
-			}
-		}
-
-		return type;
-	}
+	private static final String _emptyFilter = "";
 
 	private static final TypeReference<Map<String, String>> _mapType = new TypeReference<Map<String, String>>(){};
 
-	private final Class<?> _beanClass;
-	private final ReferenceCardinality _cardinality;
-	private final CollectionType _collectionType;
-	private final AtomicBoolean _found = new AtomicBoolean();
+	private final Annotated _annotated;
+	private Class<?> _beanClass;
+	private CollectionType _collectionType = CollectionType.SERVICE;
+	private boolean _dynamic = false;
+	private boolean _greedy = false;
 	private final Type _injectionPointType;
-	private final String _name;
-	private final ReferencePolicyOption _option;
-	private final ReferencePolicy _policy;
+	private final Member _member;
+	private MaximumCardinality _multiplicity = MaximumCardinality.ONE;
+	private String _name;
+	private boolean _optional = false;
 	private final Set<Annotation> _qualifiers;
-	private final ReferenceScope _scope;
-	private final Class<?> _service;
+	private Class<?> _referenceClass;
+	private Class<?> _serviceType;
 	private String _string;
-	private final String _target;
-	private final Set<Type> _types;
-
-	private static class ReferenceAnnotated implements Annotated {
-
-		public ReferenceAnnotated(Class<?> service) {
-			_service = service;
-		}
-
-		@Override
-		public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
-			return null;
-		}
-
-		@Override
-		public Set<Annotation> getAnnotations() {
-			return Collections.emptySet();
-		}
-
-		@Override
-		public <T extends Annotation> Set<T> getAnnotations(Class<T> annotationType) {
-			return null;
-		}
-
-		@Override
-		public Type getBaseType() {
-			return _service;
-		}
-
-		@Override
-		public Set<Type> getTypeClosure() {
-			return Sets.hashSet(_service);
-		}
-
-		@Override
-		public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
-			return false;
-		}
-
-		private final Class<?> _service;
-
-	}
-
+	private String _targetFilter = _emptyFilter;
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/service/ServiceDeclaration.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/service/ServiceDeclaration.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/service/ServiceDeclaration.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/service/ServiceDeclaration.java Sat Apr 14 01:09:09 2018
@@ -16,17 +16,11 @@ package org.apache.aries.cdi.container.i
 
 import static org.apache.aries.cdi.container.internal.util.Reflection.cast;
 
-import java.util.Arrays;
-import java.util.Dictionary;
-import java.util.stream.Collectors;
-
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
 
-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.component.OSGiBean;
 import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.apache.aries.cdi.container.internal.util.Types;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.PrototypeServiceFactory;
 import org.osgi.framework.ServiceFactory;
@@ -36,7 +30,7 @@ public class ServiceDeclaration {
 
 	public ServiceDeclaration(
 		ContainerState containerState,
-		ComponentModel componentModel,
+		OSGiBean componentModel,
 		Bean<?> bean,
 		CreationalContext<?> creationalContext) {
 
@@ -48,7 +42,7 @@ public class ServiceDeclaration {
 
 		Object instance = null;
 
-		if (_componentModel.getServiceScope() == ServiceScope.SINGLETON) {
+/*		if (_componentModel.getServiceScope() == ServiceScope.SINGLETON) {
 			instance = new SingletonScopeWrapper();
 		}
 		else if (_componentModel.getServiceScope() == ServiceScope.BUNDLE) {
@@ -57,11 +51,11 @@ public class ServiceDeclaration {
 		else if (_componentModel.getServiceScope() == ServiceScope.PROTOTYPE) {
 			instance = new PrototypeScopeWrapper();
 		}
-
+*/
 		_instance = instance;
 	}
 
-	public String[] getClassNames() {
+/*	public String[] getClassNames() {
 		return Arrays.stream(
 			Types.types(_componentModel, _componentModel.getBeanClass(), _containerState.classLoader())
 		).map(
@@ -80,12 +74,12 @@ public class ServiceDeclaration {
 	public ServiceScope getScope() {
 		return _componentModel.getServiceScope();
 	}
-
+*/
 	public Object getServiceInstance() {
 		return _instance;
 	}
 
-	public Dictionary<String, ?> getServiceProperties() {
+/*	public Dictionary<String, ?> getServiceProperties() {
 		return new ComponentProperties().bean(
 			_bean
 		).componentModel(
@@ -94,9 +88,9 @@ public class ServiceDeclaration {
 			_containerState
 		).build();
 	}
-
+*/
 	private final Bean<?> _bean;
-	private final ComponentModel _componentModel;
+	private final OSGiBean _componentModel;
 	private final ContainerState _containerState;
 	private final CreationalContext<?> _creationalContext;
 	private final Object _instance;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Types.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Types.java?rev=1829114&r1=1829113&r2=1829114&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Types.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Types.java Sat Apr 14 01:09:09 2018
@@ -17,12 +17,9 @@ package org.apache.aries.cdi.container.i
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.enterprise.inject.spi.InjectionPoint;
 
-import org.apache.aries.cdi.container.internal.component.ComponentModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -88,7 +85,7 @@ public class Types {
 		return type.getTypeName();
 	}
 
-	public static Class<?>[] types(
+/*	public static Class<?>[] types(
 		ComponentModel componentModel, Class<?> beanClass, ClassLoader classLoader) {
 
 		List<Class<?>> classes = new ArrayList<>();
@@ -125,7 +122,7 @@ public class Types {
 
 		return classes.toArray(new Class[0]);
 	}
-
+*/
 	public static final Logger _log = LoggerFactory.getLogger(Types.class);
 
 }
\ No newline at end of file

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/Component.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/Component.java?rev=1829114&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/Component.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/Component.java Sat Apr 14 01:09:09 2018
@@ -0,0 +1,19 @@
+package org.apache.aries.cdi.container.internal.v2.component;
+
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
+import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
+
+public interface Component {
+
+	void addConfiguration(ConfigurationTemplateDTO dto);
+
+	void addReference(ReferenceTemplateDTO dto);
+
+	ComponentDTO getSnapshot();
+
+	ComponentTemplateDTO getTemplate();
+
+
+}

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/ContainerComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/ContainerComponent.java?rev=1829114&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/ContainerComponent.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/v2/component/ContainerComponent.java Sat Apr 14 01:09:09 2018
@@ -0,0 +1,56 @@
+package org.apache.aries.cdi.container.internal.v2.component;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
+import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationPolicy;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.MaximumCardinality;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
+
+public class ContainerComponent implements Component {
+
+	public ContainerComponent(String containerId) {
+		_snapshot = new ComponentDTO();
+		_snapshot.template = new ComponentTemplateDTO();
+		_snapshot.template.activations = new CopyOnWriteArrayList<>();
+		_snapshot.template.configurations = new CopyOnWriteArrayList<>();
+
+		ConfigurationTemplateDTO factoryConfig = new ConfigurationTemplateDTO();
+		factoryConfig.componentConfiguration = true;
+		factoryConfig.maximumCardinality = MaximumCardinality.ONE;
+		factoryConfig.pid = containerId;
+		factoryConfig.policy = ConfigurationPolicy.OPTIONAL;
+
+		_snapshot.template.configurations.add(factoryConfig);
+		_snapshot.template.name = containerId;
+		_snapshot.template.references = new CopyOnWriteArrayList<>();
+		_snapshot.template.type = ComponentTemplateDTO.Type.CONTAINER;
+	}
+
+	@Override
+	public void addConfiguration(ConfigurationTemplateDTO dto) {
+		if (dto == null) return;
+		_snapshot.template.configurations.add(dto);
+	}
+
+	@Override
+	public void addReference(ReferenceTemplateDTO dto) {
+		if (dto == null) return;
+		_snapshot.template.references.add(dto);
+	}
+
+	@Override
+	public ComponentDTO getSnapshot() {
+		return _snapshot; // TODO make safe copy using converter
+	}
+
+	@Override
+	public ComponentTemplateDTO getTemplate() {
+		return _snapshot.template; // TODO make safe copy using converter
+	}
+
+	private final ComponentDTO _snapshot;
+
+}