Author: svkrish
Date: Fri Nov 17 10:53:14 2006
New Revision: 476243

URL: http://svn.apache.org/viewvc?view=rev&rev=476243
Log:
Fixed for JIRA TUSCANY-921

Modified:
    
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java

Modified: 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java?view=diff&rev=476243&r1=476242&r2=476243
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
 Fri Nov 17 10:53:14 2006
@@ -22,7 +22,9 @@
 import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
 import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
 
+import java.net.URI;
 import java.net.URL;
+import java.util.List;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
@@ -34,16 +36,23 @@
 import org.apache.tuscany.spi.deployer.CompositeClassLoader;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.loader.InvalidServiceException;
+import org.apache.tuscany.spi.loader.InvalidWireException;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.model.BindlessServiceDefinition;
+import org.apache.tuscany.spi.model.BoundServiceDefinition;
 import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.ComponentType;
 import org.apache.tuscany.spi.model.CompositeComponentType;
 import org.apache.tuscany.spi.model.Implementation;
 import org.apache.tuscany.spi.model.Include;
 import org.apache.tuscany.spi.model.ModelObject;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
+import org.apache.tuscany.spi.model.ReferenceTarget;
 import org.apache.tuscany.spi.model.ServiceDefinition;
+import org.apache.tuscany.spi.model.WireDefinition;
 import org.apache.tuscany.spi.services.artifact.Artifact;
 import org.apache.tuscany.spi.services.artifact.ArtifactRepository;
 
@@ -54,6 +63,7 @@
  */
 public class CompositeLoader extends LoaderExtension<CompositeComponentType> {
     public static final QName COMPOSITE = new QName(XML_NAMESPACE_1_0, 
"composite");
+    public static final String URI_DELIMITER = "/";
 
     private final ArtifactRepository artifactRepository;
 
@@ -107,6 +117,8 @@
                                 }
                             }
                         }
+                    } else if (o instanceof WireDefinition) {
+                       composite.add((WireDefinition) o);
                     } else {
                         // HACK: [rfeng] Add as an unknown model extension
                         if (o != null) {
@@ -117,6 +129,9 @@
                     break;
                 case END_ELEMENT:
                     if (COMPOSITE.equals(reader.getName())) {
+                       //if there are wire defintions then link them up to the 
relevant components
+                       resolveWires(composite);
+                       verifyCompositeCompleteness(composite);
                         done = true;
                         break;
                     }
@@ -126,5 +141,148 @@
             PropertyHelper.processProperties(composite, c, deploymentContext);
         }
         return composite;
+    }
+    
+    protected void resolveWires(CompositeComponentType<ServiceDefinition, 
ReferenceDefinition, Property<?>> composite) 
+                                                       throws 
InvalidWireException {
+       List<WireDefinition> wireDefns = composite.getDeclaredWires();
+       String sourceSCAObjectName = null;
+       String componentReferenceName = null;
+       int index = -1;
+       ComponentDefinition componentDefinition = null;
+       ServiceDefinition serviceDefinition = null;
+       
+       for ( WireDefinition aWireDefn : wireDefns ) {
+
+            //first validate the target before finding the source
+            validateTarget(aWireDefn.getTarget(), composite);
+            
+            sourceSCAObjectName = aWireDefn.getSource().toString();
+            serviceDefinition = 
composite.getDeclaredServices().get(sourceSCAObjectName);
+            if ( serviceDefinition != null ) {
+                if ( serviceDefinition instanceof BoundServiceDefinition ) {
+                    
((BoundServiceDefinition)serviceDefinition).setTarget(aWireDefn.getTarget());
+                } else if ( serviceDefinition instanceof 
BindlessServiceDefinition ) {
+                    
((BoundServiceDefinition)serviceDefinition).setTarget(aWireDefn.getTarget());
+                } else {
+                    BindlessServiceDefinition bindlessSvcDefn = 
+                        new 
BindlessServiceDefinition(serviceDefinition.getName(),
+                                                        
serviceDefinition.getServiceContract(),
+                                                        false,
+                                                        aWireDefn.getTarget());
+                    composite.getDeclaredServices().put(sourceSCAObjectName, 
bindlessSvcDefn);
+                }
+            } else {
+                if ( (index = sourceSCAObjectName.indexOf(URI_DELIMITER)) != 
-1 ) {
+                    componentReferenceName = 
sourceSCAObjectName.substring(index + 1);
+                    sourceSCAObjectName = sourceSCAObjectName.substring(0, 
index);
+                }
+                
+                componentDefinition = 
composite.getDeclaredComponents().get(sourceSCAObjectName);
+                if ( componentDefinition != null  ) {
+                    
componentDefinition.add(createReferenceTarget(componentReferenceName, 
+                                                                    
aWireDefn.getTarget(),
+                                                                    
componentDefinition));
+                } else {
+                    InvalidWireException le = new InvalidWireException("Unable 
to resolve wire source '" + sourceSCAObjectName +
+                            "' in composite " + composite.getName());
+                    le.addContextName("composite=" + composite.getName());
+                    le.setIdentifier(sourceSCAObjectName);
+                    throw le;
+                }
+            }
+       }
+    }
+    
+    private ReferenceTarget createReferenceTarget(String 
componentReferenceName, 
+                                                                               
                URI target,
+                                                                               
                ComponentDefinition componentDefn) 
+                                                                               
                throws InvalidWireException {
+       ComponentType componentType = 
componentDefn.getImplementation().getComponentType();
+       if ( componentReferenceName == null ) {
+               //if there is ambiguity in determining the source of the wire or
+               //there is no reference to be wired
+               if ( componentType.getReferences().size() > 1 ||
+                               componentType.getReferences().isEmpty() ) {
+                       InvalidWireException le = 
+                               new InvalidWireException("Unable to determine 
unique component reference for wire...");
+                           le.addContextName("loading wire defintions for " + 
componentDefn.getName());
+                    le.setIdentifier(componentDefn.getName() + "/?->" + 
target.toString());
+                throw le;
+            } else {
+                componentReferenceName = 
+                    
((ReferenceDefinition)componentType.getReferences().values().iterator().next()).getName();
+            }
+               }
+       
+       ReferenceTarget referenceTarget = new ReferenceTarget();
+        referenceTarget.setReferenceName(componentReferenceName);
+        referenceTarget.addTarget(target);
+        return referenceTarget;
+    }
+    
+    protected void 
verifyCompositeCompleteness(CompositeComponentType<ServiceDefinition, 
ReferenceDefinition, Property<?>> composite) 
+                                                                               
                throws InvalidServiceException {
+       //check if all of the composites services have been wired
+       for ( ServiceDefinition svcDefn : 
composite.getDeclaredServices().values() ) {
+               if ( svcDefn instanceof BoundServiceDefinition  && 
+                               ((BoundServiceDefinition)svcDefn).getTarget() 
== null ) {
+                       InvalidServiceException le = new 
InvalidServiceException("Composite service not wired to any target...");
+                           le.addContextName("loading composite " + 
composite.getName());
+                le.setIdentifier(svcDefn.getName());
+                throw le;
+               }
+       }
+    }
+    
+    private void validateTarget(URI target, 
+                                   CompositeComponentType<ServiceDefinition, 
ReferenceDefinition, Property<?>> composite ) 
+                                                throws InvalidWireException {
+        String targetSCAObjectName = target.toString();
+        
+        //if target is not a reference of the composite
+        if ( composite.getReferences().get(targetSCAObjectName) == null ) {
+            String componentServiceName = null;
+            int index = -1;
+            
+            //if target is qualified
+            if ( (index = targetSCAObjectName.indexOf(URI_DELIMITER)) != -1 ) {
+                componentServiceName = targetSCAObjectName.substring(index + 
1);
+                targetSCAObjectName = targetSCAObjectName.substring(0, index);
+            }
+            
+            ComponentDefinition componentDefinition = 
+                                                
composite.getDeclaredComponents().get(targetSCAObjectName);
+            //if a target component exists in this composite
+            if ( componentDefinition != null ) {
+                if ( componentServiceName == null ) {
+                    if ( 
componentDefinition.getImplementation().getComponentType().getServices().size() 
> 1 ||
+                            
componentDefinition.getImplementation().getComponentType().getServices().isEmpty()
 ) {
+                        InvalidWireException le = 
+                            new InvalidWireException("Ambiguous target '" + 
componentDefinition.getName() + 
+                                    "' for wire definitions in composite - " + 
composite.getName());
+                        le.addContextName("loading composite " + 
composite.getName());
+                        le.setIdentifier(componentDefinition.getName());
+                        throw le;
+                    } 
+                } else {                 
+                    if ( 
componentDefinition.getImplementation().getComponentType().getServices().get(componentServiceName)
 == null ) {
+                        InvalidWireException le = 
+                            new InvalidWireException("Invalid target '" + 
targetSCAObjectName + "/" +
+                                    componentServiceName + "' for wire 
definitions in composite - " + composite.getName());
+                        le.addContextName("loading composite " + 
composite.getName());
+                        le.setIdentifier(targetSCAObjectName + "/" + 
componentServiceName);
+                        throw le;
+                    }
+                } 
+            } else {
+                InvalidWireException le = 
+                    new InvalidWireException("Invalid target '" + 
targetSCAObjectName + 
+                            "' for wire definitions in composite - " + 
composite.getName());
+                le.addContextName("loading composite " + composite.getName());
+                le.setIdentifier(targetSCAObjectName);
+                throw le;
+            }
+        }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to