You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2008/12/08 19:22:09 UTC

svn commit: r724435 [1/2] - /tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/

Author: slaws
Date: Mon Dec  8 10:22:09 2008
New Revision: 724435

URL: http://svn.apache.org/viewvc?rev=724435&view=rev
Log:
Start tidying the builders. No function change. First remove anything from the base class that is not actually shared to give a clearer view of the function of each builder. Shared function now lives in a new single base class. 

Added:
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java   (with props)
Removed:
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseConfigurationBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseWireBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BindingConfigurationUtil.java
Modified:
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBindingConfigurationBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBindingURIBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositePolicyBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositePromotionBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/EndpointBuilderImpl.java

Added: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java?rev=724435&view=auto
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java (added)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java Mon Dec  8 10:22:09 2008
@@ -0,0 +1,572 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.assembly.builder.impl;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.TransformerFactory;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.ComponentProperty;
+import org.apache.tuscany.sca.assembly.ComponentReference;
+import org.apache.tuscany.sca.assembly.ComponentService;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.Contract;
+import org.apache.tuscany.sca.assembly.EndpointFactory;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.SCABinding;
+import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.builder.AutomaticBinding;
+import org.apache.tuscany.sca.assembly.builder.ComponentPreProcessor;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.definitions.Definitions;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.policy.IntentAttachPoint;
+import org.apache.tuscany.sca.policy.IntentAttachPointType;
+
+/**
+ * Base class for Builder implementations 
+ *
+ * @version $Rev$ $Date$
+ */
+public abstract class BaseBuilderImpl implements CompositeBuilder {
+    protected static final String SCA10_NS = "http://www.osoa.org/xmlns/sca/1.0";
+    protected static final String BINDING_SCA = "binding.sca";
+    protected static final QName BINDING_SCA_QNAME = new QName(SCA10_NS, BINDING_SCA);
+
+    protected AssemblyFactory assemblyFactory;
+    protected SCABindingFactory scaBindingFactory;
+    protected InterfaceContractMapper interfaceContractMapper;
+    protected DocumentBuilderFactory documentBuilderFactory;
+    protected TransformerFactory transformerFactory;
+
+
+    protected BaseBuilderImpl(AssemblyFactory assemblyFactory,
+                              SCABindingFactory scaBindingFactory,
+                              DocumentBuilderFactory documentBuilderFactory,
+                              TransformerFactory transformerFactory,
+                              InterfaceContractMapper interfaceContractMapper) {
+        this.assemblyFactory = assemblyFactory;
+        this.scaBindingFactory = scaBindingFactory;
+        this.documentBuilderFactory = documentBuilderFactory;
+        this.transformerFactory = transformerFactory;
+        this.interfaceContractMapper = interfaceContractMapper;
+    }
+    
+    /**
+     * Report a warning.
+     * 
+     * @param monitor
+     * @param problems
+     * @param message
+     * @param model
+     */
+    protected void warning(Monitor monitor, String message, Object model, String... messageParameters) {
+        if (monitor != null) {
+            Problem problem = monitor.createProblem(this.getClass().getName(), "assembly-validation-messages", Severity.WARNING, model, message, (Object[])messageParameters);
+            monitor.problem(problem);
+        }
+    }
+    
+    /**
+     * Report a error.
+     * 
+     * @param monitor
+     * @param problems
+     * @param message
+     * @param model
+     */
+    protected void error(Monitor monitor, String message, Object model, String... messageParameters) {
+        if (monitor != null) {
+            Problem problem = monitor.createProblem(this.getClass().getName(), "assembly-validation-messages", Severity.ERROR, model, message, (Object[])messageParameters);
+            monitor.problem(problem);
+        }
+    }  
+    
+    /**
+     * Report a exception.
+     * 
+     * @param problems
+     * @param message
+     * @param model
+     */
+    protected void error(Monitor monitor, String message, Object model, Exception ex) {
+        if (monitor != null) {
+            Problem problem = null;
+            problem = monitor.createProblem(this.getClass().getName(), "assembly-validation-messages", Severity.ERROR, model, message, ex);
+            monitor.problem(problem);
+        }
+    }    
+
+    /**
+     * Index components, services and references inside a composite.
+     * @param composite
+     * @param components
+     * @param componentServices
+     * @param componentReferences
+     */
+    protected void indexComponentsServicesAndReferences(Composite composite,
+                                                        Map<String, Component> components,
+                                                        Map<String, ComponentService> componentServices,
+                                                        Map<String, ComponentReference> componentReferences) {
+
+        for (Component component : composite.getComponents()) {
+            
+            // Index components by name
+            components.put(component.getName(), component);
+            
+            ComponentService nonCallbackService = null;
+            int nonCallbackServices = 0;
+            for (ComponentService componentService : component.getServices()) {
+                                  
+                // Index component services by component name / service name
+                String uri = component.getName() + '/' + componentService.getName();
+                componentServices.put(uri, componentService);
+                
+                boolean promotedService = false;
+                if (componentService.getName() != null && componentService.getName().indexOf("$promoted$") > -1) {
+                    promotedService = true;
+                }
+                
+                // count how many non-callback, non-promoted services there are
+                // if there is only one the component name also acts as the service name
+                if ((!componentService.isCallback()) && (!promotedService)) {                            
+                    
+                    // Check how many non callback non-promoted services we have
+                    if (nonCallbackServices == 0) {
+                        nonCallbackService = componentService;
+                    }
+                    nonCallbackServices++;
+                }
+
+            }
+            
+            if (nonCallbackServices == 1) {
+                // If we have a single non callback service, index it by
+                // component name as well
+                componentServices.put(component.getName(), nonCallbackService);
+            }
+            
+            // Index references by component name / reference name
+            for (ComponentReference componentReference : component.getReferences()) {
+                String uri = component.getName() + '/' + componentReference.getName();
+                componentReferences.put(uri, componentReference);
+            }
+        }
+    }
+    
+    protected void indexComponentPropertiesServicesAndReferences(
+            Component component,
+            Map<String, ComponentService> componentServices,
+            Map<String, ComponentReference> componentReferences,
+            Map<String, ComponentProperty> componentProperties, Monitor monitor) {
+        for (ComponentService componentService : component.getServices()) {
+            if (componentServices.containsKey(componentService.getName())) {
+                warning(monitor, "DuplicateComponentServiceName", component,
+                        component.getName(), componentService.getName());
+            } else {
+                componentServices.put(componentService.getName(),
+                        componentService);
+            }
+        }
+        for (ComponentReference componentReference : component.getReferences()) {
+            if (componentReferences.containsKey(componentReference.getName())) {
+                warning(monitor, "DuplicateComponentReferenceName", component,
+                        component.getName(), componentReference.getName());
+            } else {
+                componentReferences.put(componentReference.getName(),
+                        componentReference);
+            }
+        }
+        for (ComponentProperty componentProperty : component.getProperties()) {
+            if (componentProperties.containsKey(componentProperty.getName())) {
+                warning(monitor, "DuplicateComponentPropertyName", component,
+                        component.getName(), componentProperty.getName());
+            } else {
+                componentProperties.put(componentProperty.getName(),
+                        componentProperty);
+            }
+        }
+
+    }
+
+    protected void indexImplementationPropertiesServicesAndReferences(
+            Component component, Map<String, Service> services,
+            Map<String, Reference> references,
+            Map<String, Property> properties, Monitor monitor) {
+        // First check that the component has a resolved implementation
+        Implementation implementation = component.getImplementation();
+        if (implementation == null) {
+            // A component must have an implementation
+            warning(monitor, "NoComponentImplementation", component, component
+                    .getName());
+
+        } else if (implementation.isUnresolved()) {
+
+            // The implementation must be fully resolved
+            warning(monitor, "UnresolvedComponentImplementation", component,
+                    component.getName(), implementation.getURI());
+
+        } else {
+
+            // Index properties, services and references, also check for
+            // duplicates
+            for (Property property : implementation.getProperties()) {
+                if (properties.containsKey(property.getName())) {
+                    warning(monitor, "DuplicateImplementationPropertyName",
+                            component, component.getName(), property.getName());
+                } else {
+                    properties.put(property.getName(), property);
+                }
+            }
+            for (Service service : implementation.getServices()) {
+                if (services.containsKey(service.getName())) {
+                    warning(monitor, "DuplicateImplementationServiceName",
+                            component, component.getName(), service.getName());
+                } else {
+                    services.put(service.getName(), service);
+                }
+            }
+            for (Reference reference : implementation.getReferences()) {
+                if (references.containsKey(reference.getName())) {
+                    warning(monitor, "DuplicateImplementationReferenceName",
+                            component, component.getName(), reference.getName());
+                } else {
+                    references.put(reference.getName(), reference);
+                }
+            }
+        }
+
+    }    
+    
+    /**
+     * Reconcile component properties and the properties defined by the
+     * component type.
+     * 
+     * @param component
+     * @param properties
+     * @param componentProperties
+     * @param problems
+     */
+    protected void reconcileProperties(Component component,
+                                     Map<String, Property> properties,
+                                     Map<String, ComponentProperty> componentProperties,
+                                     Monitor monitor) {
+
+        // Connect component properties to their properties
+        for (ComponentProperty componentProperty : component.getProperties()) {
+            Property property = properties.get(componentProperty.getName());
+            if (property != null) {
+                componentProperty.setProperty(property);
+            } else {
+                warning(monitor, "PropertyNotFound", component, component.getName(), componentProperty.getName());
+            }
+        }
+
+        // Create component properties for all properties
+        if (component.getImplementation() != null) {
+            for (Property property : component.getImplementation().getProperties()) {
+                if (!componentProperties.containsKey(property.getName())) {
+                    ComponentProperty componentProperty = assemblyFactory.createComponentProperty();
+                    componentProperty.setName(property.getName());
+                    componentProperty.setMany(property.isMany());
+                    componentProperty.setXSDElement(property.getXSDElement());
+                    componentProperty.setXSDType(property.getXSDType());
+                    componentProperty.setProperty(property);
+                    component.getProperties().add(componentProperty);
+                }
+            }
+        }
+
+        // Reconcile component properties and their properties
+        for (ComponentProperty componentProperty : component.getProperties()) {
+            Property property = componentProperty.getProperty();
+            if (property != null) {
+
+                // Check that a component property does not override the
+                // mustSupply attribute
+                if (!property.isMustSupply() && componentProperty.isMustSupply()) {
+                    warning(monitor, "PropertyMustSupplyIncompatible", component, component.getName(), componentProperty.getName());
+                }
+
+                // Default to the mustSupply attribute specified on the property
+                if (!componentProperty.isMustSupply())
+                    componentProperty.setMustSupply(property.isMustSupply());
+
+                // Default to the value specified on the property
+                if (componentProperty.getValue() == null) {
+                    componentProperty.setValue(property.getValue());
+                }
+                
+                // Override the property value for the composite
+                if(component.getImplementation() instanceof Composite) {
+                    property.setValue(componentProperty.getValue());
+                }
+
+                // Check that a value is supplied
+                if (componentProperty.getValue() == null && property.isMustSupply()) {
+                    warning(monitor, "PropertyMustSupplyNull", component, component.getName(), componentProperty.getName());
+                }
+
+                // Check that a a component property does not override the
+                // many attribute
+                if (!property.isMany() && componentProperty.isMany()) {
+
+                    warning(monitor, "PropertyOverrideManyAttribute", component, component.getName(), componentProperty.getName());
+                }
+
+                // Default to the many attribute defined on the property
+                componentProperty.setMany(property.isMany());
+
+                // Default to the type and element defined on the property
+                if (componentProperty.getXSDType() == null) {
+                    componentProperty.setXSDType(property.getXSDType());
+                }
+                if (componentProperty.getXSDElement() == null) {
+                    componentProperty.setXSDElement(property.getXSDElement());
+                }
+
+                // Check that a type or element are specified
+                if (componentProperty.getXSDElement() == null && componentProperty.getXSDType() == null) {
+                    warning(monitor, "NoTypeForComponentProperty", component, component.getName(), componentProperty.getName());
+                }
+            }
+        }
+    }
+
+    /**
+     * Reconcile component references with the references defined on the
+     * component type.
+     * 
+     * @param component
+     * @param references
+     * @param componentReferences
+     * @param monitor
+     */
+    protected void reconcileReferences(Component component,
+                                     Map<String, Reference> references,
+                                     Map<String, ComponentReference> componentReferences,
+                                     Monitor monitor) {
+
+        // Connect each component reference to the corresponding reference
+        for (ComponentReference componentReference : component.getReferences()) {
+            if (componentReference.getReference() != null || componentReference.isCallback()) {
+                continue;
+            }
+            Reference reference = references.get(componentReference.getName());
+            if (reference != null) {
+                componentReference.setReference(reference);
+            } else {
+                if (!componentReference.getName().startsWith("$self$.")) {
+                    error(monitor, "ReferenceNotFound", component, component.getName(), componentReference.getName());
+                }
+            }
+        }
+
+        // Create a component reference for each reference
+        if (component.getImplementation() != null) {
+            for (Reference reference : component.getImplementation().getReferences()) {
+                if (!componentReferences.containsKey(reference.getName())) {
+                    ComponentReference componentReference =
+                        assemblyFactory.createComponentReference();
+                    componentReference.setIsCallback(reference.isCallback());
+                    componentReference.setName(reference.getName());
+                    componentReference.setReference(reference);
+                    component.getReferences().add(componentReference);
+                }
+            }
+        }
+
+        // Reconcile each component reference with its reference
+        for (ComponentReference componentReference : component.getReferences()) {
+            Reference reference = componentReference.getReference();
+            if (reference != null) {
+                // Reconcile multiplicity
+                if (componentReference.getMultiplicity() != null) {
+                    if (!ReferenceConfigurationUtil.isValidMultiplicityOverride(reference.getMultiplicity(),
+                                                                   componentReference
+                                                                       .getMultiplicity())) {
+                        warning(monitor, "ReferenceIncompatibleMultiplicity", component, component.getName(), componentReference.getName());
+                    }
+                } else {
+                    componentReference.setMultiplicity(reference.getMultiplicity());
+                }
+
+                // Reconcile interface
+                InterfaceContract interfaceContract = reference.getInterfaceContract();
+                if (componentReference.getInterfaceContract() != null) {
+                    if (interfaceContract != null && !componentReference.getInterfaceContract().equals(reference
+                        .getInterfaceContract())) {
+                        if (!interfaceContractMapper.isCompatible(componentReference.getInterfaceContract(),
+                                                                  interfaceContract)) {
+                            warning(monitor, "ReferenceIncompatibleComponentInterface", component, component.getName(), componentReference.getName());
+                        }
+                    }
+                } else {
+                    componentReference.setInterfaceContract(interfaceContract);
+                }
+
+                // Reconcile bindings 
+                if (componentReference.getBindings().isEmpty()) {
+                    componentReference.getBindings().addAll(reference.getBindings());
+                }
+                
+                // Reconcile callback bindings
+                if (componentReference.getCallback() == null) {
+                    componentReference.setCallback(reference.getCallback());
+                    if (componentReference.getCallback() == null) {
+                        // Create an empty callback to avoid null check
+                        componentReference.setCallback(assemblyFactory.createCallback());
+                    }
+
+                } else if (componentReference.getCallback().getBindings().isEmpty() && reference
+                    .getCallback() != null) {
+                    componentReference.getCallback().getBindings().addAll(reference.getCallback()
+                        .getBindings());
+                }
+                
+                // Propagate autowire setting from the component
+                if (componentReference.getAutowire() == null) {
+                    componentReference.setAutowire(component.getAutowire());
+                }
+
+                // Reconcile targets
+                if (componentReference.getTargets().isEmpty()) {
+                    componentReference.getTargets().addAll(reference.getTargets());
+                }
+            }
+        }
+    }
+
+    /**
+     * Reconcile component services and services defined on the component type.
+     * 
+     * @param component
+     * @param services
+     * @param componentServices
+     * @param monitor
+     */
+    protected void reconcileServices(Component component,
+                                   Map<String, Service> services,
+                                   Map<String, ComponentService> componentServices,
+                                   Monitor monitor) {
+
+        // Connect each component service to the corresponding service
+        for (ComponentService componentService : component.getServices()) {
+            if (componentService.getService() != null || componentService.isCallback()) {
+                continue;
+            }
+            Service service = services.get(componentService.getName());
+            if (service != null) {
+                componentService.setService(service);
+            } else {
+                warning(monitor, "ServiceNotFoundForComponentService", component, component.getName(), componentService.getName());
+            }
+        }
+
+        // Create a component service for each service
+        if (component.getImplementation() != null) {
+            for (Service service : component.getImplementation().getServices()) {
+                if (!componentServices.containsKey(service.getName())) {
+                    ComponentService componentService = assemblyFactory.createComponentService();
+                    componentService.setIsCallback(service.isCallback());
+                    String name = service.getName();
+                    componentService.setName(name);
+                    componentService.setService(service);
+                    component.getServices().add(componentService);
+                    componentServices.put(name, componentService);
+                }
+            }
+        }
+
+        //Reconcile each component service with its service
+        for (ComponentService componentService : component.getServices()) {
+            Service service = componentService.getService();
+            if (service != null) {
+                // Reconcile interface
+                InterfaceContract interfaceContract = service.getInterfaceContract();
+                if (componentService.getInterfaceContract() != null) {
+                    if (interfaceContract != null && !componentService.getInterfaceContract().equals(interfaceContract)) {
+                        if (!interfaceContractMapper.isCompatible(componentService.getInterfaceContract(),
+                                                                  interfaceContract)) {
+                            warning(monitor, "ServiceIncompatibleComponentInterface", component, component.getName(), componentService.getName());
+                        }
+                    }
+                } else {
+                    componentService.setInterfaceContract(interfaceContract);
+                }
+
+                // Reconcile bindings
+                if (componentService.getBindings().isEmpty()) {
+                    componentService.getBindings().addAll(service.getBindings());
+                }
+                
+                // Reconcile callback bindings
+                if (componentService.getCallback() == null) {
+                    componentService.setCallback(service.getCallback());
+                    if (componentService.getCallback() == null) {
+                        // Create an empty callback to avoid null check
+                        componentService.setCallback(assemblyFactory.createCallback());
+                    }
+                } else if (componentService.getCallback().getBindings().isEmpty() && service
+                    .getCallback() != null) {
+                    componentService.getCallback().getBindings().addAll(service.getCallback()
+                        .getBindings());
+                }
+            }
+        }
+    }    
+    
+    protected SCABinding createSCABinding(Definitions definitions) {
+        SCABinding scaBinding = scaBindingFactory.createSCABinding();
+        
+        // mark the bindings that are added automatically so that they can 
+        // be disregarded for overriding purposes
+        if (scaBinding instanceof AutomaticBinding){
+            ((AutomaticBinding)scaBinding).setIsAutomatic(true);
+        }
+        
+        if ( definitions != null ) {
+            for ( IntentAttachPointType attachPointType : definitions.getBindingTypes() ) {
+                if ( attachPointType.getName().equals(BINDING_SCA_QNAME)) {
+                    ((IntentAttachPoint)scaBinding).setType(attachPointType);
+                }
+            }
+        }
+        
+        return scaBinding;
+    }    
+}

Propchange: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java?rev=724435&r1=724434&r2=724435&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java (original)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java Mon Dec  8 10:22:09 2008
@@ -19,15 +19,31 @@
 
 package org.apache.tuscany.sca.assembly.builder.impl;
 
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.transform.TransformerFactory;
 
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.ComponentProperty;
+import org.apache.tuscany.sca.assembly.ComponentReference;
+import org.apache.tuscany.sca.assembly.ComponentService;
 import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.SCABinding;
 import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.builder.ComponentPreProcessor;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
 import org.apache.tuscany.sca.definitions.Definitions;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.monitor.Monitor;
 
@@ -36,7 +52,7 @@
  *
  * @version $Rev$ $Date$
  */
-public class ComponentConfigurationBuilderImpl extends BaseConfigurationBuilderImpl implements CompositeBuilder {
+public class ComponentConfigurationBuilderImpl extends BaseBuilderImpl implements CompositeBuilder {
 
     @Deprecated
     public ComponentConfigurationBuilderImpl(AssemblyFactory assemblyFactory,
@@ -65,4 +81,315 @@
         configureComponents(composite, definitions, monitor);
     }
     
+    /**
+     * Configure components in the composite.
+     * 
+     * @param composite
+     * @param monitor
+     */
+    protected void configureComponents(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException {
+        configureComponents(composite, null, definitions, monitor);
+        configureSourcedProperties(composite, null);
+    }    
+    
+    /**
+     * Configure components in the composite.
+     * 
+     * @param composite
+     * @param uri
+     * @param problems
+     */
+    private void configureComponents(Composite composite, String uri, Definitions definitions, Monitor monitor) {
+        String parentURI = uri;
+
+        // Process nested composites recursively
+        for (Component component : composite.getComponents()) {
+
+            // Initialize component URI
+            String componentURI;
+            if (parentURI == null) {
+                componentURI = component.getName();
+            } else {
+                componentURI = URI.create(parentURI + '/').resolve(component.getName()).toString();
+            }
+            component.setURI(componentURI);
+
+            Implementation implementation = component.getImplementation();
+            if (implementation instanceof Composite) {
+
+                // Process nested composite
+                configureComponents((Composite)implementation, componentURI, definitions, monitor);
+            }
+        }
+
+        // Initialize service bindings
+        List<Service> compositeServices = composite.getServices();
+        for (Service service : compositeServices) {
+            // Set default binding names 
+            
+            // Create default SCA binding
+            if (service.getBindings().isEmpty()) {
+                SCABinding scaBinding = createSCABinding(definitions);
+                service.getBindings().add(scaBinding);
+            }
+        }
+
+        // Initialize reference bindings
+        for (Reference reference : composite.getReferences()) {
+            // Create default SCA binding
+            if (reference.getBindings().isEmpty()) {
+                SCABinding scaBinding = createSCABinding(definitions);
+                reference.getBindings().add(scaBinding);
+            }
+        }
+
+        // Initialize all component services and references
+        Map<String, Component> components = new HashMap<String, Component>();
+        for (Component component : composite.getComponents()) {
+
+            // Index all components and check for duplicates
+            if (components.containsKey(component.getName())) {
+                error(monitor, "DuplicateComponentName", component, composite.getName().toString(), component.getName());
+            } else {
+                components.put(component.getName(), component);
+            }
+
+            // Propagate the autowire flag from the composite to components
+            if (component.getAutowire() == null) {
+                component.setAutowire(composite.getAutowire());
+            }
+
+            if (component.getImplementation() instanceof ComponentPreProcessor) {
+                ((ComponentPreProcessor)component.getImplementation()).preProcess(component);
+            }
+
+            // Index properties, services and references
+            Map<String, Service> services = new HashMap<String, Service>();
+            Map<String, Reference> references = new HashMap<String, Reference>();
+            Map<String, Property> properties = new HashMap<String, Property>();
+            indexImplementationPropertiesServicesAndReferences(component,
+                                                               services,
+                                                               references,
+                                                               properties,
+                                                               monitor);
+
+            // Index component services, references and properties
+            // Also check for duplicates
+            Map<String, ComponentService> componentServices = new HashMap<String, ComponentService>();
+            Map<String, ComponentReference> componentReferences = new HashMap<String, ComponentReference>();
+            Map<String, ComponentProperty> componentProperties = new HashMap<String, ComponentProperty>();
+            indexComponentPropertiesServicesAndReferences(component,
+                                                          componentServices,
+                                                          componentReferences,
+                                                          componentProperties,
+                                                          monitor);
+
+            // Reconcile component services/references/properties and
+            // implementation services/references and create component
+            // services/references/properties for the services/references
+            // declared by the implementation
+            reconcileServices(component, services, componentServices, monitor);
+            reconcileReferences(component, references, componentReferences, monitor);
+            reconcileProperties(component, properties, componentProperties, monitor);
+
+            // Configure or create callback services for component's references
+            // with callbacks
+            configureCallbackServices(component, componentServices);
+
+            // Configure or create callback references for component's services
+            // with callbacks
+            configureCallbackReferences(component, componentReferences);
+
+            // Initialize service bindings
+            for (ComponentService componentService : component.getServices()) {
+
+                // Create default SCA binding
+                if (componentService.getBindings().isEmpty()) {
+                    SCABinding scaBinding = createSCABinding(definitions);
+                    componentService.getBindings().add(scaBinding);
+                }
+            }
+
+            // Initialize reference bindings
+            for (ComponentReference componentReference : component.getReferences()) {
+
+                // Create default SCA binding
+                if (componentReference.getBindings().isEmpty()) {
+                    SCABinding scaBinding = createSCABinding(definitions);
+                    componentReference.getBindings().add(scaBinding);
+                }
+            }
+        }
+    }    
+    
+    /**
+     * For all the references with callbacks, create a corresponding callback
+     * service.
+     * 
+     * @param component
+     */
+    private void configureCallbackServices(Component component,
+                                           Map<String, ComponentService> componentServices) {
+        for (ComponentReference reference : component.getReferences()) {
+            if (reference.getInterfaceContract() != null && // can be null in
+                                                            // unit tests
+            reference.getInterfaceContract().getCallbackInterface() != null) {
+                ComponentService service =
+                    componentServices.get(reference.getName());
+                if (service == null) {
+                    service = createCallbackService(component, reference);
+                }
+                if (reference.getCallback() != null) {
+                    if (service.getBindings().isEmpty()) {
+                        service.getBindings().addAll(reference.getCallback().getBindings());
+                    }
+                }
+                reference.setCallbackService(service);
+            }
+        }
+    }
+
+    /**
+     * Create a callback service for a component reference
+     * 
+     * @param component
+     * @param reference
+     */
+    private ComponentService createCallbackService(Component component, ComponentReference reference) {
+        ComponentService componentService = assemblyFactory.createComponentService();
+        componentService.setIsCallback(true);
+        componentService.setName(reference.getName());
+        try {
+            InterfaceContract contract =
+                (InterfaceContract)reference.getInterfaceContract().clone();
+            contract.setInterface(contract.getCallbackInterface());
+            contract.setCallbackInterface(null);
+            componentService.setInterfaceContract(contract);
+        } catch (CloneNotSupportedException e) {
+            // will not happen
+        }
+        Reference implReference = reference.getReference();
+        if (implReference != null) {
+            Service implService = assemblyFactory.createService();
+            implService.setName(implReference.getName());
+            try {
+                InterfaceContract implContract =
+                    (InterfaceContract)implReference.getInterfaceContract().clone();
+                implContract.setInterface(implContract.getCallbackInterface());
+                implContract.setCallbackInterface(null);
+                implService.setInterfaceContract(implContract);
+            } catch (CloneNotSupportedException e) {
+                // will not happen
+            }
+            componentService.setService(implService);
+        }
+        component.getServices().add(componentService);
+        return componentService;
+    }
+
+    /**
+     * For all the services with callbacks, create a corresponding callback
+     * reference.
+     * 
+     * @param component
+     */
+    private void configureCallbackReferences(Component component,
+                                             Map<String, ComponentReference> componentReferences) {
+        for (ComponentService service : component.getServices()) {
+            if (service.getInterfaceContract() != null && // can be null in
+                                                            // unit tests
+            service.getInterfaceContract().getCallbackInterface() != null) {
+                ComponentReference reference =
+                    componentReferences.get(service.getName());
+                if (reference == null) {
+                    reference = createCallbackReference(component, service);
+                }
+                if (service.getCallback() != null) {
+                    if (reference.getBindings().isEmpty()) {
+                        reference.getBindings().addAll(service.getCallback().getBindings());
+                    }
+                }
+                service.setCallbackReference(reference);
+            }
+        }
+    }
+
+    /**
+     * Create a callback reference for a component service
+     * 
+     * @param component
+     * @param service
+     */
+    private ComponentReference createCallbackReference(Component component, ComponentService service) {
+        ComponentReference componentReference = assemblyFactory.createComponentReference();
+        componentReference.setIsCallback(true);
+        componentReference.setName(service.getName());
+        try {
+            InterfaceContract contract = (InterfaceContract)service.getInterfaceContract().clone();
+            contract.setInterface(contract.getCallbackInterface());
+            contract.setCallbackInterface(null);
+            componentReference.setInterfaceContract(contract);
+        } catch (CloneNotSupportedException e) {
+            // will not happen
+        }
+        Service implService = service.getService();
+        if (implService != null) {
+            Reference implReference = assemblyFactory.createReference();
+            implReference.setName(implService.getName());
+            try {
+                InterfaceContract implContract =
+                    (InterfaceContract)implService.getInterfaceContract().clone();
+                implContract.setInterface(implContract.getCallbackInterface());
+                implContract.setCallbackInterface(null);
+                implReference.setInterfaceContract(implContract);
+            } catch (CloneNotSupportedException e) {
+                // will not happen
+            }
+            componentReference.setReference(implReference);
+        }
+        component.getReferences().add(componentReference);
+        return componentReference;
+    }
+
+    /**
+     * @param composite
+     */
+    private void configureSourcedProperties(Composite composite, List<ComponentProperty> propertySettings) {
+        // Resolve properties
+        Map<String, Property> compositeProperties = new HashMap<String, Property>();
+        ComponentProperty componentProperty = null;
+        for (Property p : composite.getProperties()) {
+            componentProperty = getComponentPropertyByName(p.getName(), propertySettings);
+            if (componentProperty != null) {
+                compositeProperties.put(p.getName(), componentProperty);
+            } else {
+                compositeProperties.put(p.getName(), p);
+            }
+        }
+    
+        for (Component component : composite.getComponents()) {
+            try {
+                PropertyConfigurationUtil.sourceComponentProperties(compositeProperties, component,
+                                                                    documentBuilderFactory, transformerFactory);
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            Implementation impl = component.getImplementation();
+            if (impl instanceof Composite) {
+                configureSourcedProperties((Composite)impl, component.getProperties());
+            }
+        }
+    }
+
+    private ComponentProperty getComponentPropertyByName(String propertyName, List<ComponentProperty> properties) {
+        if (properties != null) {
+            for (ComponentProperty aProperty : properties) {
+                if (aProperty.getName().equals(propertyName)) {
+                    return aProperty;
+                }
+            }
+        }
+        return null;
+    }    
 }

Modified: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java?rev=724435&r1=724434&r2=724435&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java (original)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java Mon Dec  8 10:22:09 2008
@@ -19,11 +19,29 @@
 
 package org.apache.tuscany.sca.assembly.builder.impl;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.ComponentReference;
+import org.apache.tuscany.sca.assembly.ComponentService;
 import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.CompositeReference;
+import org.apache.tuscany.sca.assembly.Endpoint;
 import org.apache.tuscany.sca.assembly.EndpointFactory;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.assembly.Multiplicity;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Wire;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.DefaultEndpointBuilder;
+import org.apache.tuscany.sca.assembly.builder.EndpointBuilder;
 import org.apache.tuscany.sca.definitions.Definitions;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.monitor.Monitor;
@@ -33,10 +51,15 @@
  *
  * @version $Rev$ $Date$
  */
-public class ComponentReferenceWireBuilderImpl extends BaseWireBuilderImpl implements CompositeBuilder {
+public class ComponentReferenceWireBuilderImpl extends BaseBuilderImpl implements CompositeBuilder {
 
+    protected EndpointFactory endpointFactory;
+    private EndpointBuilder endpointBuilder;
+    
     public ComponentReferenceWireBuilderImpl(AssemblyFactory assemblyFactory, EndpointFactory endpointFactory, InterfaceContractMapper interfaceContractMapper) {
-        super(assemblyFactory, endpointFactory, interfaceContractMapper);
+        super(assemblyFactory, null, null, null, interfaceContractMapper);
+        this.endpointFactory = endpointFactory;
+        this.endpointBuilder = new DefaultEndpointBuilder();
     }
 
     public String getID() {
@@ -46,4 +69,764 @@
     public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException {
         wireComponentReferences(composite, monitor);
     }
+    
+    /**
+     * Wire component references to component services and connect promoted
+     * services/references to component services/references inside a composite.
+     * 
+     * @param composite
+     */
+    protected void wireComponentReferences(Composite composite, Monitor monitor) {
+
+        // Wire nested composites recursively
+        for (Component component : composite.getComponents()) {
+            Implementation implementation = component.getImplementation();
+            if (implementation instanceof Composite) {
+                wireComponentReferences((Composite)implementation, monitor);
+            }
+        }
+
+        // Index components, services and references
+        Map<String, Component> components = new HashMap<String, Component>();
+        Map<String, ComponentService> componentServices = new HashMap<String, ComponentService>();
+        Map<String, ComponentReference> componentReferences = new HashMap<String, ComponentReference>();
+        indexComponentsServicesAndReferences(composite, components, componentServices, componentReferences);
+
+        // Connect composite services and references to the component
+        // services and references that they promote
+        //connectCompositeServices(composite, components, componentServices);
+        //connectCompositeReferences(composite, componentReferences);
+
+        // Compute the policies before connecting component references
+        //computePolicies(composite);
+
+        // Connect component references as described in wires
+        connectWires(composite, componentServices, componentReferences, monitor);
+
+        // Connect component references to their targets
+        connectComponentReferences(composite, components, componentServices, componentReferences, monitor);
+
+        // Validate that references are wired or promoted, according
+        // to their multiplicity
+        for (ComponentReference componentReference : componentReferences.values()) {
+            if (!ReferenceConfigurationUtil.validateMultiplicityAndTargets(componentReference.getMultiplicity(), componentReference
+                .getTargets(), componentReference.getBindings())) {
+                if (componentReference.getTargets().isEmpty()) {
+
+                    // No warning if the reference is promoted out of the current composite
+                    boolean promoted = false;
+                    for (Reference reference : composite.getReferences()) {
+                        CompositeReference compositeReference = (CompositeReference)reference;
+                        if (compositeReference.getPromotedReferences().contains(componentReference)) {
+                            promoted = true;
+                            break;
+                        }
+                    }
+                    if (!promoted && !componentReference.isCallback()) {
+                        warning(monitor, "ReferenceWithoutTargets", composite, composite.getName().toString(), componentReference.getName());
+                    }
+                } else {
+                    warning(monitor, "TooManyReferenceTargets", composite, componentReference.getName());
+                }
+            }
+        }
+        
+        // Finally clear the original reference target lists as we now have
+        // bindings to represent the targets
+        for (ComponentReference componentReference : componentReferences.values()) {
+            componentReference.getTargets().clear();
+        }
+    }  
+    
+    /**
+     * Resolve wires and connect the sources to their targets
+     * 
+     * @param composite
+     * @param componentServices
+     * @param componentReferences
+     * @param problems
+     */
+    private void connectWires(Composite composite,
+                              Map<String, ComponentService> componentServices,
+                              Map<String, ComponentReference> componentReferences,
+                              Monitor monitor) {
+    
+        // For each wire, resolve the source reference, the target service, and
+        // add it to the list of targets of the reference
+        List<Wire> wires = composite.getWires();
+        for (int i = 0, n = wires.size(); i < n; i++) {
+            Wire wire = wires.get(i);
+    
+            ComponentReference resolvedReference;
+            ComponentService resolvedService;
+    
+            // Resolve the source reference
+            ComponentReference source = wire.getSource();
+            if (source != null && source.isUnresolved()) {
+                resolvedReference = componentReferences.get(source.getName());
+                if (resolvedReference != null) {
+                    wire.setSource(resolvedReference);
+                } else {
+                    warning(monitor, "WireSourceNotFound", composite, source.getName());
+                }
+            } else {
+                resolvedReference = wire.getSource();
+            }
+    
+            // Resolve the target service
+            ComponentService target = wire.getTarget();
+            if (target != null && target.isUnresolved()) {
+                resolvedService = componentServices.get(target.getName());
+                if (resolvedService != null) {
+                    wire.setTarget(target);
+                } else {
+                    warning(monitor, "WireTargetNotFound", composite, source.getName());
+                }
+            } else {
+                resolvedService = wire.getTarget();
+            }
+    
+            // Add the target service to the list of targets of the
+            // reference
+            if (resolvedReference != null && resolvedService != null) {
+                // Check that the target component service provides
+                // a superset of
+                // the component reference interface
+                if (resolvedReference.getInterfaceContract() == null || interfaceContractMapper
+                    .isCompatible(resolvedReference.getInterfaceContract(), resolvedService.getInterfaceContract())) {
+    
+                    //resolvedReference.getTargets().add(resolvedService);
+                    resolvedReference.getTargets().add(wire.getTarget());
+                } else {
+                    warning(monitor, "WireIncompatibleInterface", composite, source.getName(), target.getName());
+                }
+            }
+        }
+    
+        // Clear the list of wires
+        composite.getWires().clear();
+    }
+    
+    private List<Endpoint> createComponentReferenceTargets(Composite composite,
+            Map<String, Component> components,
+            Map<String, ComponentService> componentServices,
+            ComponentReference componentReference, Monitor monitor) {
+
+        List<Endpoint> endpoints = new ArrayList<Endpoint>();
+
+        if (componentReference.getAutowire() == Boolean.TRUE
+                && componentReference.getTargets().isEmpty()) {
+
+            // Find suitable targets in the current composite for an
+            // autowired reference
+            Multiplicity multiplicity = componentReference.getMultiplicity();
+            for (Component targetComponent : composite.getComponents()) {
+                // prevent autowire connecting to self
+                boolean skipSelf = false;
+                for (ComponentReference targetComponentReference : targetComponent
+                        .getReferences()) {
+                    if (componentReference == targetComponentReference) {
+                        skipSelf = true;
+                    }
+                }
+
+                if (!skipSelf) {
+                    for (ComponentService targetComponentService : targetComponent
+                            .getServices()) {
+                        if (componentReference.getInterfaceContract() == null
+                                || interfaceContractMapper.isCompatible(
+                                        componentReference
+                                                .getInterfaceContract(),
+                                        targetComponentService
+                                                .getInterfaceContract())) {
+
+                            Endpoint endpoint = endpointFactory
+                                    .createEndpoint();
+                            endpoint.setTargetName(targetComponent.getName());
+                            endpoint.setSourceComponent(null); // TODO - fixed
+                                                               // up at start
+                            endpoint
+                                    .setSourceComponentReference(componentReference);
+                            endpoint.setInterfaceContract(componentReference
+                                    .getInterfaceContract());
+                            endpoint.setTargetComponent(targetComponent);
+                            endpoint
+                                    .setTargetComponentService(targetComponentService);
+                            endpoint.getCandidateBindings().addAll(
+                                    componentReference.getBindings());
+                            endpoints.add(endpoint);
+
+                            if (multiplicity == Multiplicity.ZERO_ONE
+                                    || multiplicity == Multiplicity.ONE_ONE) {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (multiplicity == Multiplicity.ONE_N
+                    || multiplicity == Multiplicity.ONE_ONE) {
+                if (endpoints.size() == 0) {
+                    warning(monitor, "NoComponentReferenceTarget",
+                            componentReference, componentReference.getName());
+                }
+            }
+
+        } else if (!componentReference.getTargets().isEmpty()) {
+
+            // Check if the component reference does not mix the use of
+            // endpoints specified via
+            // binding elements with target endpoints specified via the target
+            // attribute
+            for (Binding binding : componentReference.getBindings()) {
+                if (binding.getURI() != null) {
+                    warning(monitor, "ReferenceEndPointMixWithTarget",
+                            composite, componentReference.getName());
+                }
+            }
+
+            // Resolve targets specified on the component reference
+            for (ComponentService componentService : componentReference
+                    .getTargets()) {
+
+                // Resolve the target component and service
+                String name = componentService.getName();
+                ComponentService targetComponentService = componentServices
+                        .get(name);
+                Component targetComponent;
+                int s = name.indexOf('/');
+                if (s == -1) {
+                    targetComponent = components.get(name);
+                } else {
+                    targetComponent = components.get(name.substring(0, s));
+                }
+
+                if (targetComponentService != null) {
+
+                    // Check that the target component service provides
+                    // a superset of the component reference interface
+                    if (componentReference.getInterfaceContract() == null
+                            || interfaceContractMapper.isCompatible(
+                                    componentReference.getInterfaceContract(),
+                                    targetComponentService
+                                            .getInterfaceContract())) {
+
+                        Endpoint endpoint = endpointFactory.createEndpoint();
+                        endpoint.setTargetName(targetComponent.getName());
+                        endpoint.setSourceComponent(null); // TODO - fixed up at
+                                                           // start
+                        endpoint
+                                .setSourceComponentReference(componentReference);
+                        endpoint.setInterfaceContract(componentReference
+                                .getInterfaceContract());
+                        endpoint.setTargetComponent(targetComponent);
+                        endpoint
+                                .setTargetComponentService(targetComponentService);
+                        endpoint.getCandidateBindings().addAll(
+                                componentReference.getBindings());
+                        endpoints.add(endpoint);
+
+                        // mark the reference target as resolved. Used later
+                        // when we are looking to
+                        // see if an sca binding is associated with a resolved
+                        // target or not
+                        componentService.setUnresolved(false);
+                    } else {
+                        warning(monitor, "ReferenceIncompatibleInterface",
+                                composite, composite.getName().toString(),
+                                componentReference.getName(), componentService
+                                        .getName());
+                    }
+                } else {
+                    // add all the reference bindings into the target so that
+                    // they
+                    // can be used for comparison when the target is resolved at
+                    // runtime
+                    componentService.getBindings().addAll(
+                            componentReference.getBindings());
+
+                    Endpoint endpoint = endpointFactory.createEndpoint();
+                    endpoint.setTargetName(name);
+                    endpoint.setSourceComponent(null); // TODO - fixed up at
+                                                       // start
+                    endpoint.setSourceComponentReference(componentReference);
+                    endpoint.setInterfaceContract(componentReference
+                            .getInterfaceContract());
+                    endpoint.getCandidateBindings().addAll(
+                            componentReference.getBindings());
+                    endpoints.add(endpoint);
+
+                    // The bindings will be cloned back into the reference when
+                    // the
+                    // target is finally resolved.
+                    warning(monitor, "ComponentReferenceTargetNotFound",
+                            composite, composite.getName().toString(),
+                            componentService.getName());
+                }
+            }
+        } else if ((componentReference.getReference() != null)
+                && (!componentReference.getReference().getTargets().isEmpty())) {
+
+            // Resolve targets from the corresponding reference in the
+            // componentType
+            for (ComponentService componentService : componentReference
+                    .getReference().getTargets()) {
+
+                // Resolve the target component and service
+                String name = componentService.getName();
+                ComponentService targetComponentService = componentServices
+                        .get(name);
+                Component targetComponent;
+                int s = name.indexOf('/');
+                if (s == -1) {
+                    targetComponent = components.get(name);
+                } else {
+                    targetComponent = components.get(name.substring(0, s));
+                }
+
+                if (targetComponentService != null) {
+
+                    // Check that the target component service provides
+                    // a superset of
+                    // the component reference interface
+                    if (componentReference.getInterfaceContract() == null
+                            || interfaceContractMapper.isCompatible(
+                                    componentReference.getInterfaceContract(),
+                                    targetComponentService
+                                            .getInterfaceContract())) {
+
+                        Endpoint endpoint = endpointFactory.createEndpoint();
+                        endpoint.setTargetName(targetComponent.getName());
+                        endpoint.setSourceComponent(null); // TODO - fixed up at
+                                                           // start
+                        endpoint
+                                .setSourceComponentReference(componentReference);
+                        endpoint.setInterfaceContract(componentReference
+                                .getInterfaceContract());
+                        endpoint.setTargetComponent(targetComponent);
+                        endpoint
+                                .setTargetComponentService(targetComponentService);
+                        endpoint.getCandidateBindings().addAll(
+                                componentReference.getBindings());
+                        endpoints.add(endpoint);
+
+                        // mark the reference target as resolved. Used later
+                        // when we are looking to
+                        // see if an sca binding is associated with a resolved
+                        // target or not
+                        componentService.setUnresolved(false);
+                    } else {
+                        warning(monitor, "ComponentIncompatibleInterface",
+                                composite, componentReference.getName(),
+                                componentService.getName());
+                    }
+                } else {
+                    // add all the reference bindings into the target so that
+                    // they
+                    // can be used for comparison when the target is resolved at
+                    // runtime
+                    componentService.getBindings().addAll(
+                            componentReference.getBindings());
+
+                    // The bindings will be cloned back into the reference when
+                    // the
+                    // target is finally resolved.
+
+                    Endpoint endpoint = endpointFactory.createEndpoint();
+                    endpoint.setTargetName(name);
+                    endpoint.setSourceComponent(null); // TODO - fixed up at
+                                                       // start
+                    endpoint.setSourceComponentReference(componentReference);
+                    endpoint.setInterfaceContract(componentReference
+                            .getInterfaceContract());
+                    endpoint.getCandidateBindings().addAll(
+                            componentReference.getBindings());
+                    endpoints.add(endpoint);
+
+                    warning(monitor, "ComponentReferenceTargetNotFound",
+                            composite, composite.getName().toString(),
+                            componentService.getName());
+                }
+            }
+        } else if (componentReference.getAutowire() == Boolean.TRUE) {
+
+            // Find suitable targets in the current composite for an
+            // autowired reference
+            Multiplicity multiplicity = componentReference.getMultiplicity();
+            for (Component targetComponent : composite.getComponents()) {
+                // prevent autowire connecting to self
+                boolean skipSelf = false;
+                for (ComponentReference targetComponentReference : targetComponent
+                        .getReferences()) {
+                    if (componentReference == targetComponentReference) {
+                        skipSelf = true;
+                    }
+                }
+
+                if (!skipSelf) {
+                    for (ComponentService targetComponentService : targetComponent
+                            .getServices()) {
+                        if (componentReference.getInterfaceContract() == null
+                                || interfaceContractMapper.isCompatible(
+                                        componentReference
+                                                .getInterfaceContract(),
+                                        targetComponentService
+                                                .getInterfaceContract())) {
+
+                            Endpoint endpoint = endpointFactory
+                                    .createEndpoint();
+                            endpoint.setTargetName(targetComponent.getName());
+                            endpoint.setSourceComponent(null); // TODO - fixed
+                                                               // up at start
+                            endpoint
+                                    .setSourceComponentReference(componentReference);
+                            endpoint.setInterfaceContract(componentReference
+                                    .getInterfaceContract());
+                            endpoint.setTargetComponent(targetComponent);
+                            endpoint
+                                    .setTargetComponentService(targetComponentService);
+                            endpoint.getCandidateBindings().addAll(
+                                    componentReference.getBindings());
+                            endpoints.add(endpoint);
+
+                            if (multiplicity == Multiplicity.ZERO_ONE
+                                    || multiplicity == Multiplicity.ONE_ONE) {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (multiplicity == Multiplicity.ONE_N
+                    || multiplicity == Multiplicity.ONE_ONE) {
+                if (endpoints.size() == 0) {
+                    warning(monitor, "NoComponentReferenceTarget",
+                            componentReference, componentReference.getName());
+                }
+            }
+        }
+
+        // if no endpoints have found so far retrieve any target names that are
+        // in binding URIs
+        if (endpoints.isEmpty()) {
+            for (Binding binding : componentReference.getBindings()) {
+
+                String uri = binding.getURI();
+
+                // user hasn't put a uri on the binding so it's not a target
+                // name
+                if (uri == null) {
+                    continue;
+                }
+
+                // user might have put a local target name in the uri so get
+                // the path part and see if it refers to a target we know about
+                // - if it does the reference binding will be matched with a
+                // service binding
+                // - if it doesn't it is assumed to be an external reference
+                Component targetComponent = null;
+                ComponentService targetComponentService = null;
+                String path = null;
+
+                try {
+                    path = URI.create(uri).getPath();
+                } catch (Exception ex) {
+                    // just assume that no target is identified if
+                    // a URI related exception is thrown
+                }
+
+                if (path != null) {
+                    if (path.startsWith("/")) {
+                        path = path.substring(1);
+                    }
+
+                    // Resolve the target component and service
+                    targetComponentService = componentServices.get(path);
+                    int s = path.indexOf('/');
+                    if (s == -1) {
+                        targetComponent = components.get(path);
+                    } else {
+                        targetComponent = components.get(path.substring(0, s));
+                    }
+                }
+
+                // if the path of the binding URI matches a component in the
+                // composite then configure an endpoint with this component as
+                // the target
+                // if not then the binding URI will be assumed to reference an
+                // external service
+                if (targetComponentService != null) {
+
+                    // Check that the target component service provides
+                    // a superset of the component reference interface
+                    if (componentReference.getInterfaceContract() == null
+                            || interfaceContractMapper.isCompatible(
+                                    componentReference.getInterfaceContract(),
+                                    targetComponentService
+                                            .getInterfaceContract())) {
+
+                        Endpoint endpoint = endpointFactory.createEndpoint();
+                        endpoint.setTargetName(targetComponent.getName());
+                        endpoint.setSourceComponent(null); // TODO - fixed up at
+                                                           // start
+                        endpoint
+                                .setSourceComponentReference(componentReference);
+                        endpoint.setInterfaceContract(componentReference
+                                .getInterfaceContract());
+                        endpoint.setTargetComponent(targetComponent);
+                        endpoint
+                                .setTargetComponentService(targetComponentService);
+                        endpoint.getCandidateBindings().add(binding);
+                        endpoints.add(endpoint);
+                    } else {
+                        warning(monitor, "ReferenceIncompatibleInterface",
+                                composite, composite.getName().toString(),
+                                componentReference.getName(), uri);
+                    }
+                } else {
+
+                    // create endpoints for manually configured bindings
+                    Endpoint endpoint = endpointFactory.createEndpoint();
+                    endpoint.setTargetName(uri);
+                    endpoint.setSourceComponent(null); // TODO - fixed up at
+                                                       // start
+                    endpoint.setSourceComponentReference(componentReference);
+                    endpoint.setInterfaceContract(componentReference
+                            .getInterfaceContract());
+                    endpoint.setSourceBinding(binding);
+                    endpoints.add(endpoint);
+                }
+            }
+        }
+
+        return endpoints;
+    }
+    
+    /**
+     * Connect references to their targets.
+     * 
+     * @param composite
+     * @param componentServices
+     * @param componentReferences
+     * @param problems
+     */
+    private void connectComponentReferences(Composite composite,
+                                            Map<String, Component> components,
+                                            Map<String, ComponentService> componentServices,
+                                            Map<String, ComponentReference> componentReferences,
+                                            Monitor monitor){
+               
+        for (ComponentReference componentReference : componentReferences.values()) {
+            
+            List<Endpoint> endpoints = createComponentReferenceTargets(composite, 
+                                                                       components, 
+                                                                       componentServices, 
+                                                                       componentReference,
+                                                                       monitor);
+
+            componentReference.getEndpoints().addAll(endpoints);
+            
+            // the result of calculating the endpoints is either that bindings have been 
+            // configured manually using a URI or that targets have been provided and the 
+            // endpoint remains unresolved. So all endpoints should be either resved or uresolved.
+            boolean endpointsRequireAutomaticResolution = false;
+            for(Endpoint endpoint : endpoints){
+                endpointsRequireAutomaticResolution = endpoint.isUnresolved();
+            }
+            
+            // build each endpoint 
+            if (endpointsRequireAutomaticResolution) { 
+
+                for(Endpoint endpoint : endpoints){
+                    endpointBuilder.build(endpoint, monitor);
+                }
+                
+                // TODO - The following step ensures that the reference binding list remains 
+                //        as the record of resolved targets for now. This needs fixing so 
+                //        that the endpoint takes on this responsibility. 
+                componentReference.getBindings().clear();
+                
+                if (componentReference.getCallback() != null){
+                    componentReference.getCallback().getBindings().clear();
+                }
+                
+                for(Endpoint endpoint : endpoints){
+                    if (endpoint.isUnresolved() == false){
+                        componentReference.getBindings().add(endpoint.getSourceBinding());
+                        
+                        if (componentReference.getCallback() != null){
+                            componentReference.getCallback().getBindings().add(endpoint.getSourceCallbackBinding());
+                        }
+                    } 
+                }                
+                
+            } else {
+                // do nothing as no targets have been specified so the bindings
+                // in the reference binding list are assumed to be manually configured
+            }
+                
+            
+/*            
+            // Select the reference bindings matching the target service bindings 
+            List<Binding> selectedBindings = new ArrayList<Binding>();
+            List<Binding> selectedCallbackBindings = null;
+    
+            // Handle callback
+            boolean bidirectional = false;
+            
+            if (componentReference.getInterfaceContract() != null && componentReference.getInterfaceContract().getCallbackInterface() != null) {
+                bidirectional = true;
+                selectedCallbackBindings = new ArrayList<Binding>();
+            }
+    
+            for (Target target : targets) {
+                
+                Component targetComponent = target.getComponent();
+                ComponentService targetComponentService = target.getService();
+                if (targetComponentService.getService() instanceof CompositeService) {
+                    CompositeService compositeService = (CompositeService) targetComponentService.getService();
+                    // Find the promoted component service
+                    targetComponentService = ServiceConfigurationUtil.getPromotedComponentService(compositeService);
+                }
+                
+                try  {
+                    PolicyConfigurationUtil.determineApplicableBindingPolicySets(componentReference, targetComponentService);
+                } catch ( Exception e ) {
+                    warning("Policy related exception: " + e, e);
+                    //throw new RuntimeException(e);
+                }
+
+                // Match the binding against the bindings of the target service
+                Binding selected = BindingConfigurationUtil.resolveBindings(componentReference, targetComponent, targetComponentService);
+                if (selected == null) {
+                    warning("NoMatchingBinding", componentReference, componentReference.getName(), targetComponentService.getName());
+                } else {
+                    selectedBindings.add(selected);
+                }
+                if (bidirectional) {
+                    Binding selectedCallback = BindingConfigurationUtil.resolveCallbackBindings(componentReference, targetComponent, targetComponentService);
+                    if (selectedCallback != null) {
+                        selectedCallbackBindings.add(selectedCallback);
+                    }
+                }
+            }
+*/                       
+            
+            // Need to tidy up the reference binding list and add in the bindings that 
+            // have been selected above. The situation so far...
+            //    Wired reference (1 or more targets are specified)
+            //       Binding.uri = null  - remove as it's left over from target resolution
+            //                             the binding will have been moved to the target from where 
+            //                             it will be resolved later
+            //       Binding.uri != null - the selected and resolved reference binding
+            //    Unwired reference (0 targets)
+            //       Binding.uri = null  - Either a callback reference or the reference is yet to be wired
+            //                             by the implementation so leave the binding where it is
+            //       Binding.uri != null - from the composite file so leave it  
+/*            
+            if ((componentReference.getTargets().size() > 0) ||
+                (!targets.isEmpty())) {
+
+                // Add all the effective bindings
+                componentReference.getBindings().clear();
+                componentReference.getBindings().addAll(selectedBindings);
+                if (bidirectional) {
+                    componentReference.getCallback().getBindings().clear();
+                    componentReference.getCallback().getBindings().addAll(selectedCallbackBindings);
+                }
+               
+                // add in sca bindings to represent all unresolved targets. The sca binding
+                // will try to resolve the target at a later date. 
+                for (ComponentService service : componentReference.getTargets()) {
+                    if (service.isUnresolved()) {
+                        SCABinding scaBinding = null;    
+                    
+                        // find the sca binding amongst the candidate binding list. We want to 
+                        // find this one and clone it as it may have been configured with
+                        // policies
+                        for (Binding binding : service.getBindings()) {
+
+                            if (binding instanceof SCABinding) {
+                                try {
+                                    scaBinding = (SCABinding)((OptimizableBinding)binding).clone();
+                                } catch (CloneNotSupportedException ex){
+                                    // we know it is supported on the SCA binding
+                                }
+                                break;
+                            }
+                        }
+                        
+                        if (scaBinding != null) {
+                            // configure the cloned SCA binding for this reference target
+                            scaBinding.setName(service.getName());
+                            
+                            // this service object holds the list of candidate bindings which 
+                            // can be used for later matching
+                            ((OptimizableBinding)scaBinding).setTargetComponentService(service);
+                            componentReference.getBindings().add(scaBinding);
+                        } else {
+                           // not sure we need to raise a warning here as a warning will already been 
+                           // thrown previously to indicate the reason why there is no sca binding
+                           // warning("NoSCABindingAvailableForUnresolvedService", componentReference, componentReference.getName(), service.getName());
+                        }
+                    }
+                }
+            }
+
+*/            
+            // Connect the optimizable bindings to their target component and
+            // service
+/*            
+            for (Binding binding : componentReference.getBindings()) {
+                if (!(binding instanceof OptimizableBinding)) {
+                    continue;
+                }
+                OptimizableBinding optimizableBinding = (OptimizableBinding)binding;
+                if (optimizableBinding.getTargetComponentService() != null) {
+                    continue;
+                }
+                String uri = optimizableBinding.getURI();
+                if (uri == null) {
+                    continue;
+                }
+                uri = URI.create(uri).getPath();
+                if (uri.startsWith("/")) {
+                    uri = uri.substring(1);
+                }
+                
+                // Resolve the target component and service
+                ComponentService targetComponentService = componentServices.get(uri);
+                Component targetComponent;
+                int s = uri.indexOf('/');
+                if (s == -1) {
+                    targetComponent = components.get(uri);
+                } else {
+                    targetComponent = components.get(uri.substring(0, s));
+                }
+
+                if (targetComponentService != null) {
+
+                    // Check that the target component service provides
+                    // a superset of the component reference interface
+                    if (componentReference.getInterfaceContract() == null ||
+                        interfaceContractMapper.isCompatible(componentReference.getInterfaceContract(), targetComponentService.getInterfaceContract())) {
+
+                    } else {
+                        warning("ReferenceIncompatibleInterface",
+                                composite,
+                                composite.getName().toString(),
+                                componentReference.getName(),
+                                uri);
+                    }
+                    optimizableBinding.setTargetComponent(targetComponent);
+                    optimizableBinding.setTargetComponentService(targetComponentService);
+                    optimizableBinding.setTargetBinding(targetComponentService.getBinding(optimizableBinding.getClass()));
+                }
+            }
+*/             
+        }
+    }
+    
 }