Author: edwardsmj
Date: Tue Apr 28 22:13:15 2009
New Revision: 769564

URL: http://svn.apache.org/viewvc?rev=769564&view=rev
Log:
Fix to NodeImpl for TUSCANY-2989 - now resolves a supplied composite with an 
absolute URI outside any contribution against the first supplied contribution.

Modified:
    
tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java

Modified: 
tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java?rev=769564&r1=769563&r2=769564&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
 (original)
+++ 
tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
 Tue Apr 28 22:13:15 2009
@@ -48,6 +48,9 @@
 import org.apache.tuscany.sca.assembly.CompositeService;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilderExtensionPoint;
+// Added MJE 28/04/2009
+import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
+//
 import org.apache.tuscany.sca.contribution.Artifact;
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
@@ -140,6 +143,8 @@
     private WorkScheduler workScheduler;
     private Contribution systemContribution;
     private Definitions systemDefinitions;
+    // Added MJE 28/04/2009
+    private URLArtifactProcessor<Composite> compositeDocumentProcessor;
 
     /**
      * Constructs a new SCA node.
@@ -374,6 +379,10 @@
         // Create contribution content processor
         URLArtifactProcessorExtensionPoint docProcessorExtensions = 
extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
         contributionProcessor = 
docProcessorExtensions.getProcessor(Contribution.class);
+        
+        // Added MJE 28/04/2009
+        // Create Composite Document processor
+        compositeDocumentProcessor = 
docProcessorExtensions.getProcessor(Composite.class);
 
         // Get the model resolvers
         modelResolvers = 
extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
@@ -546,6 +555,8 @@
 
         composite = configuration.getComposite();
 
+        // If a composite was not originally supplied when the Node was 
created, pick one of the deployable 
+        // composites from the supplied contributions.  Note: throws an 
exception if none can be found. 
         if (composite == null) {
             setDefaultComposite(configuration, workspace);
         }
@@ -557,11 +568,9 @@
         compositeFile.setURI(composite.getURI());
         for (Contribution contribution: workspace.getContributions()) {
             ModelResolver resolver = contribution.getModelResolver();
-//            for (Artifact artifact : contribution.getArtifacts()){
-//                logger.log(Level.INFO,"artifact - " + artifact.getURI());
-//            }
+
             Artifact resolvedArtifact = resolver.resolveModel(Artifact.class, 
compositeFile);
-//            if (!resolvedArtifact.isUnresolved() && 
resolvedArtifact.getModel() instanceof Composite) {
+            if (!resolvedArtifact.isUnresolved() && 
resolvedArtifact.getModel() instanceof Composite) {
 
                 if (!composite.isUnresolved()) {
 
@@ -576,12 +585,29 @@
                     composite = (Composite)resolvedArtifact.getModel();
                 }
                 found = true;
-    //            break;
-  //          }
-        }
-//        if (!found) {
-//            throw new IllegalArgumentException("Composite not found: " + 
composite.getURI());
-//        }
+                break;
+            } // end if
+        } // end for
+
+        if (!found) {
+               // If the composite was not found, then it must be a separate 
composite file outside any of the contributions
+               // - a "composite by value" - this requires its URI to be 
absolute and pointing at the composite file itself.
+               // First read in the composite file to create a composite model 
object...
+               URI compositeURI = new URI(composite.getURI());
+               URL compositeURL = compositeURI.toURL();
+               composite = compositeDocumentProcessor.read(compositeURL, 
compositeURI, compositeURL);
+               if( composite == null ) {
+                        throw new IllegalArgumentException("Composite not 
found: " + compositeURI);
+               }
+               
+               // Resolve the "composite by value" against the FIRST 
contribution
+               Contribution contribution = workspace.getContributions().get(0);
+               ModelResolver resolver = contribution.getModelResolver();
+               compositeProcessor.resolve(composite, resolver);
+            if( composite.isUnresolved() ) {
+               throw new IllegalArgumentException("Could not resolve 
composite: " + compositeURI + " in contribution " + contribution.getURI() );
+            }
+        } // end if
 
         // Build the composite and wire the components included in it
         compositeBuilder.build(composite, systemDefinitions, monitor);
@@ -760,7 +786,7 @@
      * Sets a default composite by using any deployable one.
      */
     private void setDefaultComposite(ConfiguredNodeImplementation 
configuration, Workspace workspace) {
-        // just use the first deployable composte
+        // just use the first deployable composite
         for (Contribution contribution : workspace.getContributions()) {
             for (Composite c : contribution.getDeployables()) {
                 composite = assemblyFactory.createComposite();


Reply via email to