Author: antelder
Date: Sun May 15 20:17:11 2011
New Revision: 1103533
URL: http://svn.apache.org/viewvc?rev=1103533&view=rev
Log:
Update for the new ContributionListener, to support adding composites to a
contribution, and so that any errors during peeking into a contribution are
ignored
Modified:
tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl2.java
tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/Node2TestCase.java
Modified:
tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl2.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl2.java?rev=1103533&r1=1103532&r2=1103533&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl2.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl2.java
Sun May 15 20:17:11 2011
@@ -19,18 +19,25 @@
package org.apache.tuscany.sca.impl;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
import org.apache.tuscany.sca.TuscanyRuntime;
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Base;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.common.java.io.IOHelper;
+import org.apache.tuscany.sca.common.xml.stax.StAXHelper;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.ContributionMetadata;
import org.apache.tuscany.sca.contribution.Export;
@@ -40,6 +47,10 @@ import org.apache.tuscany.sca.contributi
import org.apache.tuscany.sca.contribution.namespace.NamespaceExport;
import org.apache.tuscany.sca.contribution.namespace.NamespaceImport;
import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import
org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
+import
org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
+import
org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.FactoryExtensionPoint;
import org.apache.tuscany.sca.deployment.Deployer;
@@ -47,6 +58,7 @@ import org.apache.tuscany.sca.monitor.Mo
import org.apache.tuscany.sca.monitor.ValidationException;
import org.apache.tuscany.sca.runtime.ActivationException;
import org.apache.tuscany.sca.runtime.CompositeActivator;
+import org.apache.tuscany.sca.runtime.ContributionListener;
import org.apache.tuscany.sca.runtime.EndpointRegistry;
import org.apache.tuscany.sca.runtime.InstalledContribution;
import org.oasisopen.sca.NoSuchServiceException;
@@ -60,7 +72,7 @@ public class NodeImpl2 {
private ExtensionPointRegistry extensionPointRegistry;
private TuscanyRuntime tuscanyRuntime;
- private Map<String, Contribution> loadedContributions = new
HashMap<String, Contribution>();
+ private Map<String, Contribution> loadedContributions = new
ConcurrentHashMap<String, Contribution>();
private Map<String, DeployedComposite> startedComposites = new
HashMap<String, DeployedComposite>();
private Map<String, DeployedComposite> stoppedComposites = new
HashMap<String, DeployedComposite>();
@@ -77,10 +89,19 @@ public class NodeImpl2 {
this.endpointRegistry = endpointRegistry;
this.extensionPointRegistry = extensionPointRegistry;
this.tuscanyRuntime = tuscanyRuntime;
+
+ endpointRegistry.addContributionListener(new ContributionListener() {
+ public void contributionUpdated(String uri) {
+ loadedContributions.remove(uri);
+ }
+ public void contributionRemoved(String uri) {
+ loadedContributions.remove(uri);
+ }
+ });
}
public String installContribution(String contributionURL) throws
ContributionReadException, ActivationException, ValidationException {
- return installContribution(null, contributionURL);
+ return installContribution(null, contributionURL, null, null);
}
public String installContribution(String uri, String contributionURL)
throws ContributionReadException, ActivationException, ValidationException {
@@ -106,7 +127,6 @@ public class NodeImpl2 {
}
public void uninstallContribution(String contributionURI) {
- loadedContributions.remove(contributionURI);
endpointRegistry.uninstallContribution(contributionURI);
}
@@ -128,23 +148,35 @@ public class NodeImpl2 {
* we need to know about deployables and exports so peek into the
contribution to try to get those,
* and just ignore any errors they might happen while doing that.
*/
- protected void peekIntoContribution(InstalledContribution ic) throws
ContributionReadException, ValidationException {
- Contribution contribution = loadContribution(ic);
-
- // deployables
- for (Composite composite : contribution.getDeployables()) {
- ic.getDeployables().add(composite.getURI());
+ protected void peekIntoContribution(InstalledContribution ic) {
+ Contribution contribution = null;
+ try {
+ contribution = loadContribution(ic);
+ } catch (Exception e) {
+ // ignore it
}
+
+ if (contribution != null) {
- // Exports
- for (Export export : contribution.getExports()) {
- if (export instanceof JavaExport) {
- ic.getJavaExports().add(((JavaExport)export).getPackage());
- } else if (export instanceof NamespaceExport) {
-
ic.getNamespaceExports().add(((NamespaceExport)export).getNamespace());
- } // TODO: Handle these and others in a more extensible way
- }
+ // deployables
+ if (contribution.getDeployables() != null) {
+ for (Composite composite : contribution.getDeployables()) {
+ ic.getDeployables().add(composite.getURI());
+ }
+ }
+ // Exports
+ if (contribution.getExports() != null) {
+ for (Export export : contribution.getExports()) {
+ // TODO: Handle these and others in a more extensible way
+ if (export instanceof JavaExport) {
+
ic.getJavaExports().add(((JavaExport)export).getPackage());
+ } else if (export instanceof NamespaceExport) {
+
ic.getNamespaceExports().add(((NamespaceExport)export).getNamespace());
+ }
+ }
+ }
+ }
}
public List<String> getInstalledContributionURIs() {
@@ -159,6 +191,37 @@ public class NodeImpl2 {
InstalledContribution ic =
endpointRegistry.getInstalledContribution(contributionURI);
return new ArrayList<String>(ic.getDeployables());
}
+
+ public String addDeploymentComposite(String contributionURI, Reader
compositeXML) throws ContributionReadException, XMLStreamException,
ValidationException {
+ InstalledContribution ic = getInstalledContribution(contributionURI);
+
+ // load it to check its valid composite XML
+ Composite composite = compositeFromXML(compositeXML);
+
+ addDeploymentComposite(ic, composite);
+ return composite.getURI();
+ }
+
+ protected Composite compositeFromXML(Reader compositeXML) throws
XMLStreamException, ContributionReadException, ValidationException {
+ Monitor monitor = deployer.createMonitor();
+ Composite composite = deployer.loadXMLDocument(compositeXML, monitor);
+ monitor.analyzeProblems();
+ return composite;
+ }
+
+ public String addDeploymentComposite(String contributionURI, Composite
composite) {
+ InstalledContribution ic = getInstalledContribution(contributionURI);
+ addDeploymentComposite(ic, composite);
+ return composite.getURI();
+ }
+
+ protected void addDeploymentComposite(InstalledContribution ic, Composite
composite) {
+ if (composite.getURI() == null || composite.getURI().length() < 1) {
+ composite.setURI(composite.getName().getLocalPart() +
".composite");
+ }
+ ic.getAdditionalDeployables().put(composite.getURI(),
compositeToXML(composite));
+ endpointRegistry.updateInstalledContribution(ic);
+ }
public void validateContribution(String contributionURI) throws
ContributionReadException, ValidationException {
InstalledContribution ic = getInstalledContribution(contributionURI);
@@ -252,6 +315,19 @@ public class NodeImpl2 {
Monitor monitor = deployer.createMonitor();
contribution =
deployer.loadContribution(IOHelper.createURI(ic.getURI()),
IOHelper.getLocationAsURL(ic.getURL()), monitor);
monitor.analyzeProblems();
+ if (ic.getAdditionalDeployables().size() > 0) {
+ for (String uri : ic.getAdditionalDeployables().keySet()) {
+ String compositeXML =
ic.getAdditionalDeployables().get(uri);
+ Composite composite;
+ try {
+ composite = compositeFromXML(new
StringReader(compositeXML));
+ } catch (XMLStreamException e) {
+ throw new ContributionReadException(e);
+ }
+ composite.setURI(composite.getName().getLocalPart() +
".composite");
+ contribution.addComposite(composite);
+ }
+ }
loadedContributions.put(ic.getURI(), contribution);
}
return contribution;
@@ -259,7 +335,6 @@ public class NodeImpl2 {
protected List<Contribution>
calculateDependentContributions(InstalledContribution ic) throws
ContributionReadException, ValidationException {
List<Contribution> dependentContributions = new
ArrayList<Contribution>();
- Contribution c = loadContribution(ic);
if (ic.getDependentContributionURIs() != null &&
ic.getDependentContributionURIs().size() > 0) {
// if the install specified dependent uris use just those
contributions
for (String uri : ic.getDependentContributionURIs()) {
@@ -269,7 +344,7 @@ public class NodeImpl2 {
}
}
} else {
- for (Import imprt : c.getImports()) {
+ for (Import imprt : loadContribution(ic).getImports()) {
for (InstalledContribution exportingIC :
findExportingContributions(imprt)) {
dependentContributions.add(loadContribution(exportingIC));
}
@@ -298,4 +373,24 @@ public class NodeImpl2 {
}
return ics;
}
+
+ /**
+ * TODO: this should be somewhere else, perhaps common-xml, and more
general to work with any model object
+ */
+ protected String compositeToXML(Composite composite) {
+ try {
+ StAXHelper stAXHelper =
StAXHelper.getInstance(extensionPointRegistry);
+ StAXArtifactProcessorExtensionPoint staxProcessors =
extensionPointRegistry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+ ExtensibleStAXArtifactProcessor staxProcessor = new
ExtensibleStAXArtifactProcessor(staxProcessors, null,
stAXHelper.getOutputFactory());
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ staxProcessor.write(composite, bos, new
ProcessorContext(extensionPointRegistry));
+ bos.close();
+ return bos.toString();
+ } catch (ContributionWriteException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
}
Modified:
tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/Node2TestCase.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/Node2TestCase.java?rev=1103533&r1=1103532&r2=1103533&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/Node2TestCase.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/Node2TestCase.java
Sun May 15 20:17:11 2011
@@ -18,14 +18,17 @@
*/
package org.apache.tuscany.sca.impl;
+import java.io.StringReader;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
import junit.framework.Assert;
import org.apache.tuscany.sca.TuscanyRuntime;
+import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
import org.apache.tuscany.sca.monitor.ValidationException;
@@ -178,4 +181,28 @@ public class Node2TestCase {
node.stopComposite("sample-helloworld", "helloworld.composite");
}
+ @Test
+ public void addDeploymentCompositeTest() throws NoSuchServiceException,
NoSuchDomainException, ContributionReadException, ActivationException,
ValidationException, XMLStreamException {
+ NodeImpl2 node =
TuscanyRuntime.newInstance().createNode2("addDeploymentCompositeTest");
+ String curi =
node.installContribution("src/test/resources/sample-helloworld.jar");
+
+ String compositeXML =
+ "<composite
xmlns=\"http://docs.oasis-open.org/ns/opencsa/sca/200912\""
+ + "
xmlns:tuscany=\"http://tuscany.apache.org/xmlns/sca/1.1\""
+ + " targetNamespace=\"http://test/composite\""
+ + " name=\"TestComposite\">"
+ + " <component name=\"TestComponent\">"
+ + " <implementation.java
class=\"sample.HelloworldImpl\"/>"
+ + " </component>"
+ + "</composite>";
+ String compositeURI = node.addDeploymentComposite(curi, new
StringReader(compositeXML));
+
+ node.startComposite(curi, compositeURI);
+ Assert.assertEquals(1, node.getStartedComposites().size());
+
+ Composite dc = node.getDomainComposite();
+ Assert.assertEquals(1, dc.getIncludes().size());
+ Composite runningComposite = dc.getIncludes().get(0);
+ Assert.assertEquals("TestComposite",
runningComposite.getName().getLocalPart());
+ }
}