summaryrefslogtreecommitdiffstats
path: root/java/sca
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2008-07-11 18:49:07 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2008-07-11 18:49:07 +0000
commit46d6b18aaccc338366db3b21894455bfdb5b05a2 (patch)
tree64bba3a78c2dcb439e3c3bb591549212432e16bb /java/sca
parent340efb05cab82dcc5f1de0ff18156dcc9fa37ff1 (diff)
Resolve relative composite URIs against the contributions
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@676047 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca')
-rw-r--r--java/sca/itest/validation/src/test/java/calculator/warning/NoMatchingBindingTestCase.java3
-rw-r--r--java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java54
2 files changed, 49 insertions, 8 deletions
diff --git a/java/sca/itest/validation/src/test/java/calculator/warning/NoMatchingBindingTestCase.java b/java/sca/itest/validation/src/test/java/calculator/warning/NoMatchingBindingTestCase.java
index 514e45b88e..8deba283cb 100644
--- a/java/sca/itest/validation/src/test/java/calculator/warning/NoMatchingBindingTestCase.java
+++ b/java/sca/itest/validation/src/test/java/calculator/warning/NoMatchingBindingTestCase.java
@@ -46,8 +46,7 @@ public class NoMatchingBindingTestCase extends TestCase {
protected void setUp() throws Exception {
SCANode2Factory nodeFactory = SCANode2Factory.newInstance();
node =
- nodeFactory.createSCANode(new File("src/main/resources/NoMatchingBinding/Calculator.composite").toURL()
- .toString(), new SCAContribution("TestContribution", new File("src/main/resources/NoMatchingBinding")
+ nodeFactory.createSCANode("Calculator.composite", new SCAContribution("TestContribution", new File("src/main/resources/NoMatchingBinding")
.toURL().toString()));
node.start();
diff --git a/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java b/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
index 17aad5b106..eff0ca30ea 100644
--- a/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
+++ b/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
@@ -47,12 +47,14 @@ import org.apache.tuscany.sca.assembly.Component;
import org.apache.tuscany.sca.assembly.ComponentService;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.assembly.CompositeService;
+import org.apache.tuscany.sca.contribution.Artifact;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.ContributionFactory;
import org.apache.tuscany.sca.contribution.ContributionMetadata;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.service.ContributionService;
import org.apache.tuscany.sca.contribution.service.util.FileHelper;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
@@ -489,12 +491,16 @@ public class NodeImpl implements SCANode2, SCAClient {
analyseProblems();
}
- // Resolve the metadata within the context of the first contribution
- Contribution mainContribution = contributions.get(contributions.size() - 1);
+ // Resolve the metadata within the context of the contribution
if (metadata != null) {
StAXArtifactProcessor<ContributionMetadata> processor =
artifactProcessors.getProcessor(ContributionMetadata.class);
- processor.resolve(metadata, mainContribution.getModelResolver());
+ for (Contribution c : contributions) {
+ processor.resolve(metadata, c.getModelResolver());
+ if (!metadata.isUnresolved()) {
+ break;
+ }
+ }
List<Composite> composites = metadata.getDeployables();
configuration.setComposite(composites.get(0));
}
@@ -505,21 +511,32 @@ public class NodeImpl implements SCANode2, SCAClient {
if (configuration.getComposite().getName() == null) {
URI uri = URI.create(configuration.getComposite().getURI());
if (uri.getScheme() == null) {
- uri = new File(configuration.getComposite().getURI()).toURI();
+ // For relative URI, try to resolve it within the contributions
+ Artifact file = resolveCompositeArtifact(contributions, uri.toString());
+ if (file == null) {
+ throw new IllegalArgumentException("Composite is not found in contributions: " + uri);
+ }
+ uri = URI.create(file.getLocation());
}
URL compositeURL = uri.toURL();
logger.log(Level.INFO, "Loading composite: " + compositeURL);
InputStream is = compositeURL.openStream();
XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
composite = compositeProcessor.read(reader);
+ reader.close();
} else {
composite = configuration.getComposite();
}
analyseProblems();
- // Resolve it within the context of the first contribution
- compositeProcessor.resolve(composite, mainContribution.getModelResolver());
+ // Resolve it within the context of the contribution
+ for (Contribution c : contributions) {
+ compositeProcessor.resolve(composite, c.getModelResolver());
+ if (!composite.isUnresolved()) {
+ break;
+ }
+ }
analyseProblems();
@@ -543,6 +560,31 @@ public class NodeImpl implements SCANode2, SCAClient {
analyseProblems();
}
+
+ /**
+ * Search all contributions to resolve the relative composite URI
+ * @param contributions
+ * @param compositeURI
+ * @return
+ */
+ private Artifact resolveCompositeArtifact(List<Contribution> contributions, String compositeURI) {
+ ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+ // Remove the leading /
+ if (compositeURI != null && compositeURI.startsWith("/")) {
+ compositeURI = compositeURI.substring(1);
+ }
+ Artifact compositeFile = contributionFactory.createArtifact();
+ compositeFile.setUnresolved(true);
+ compositeFile.setURI(compositeURI);
+ for (Contribution c : contributions) {
+ ModelResolver resolver = c.getModelResolver();
+ Artifact resolved = resolver.resolveModel(Artifact.class, compositeFile);
+ if (resolved != null && !resolved.isUnresolved()) {
+ return resolved;
+ }
+ }
+ return null;
+ }
private void analyseProblems() throws Exception {