Add logic to apply the xpath against the implementation composites
Add a more complicated test case git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@817714 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
399df0e965
commit
86163b4ee4
4 changed files with 94 additions and 22 deletions
|
@ -11,6 +11,7 @@ Import-Package: javax.xml.namespace,
|
|||
javax.xml.xpath,
|
||||
org.apache.tuscany.sca.assembly;version="2.0.0",
|
||||
org.apache.tuscany.sca.assembly.builder;version="2.0.0",
|
||||
org.apache.tuscany.sca.assembly.builder.impl;version="2.0.0";resolution:=optional,
|
||||
org.apache.tuscany.sca.common.xml.dom;version="2.0.0",
|
||||
org.apache.tuscany.sca.common.xml.stax;version="2.0.0",
|
||||
org.apache.tuscany.sca.common.xml.xpath;version="2.0.0",
|
||||
|
|
|
@ -33,7 +33,9 @@ import javax.xml.stream.XMLStreamWriter;
|
|||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathExpression;
|
||||
|
||||
import org.apache.tuscany.sca.assembly.Component;
|
||||
import org.apache.tuscany.sca.assembly.Composite;
|
||||
import org.apache.tuscany.sca.assembly.Implementation;
|
||||
import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
|
||||
import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
|
||||
import org.apache.tuscany.sca.common.xml.dom.DOMHelper;
|
||||
|
@ -93,6 +95,16 @@ public class PolicyAttachmentBuilderImpl implements CompositeBuilder {
|
|||
* @throws Exception
|
||||
*/
|
||||
private Composite applyXPath(Composite composite, Definitions definitions, Monitor monitor) throws Exception {
|
||||
// Recursively apply the xpath against the composites referenced by <implementation.composite>
|
||||
for (Component component : composite.getComponents()) {
|
||||
Implementation impl = component.getImplementation();
|
||||
if (impl instanceof Composite) {
|
||||
Composite patched = applyXPath((Composite)impl, definitions, monitor);
|
||||
if (patched != impl) {
|
||||
component.setImplementation(patched);
|
||||
}
|
||||
}
|
||||
}
|
||||
// First write the composite into a DOM document so that we can apply the xpath
|
||||
StringWriter sw = new StringWriter();
|
||||
XMLStreamWriter writer = staxHelper.createXMLStreamWriter(sw);
|
||||
|
|
|
@ -19,22 +19,35 @@
|
|||
|
||||
package org.apache.tuscany.sca.policy.builder.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
import javax.xml.stream.XMLInputFactory;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.stream.XMLStreamReader;
|
||||
|
||||
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.assembly.builder.BuilderExtensionPoint;
|
||||
import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
|
||||
import org.apache.tuscany.sca.assembly.builder.impl.CompositeCloneBuilderImpl;
|
||||
import org.apache.tuscany.sca.assembly.builder.impl.CompositeIncludeBuilderImpl;
|
||||
import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
|
||||
import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
|
||||
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
|
||||
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
|
||||
import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
|
||||
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
|
||||
import org.apache.tuscany.sca.core.FactoryExtensionPoint;
|
||||
import org.apache.tuscany.sca.core.UtilityExtensionPoint;
|
||||
import org.apache.tuscany.sca.definitions.Definitions;
|
||||
import org.apache.tuscany.sca.monitor.DefaultMonitorFactory;
|
||||
import org.apache.tuscany.sca.monitor.Monitor;
|
||||
import org.apache.tuscany.sca.monitor.MonitorFactory;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
|
@ -44,13 +57,20 @@ import org.junit.Test;
|
|||
*/
|
||||
public class PolicyAttachmentTestCase {
|
||||
|
||||
private StAXArtifactProcessor<Object> staxProcessor;
|
||||
private Monitor monitor;
|
||||
private static StAXArtifactProcessor<Object> staxProcessor;
|
||||
private static Monitor monitor;
|
||||
|
||||
@Test
|
||||
public void testBuild() throws Exception {
|
||||
DefaultExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry();
|
||||
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
|
||||
private static ExtensionPointRegistry extensionPoints;
|
||||
private static XMLInputFactory inputFactory;
|
||||
private static AssemblyFactory assemblyFactory;
|
||||
private static BuilderExtensionPoint builders;
|
||||
|
||||
@BeforeClass
|
||||
public static void init() throws Exception {
|
||||
extensionPoints = new DefaultExtensionPointRegistry();
|
||||
FactoryExtensionPoint factories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
|
||||
assemblyFactory = factories.getFactory(AssemblyFactory.class);
|
||||
inputFactory = factories.getFactory(XMLInputFactory.class);
|
||||
// Create a monitor
|
||||
UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
|
||||
MonitorFactory monitorFactory = new DefaultMonitorFactory();
|
||||
|
@ -63,24 +83,63 @@ public class PolicyAttachmentTestCase {
|
|||
staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, null, monitor);
|
||||
staxProcessors.addArtifactProcessor(new TestPolicyProcessor());
|
||||
|
||||
URL url = getClass().getResource("test_definitions.xml");
|
||||
InputStream urlStream = url.openStream();
|
||||
XMLStreamReader reader = inputFactory.createXMLStreamReader(urlStream);
|
||||
reader.nextTag();
|
||||
builders = extensionPoints.getExtensionPoint(BuilderExtensionPoint.class);
|
||||
}
|
||||
|
||||
Definitions definitions = (Definitions)staxProcessor.read(reader);
|
||||
reader.close();
|
||||
|
||||
url = getClass().getResource("Calculator.composite");
|
||||
urlStream = url.openStream();
|
||||
reader = inputFactory.createXMLStreamReader(urlStream);
|
||||
reader.nextTag();
|
||||
|
||||
Composite composite = (Composite)staxProcessor.read(reader);
|
||||
reader.close();
|
||||
@Test
|
||||
public void testBuild() throws Exception {
|
||||
Definitions definitions = load("test_definitions.xml");
|
||||
Composite composite = load("Calculator.composite");
|
||||
|
||||
PolicyAttachmentBuilderImpl builder = new PolicyAttachmentBuilderImpl(extensionPoints);
|
||||
builder.build(composite, definitions, monitor);
|
||||
}
|
||||
|
||||
private <T> T load(String file) throws IOException, XMLStreamException, ContributionReadException {
|
||||
URL url = getClass().getResource(file);
|
||||
InputStream urlStream = url.openStream();
|
||||
XMLStreamReader reader = inputFactory.createXMLStreamReader(urlStream);
|
||||
reader.nextTag();
|
||||
|
||||
T model = (T)staxProcessor.read(reader);
|
||||
reader.close();
|
||||
return model;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testComplexBuild() throws Exception {
|
||||
Definitions definitions = load("definitions.xml");
|
||||
Composite composite1 = load("Composite1.composite");
|
||||
Composite composite2 = load("Composite2.composite");
|
||||
Composite composite3 = load("Composite3.composite");
|
||||
Composite composite4 = load("Composite4.composite");
|
||||
composite1.getIncludes().clear();
|
||||
composite1.getIncludes().add(composite3);
|
||||
|
||||
composite1.getComponent("Component1B").setImplementation(composite4);
|
||||
composite2.getComponent("Component2B").setImplementation(composite4);
|
||||
|
||||
Composite domainComposite = assemblyFactory.createComposite();
|
||||
domainComposite.setName(new QName(Base.SCA11_NS, ""));
|
||||
domainComposite.getIncludes().add(composite1);
|
||||
domainComposite.getIncludes().add(composite2);
|
||||
|
||||
CompositeBuilder includeBuilder = new CompositeIncludeBuilderImpl();
|
||||
CompositeBuilder cloneBuilder = new CompositeCloneBuilderImpl();
|
||||
|
||||
/*
|
||||
CompositeBuilder includeBuilder =
|
||||
builders.getCompositeBuilder("org.apache.tuscany.sca.assembly.builder.CompositeIncludeBuilder");
|
||||
CompositeBuilder cloneBuilder =
|
||||
builders.getCompositeBuilder("org.apache.tuscany.sca.assembly.builder.CompositeCloneBuilder");
|
||||
*/
|
||||
|
||||
includeBuilder.build(domainComposite, definitions, monitor);
|
||||
cloneBuilder.build(domainComposite, definitions, monitor);
|
||||
|
||||
PolicyAttachmentBuilderImpl builder = new PolicyAttachmentBuilderImpl(extensionPoints);
|
||||
builder.build(domainComposite, definitions, monitor);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200903">
|
||||
|
||||
<policySet name="PolicySet1" appliesTo="sca:implementation.java"
|
||||
attachTo = "//composite[@name='Composite1' or @name='Composite2']">
|
||||
attachTo = "//composite[@name='']">
|
||||
</policySet>
|
||||
|
||||
<policySet name="PolicySet2" appliesTo="sca:implementation.java"
|
||||
|
@ -32,7 +32,7 @@
|
|||
</policySet>
|
||||
|
||||
<policySet name="PolicySet3" appliesTo="sca:binding.ws"
|
||||
attachTo = "//sca:component[URIRef('Component2B/Component4A)]">
|
||||
attachTo = "//sca:component[sca:URIRef('Component2B/Component4A')]">
|
||||
</policySet>
|
||||
|
||||
</definitions>
|
Loading…
Add table
Reference in a new issue