diff options
5 files changed, 192 insertions, 8 deletions
diff --git a/branches/sca-java-1.3.3/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/TestSCABindingImpl.java b/branches/sca-java-1.3.3/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/TestSCABindingImpl.java index af25109de1..01abccee86 100644 --- a/branches/sca-java-1.3.3/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/TestSCABindingImpl.java +++ b/branches/sca-java-1.3.3/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/TestSCABindingImpl.java @@ -35,12 +35,14 @@ import org.apache.tuscany.sca.policy.IntentAttachPointType; import org.apache.tuscany.sca.policy.PolicySet; import org.apache.tuscany.sca.policy.PolicySetAttachPoint; +import org.apache.tuscany.sca.assembly.impl.ExtensibleImpl; + /** * A test cheel for the SCA binding. * * @version $Rev$ $Date$ */ -public class TestSCABindingImpl implements SCABinding, OptimizableBinding, PolicySetAttachPoint, OperationsConfigurator { +public class TestSCABindingImpl extends ExtensibleImpl implements SCABinding, OptimizableBinding, PolicySetAttachPoint, OperationsConfigurator { private String name; private String uri; private List<Object> extensions = new ArrayList<Object>(); diff --git a/branches/sca-java-1.3.3/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/SCABinding.java b/branches/sca-java-1.3.3/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/SCABinding.java index 2cf04277cd..5afafcbae0 100644 --- a/branches/sca-java-1.3.3/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/SCABinding.java +++ b/branches/sca-java-1.3.3/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/SCABinding.java @@ -23,5 +23,5 @@ package org.apache.tuscany.sca.assembly; * * @version $Rev$ $Date$ */ -public interface SCABinding extends Binding { +public interface SCABinding extends Binding, Extensible { } diff --git a/branches/sca-java-1.3.3/modules/binding-sca-xml/src/main/java/org/apache/tuscany/sca/binding/sca/xml/SCABindingProcessor.java b/branches/sca-java-1.3.3/modules/binding-sca-xml/src/main/java/org/apache/tuscany/sca/binding/sca/xml/SCABindingProcessor.java index a3e582c82e..edc307960b 100644 --- a/branches/sca-java-1.3.3/modules/binding-sca-xml/src/main/java/org/apache/tuscany/sca/binding/sca/xml/SCABindingProcessor.java +++ b/branches/sca-java-1.3.3/modules/binding-sca-xml/src/main/java/org/apache/tuscany/sca/binding/sca/xml/SCABindingProcessor.java @@ -26,12 +26,15 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; +import org.apache.tuscany.sca.assembly.Extension; +import org.apache.tuscany.sca.assembly.ExtensionFactory; import org.apache.tuscany.sca.assembly.SCABinding; import org.apache.tuscany.sca.assembly.SCABindingFactory; import org.apache.tuscany.sca.assembly.xml.Constants; import org.apache.tuscany.sca.assembly.xml.PolicyAttachPointProcessor; import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor; import org.apache.tuscany.sca.contribution.resolver.ModelResolver; import org.apache.tuscany.sca.contribution.service.ContributionReadException; import org.apache.tuscany.sca.contribution.service.ContributionResolveException; @@ -50,20 +53,32 @@ import org.apache.tuscany.sca.policy.PolicySetAttachPoint; public class SCABindingProcessor implements StAXArtifactProcessor<SCABinding>, Constants{ - private PolicyFactory policyFactory; private SCABindingFactory scaBindingFactory; - private PolicyAttachPointProcessor policyProcessor; + private ExtensionFactory extensionFactory; + private PolicyFactory policyFactory; private IntentAttachPointTypeFactory intentAttachPointTypeFactory; + + private PolicyAttachPointProcessor policyProcessor; + private StAXAttributeProcessor<Object> extensionAttributeProcessor; + private Monitor monitor; protected static final String BINDING_SCA = "binding.sca"; protected static final QName BINDING_SCA_QNAME = new QName(Constants.SCA10_NS, BINDING_SCA); - public SCABindingProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) { - this.policyFactory = modelFactories.getFactory(PolicyFactory.class); + public SCABindingProcessor(ModelFactoryExtensionPoint modelFactories, + StAXArtifactProcessor extensionProcessor, + StAXAttributeProcessor extensionAttributeProcessor, + Monitor monitor) { + this.scaBindingFactory = modelFactories.getFactory(SCABindingFactory.class); - policyProcessor = new PolicyAttachPointProcessor(policyFactory); + this.extensionFactory = modelFactories.getFactory(ExtensionFactory.class); + this.policyFactory = modelFactories.getFactory(PolicyFactory.class); this.intentAttachPointTypeFactory = modelFactories.getFactory(IntentAttachPointTypeFactory.class); + + this.policyProcessor = new PolicyAttachPointProcessor(policyFactory); + this.extensionAttributeProcessor = extensionAttributeProcessor; + this.monitor = monitor; } @@ -97,6 +112,24 @@ public class SCABindingProcessor implements StAXArtifactProcessor<SCABinding>, C scaBinding.setURI(uri); } + // Handle extended attributes + for (int a = 0; a < reader.getAttributeCount(); a++) { + QName attributeName = reader.getAttributeName(a); + if( attributeName.getNamespaceURI() != null && attributeName.getNamespaceURI().length() > 0) { + if( (! Constants.SCA10_NS.equals(attributeName.getNamespaceURI()) && + (! Constants.SCA10_TUSCANY_NS.equals(attributeName.getNamespaceURI()) ))) { + Object attributeValue = extensionAttributeProcessor.read(attributeName, reader); + Extension attributeExtension; + if (attributeValue instanceof Extension) { + attributeExtension = (Extension) attributeValue; + } else { + attributeExtension = extensionFactory.createExtension(attributeName, attributeValue, true); + } + scaBinding.getAttributeExtensions().add(attributeExtension); + } + } + } + // Skip to end element while (reader.hasNext()) { if (reader.next() == END_ELEMENT && BINDING_SCA_QNAME.equals(reader.getName())) { @@ -127,6 +160,14 @@ public class SCABindingProcessor implements StAXArtifactProcessor<SCABinding>, C writer.writeAttribute(URI, scaBinding.getURI()); } + // Write extended attributes + for(Extension extension : scaBinding.getAttributeExtensions()) { + if(extension.isAttribute()) { + extensionAttributeProcessor.write(extension, writer); + } + } + + writer.writeEndElement(); } diff --git a/branches/sca-java-1.3.3/modules/binding-sca-xml/src/test/java/org/apace/tuscany/sca/binding/sca/xml/ReadWriteAnyAttributeTestCase.java b/branches/sca-java-1.3.3/modules/binding-sca-xml/src/test/java/org/apace/tuscany/sca/binding/sca/xml/ReadWriteAnyAttributeTestCase.java new file mode 100644 index 0000000000..b5f9fa4673 --- /dev/null +++ b/branches/sca-java-1.3.3/modules/binding-sca-xml/src/test/java/org/apace/tuscany/sca/binding/sca/xml/ReadWriteAnyAttributeTestCase.java @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apace.tuscany.sca.binding.sca.xml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.ByteArrayOutputStream; +import java.io.StringReader; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.binding.sca.xml.SCABindingProcessor; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.contribution.processor.DefaultStAXAttributeProcessorExtensionPoint; +import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXAttributeProcessor; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; +import org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor; +import org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessorExtensionPoint; +import org.apache.tuscany.sca.contribution.processor.xml.AnyAttributeProcessor; +import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test reading SCA XML assemblies. + * + * @version $Rev$ $Date$ + */ +public class ReadWriteAnyAttributeTestCase { + + private static final QName EXTENDED_ATTRIBUTE = new QName("http://test", "customAttribute"); + + private static final String XML = + "<?xml version='1.0' encoding='UTF-8'?>" + + "<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\" " + + "xmlns:ns1=\"http://www.osoa.org/xmlns/sca/1.0\" " + + "targetNamespace=\"http://temp\" " + + "name=\"myComposite\">" + + "<service name=\"service\">" + + "<binding.sca xmlns:myPrefix=\"http://myPrefix\" myPrefix:myWSAnyAttribute=\"EJB Value\" />" + + "<interface.java interface=\"com.ibm.MyInterface\" xmlns:myPrefix=\"http://myPrefix\" myPrefix:myJavaInterfaceAnyAttribute=\"Java Interface Value\" />" + + "</service>" + + "<component name=\"component\">" + + "<implementation.java class=\"com.ibm.test.MyClass\" xmlns:myPrefix=\"http://myPrefix\" myPrefix:myJavaImplAnyAttribute=\"Java Impl Value\" />" + + "</component>" + + "<component name=\"component1\">" + + "<implementation.composite xmlns:ns2=\"http://temp\" name=\"ns2:myComposite\" xmlns:myPrefix=\"http://myPrefix\" myPrefix:myCompositeImplAnyAttribute=\"Composite Impl Value\" />" + + "</component>" + + "<reference name=\"reference\">" + + "<interface.wsdl interface=\"http://www.example.org/SpaceWarGame/#wsdl.interface(SpaceWarGame)\" xmlns:myPrefix=\"http://myPrefix\" myPrefix:myWSDLInterfaceAnyAttribute=\"WSDL Interface Value\" />" + + "</reference>" + + "</composite>"; + + private XMLInputFactory inputFactory; + private ExtensibleStAXArtifactProcessor staxProcessor; + + + /** + * Initialize the test environment + * This takes care to register attribute processors when provided + * + * @param attributeProcessor + * @throws Exception + */ + @Before + public void setUp() throws Exception { + ExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry(); + ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class); + + inputFactory = XMLInputFactory.newInstance(); + + StAXAttributeProcessor attributeProcessor = new AnyAttributeProcessor(modelFactories,null); + + StAXAttributeProcessorExtensionPoint staxAttributeProcessorsExtensionPoint = new DefaultStAXAttributeProcessorExtensionPoint(extensionPoints); + staxAttributeProcessorsExtensionPoint.addArtifactProcessor(attributeProcessor); + extensionPoints.addExtensionPoint(staxAttributeProcessorsExtensionPoint); + + + XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class); + XMLOutputFactory outputFactory = modelFactories.getFactory(XMLOutputFactory.class); + StAXAttributeProcessor<Object> staxAttributeProcessor = new ExtensibleStAXAttributeProcessor(staxAttributeProcessorsExtensionPoint ,inputFactory, outputFactory, null); + + SCABindingProcessor wsbp = new SCABindingProcessor(modelFactories, null, staxAttributeProcessor, null); + + StAXArtifactProcessorExtensionPoint staxProcessors = extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class); + staxProcessors.addArtifactProcessor(wsbp); + + staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, XMLInputFactory.newInstance(), XMLOutputFactory.newInstance(), null); + } + + @After + public void tearDown() throws Exception { + + } + + + @Test + //@Ignore() + public void testReadWriteCompositeWithBindings() throws Exception { + XMLStreamReader reader = inputFactory.createXMLStreamReader(new StringReader(XML)); + Composite composite = (Composite)staxProcessor.read(reader); + assertNotNull(composite); + reader.close(); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + staxProcessor.write(composite, bos); + + // used for debug comparison + // System.out.println(XML); + // System.out.println(bos.toString()); + + assertEquals(XML, bos.toString()); + bos.close(); + } +} diff --git a/branches/sca-java-1.3.3/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java b/branches/sca-java-1.3.3/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java index 1dc397659b..072abe2c9a 100644 --- a/branches/sca-java-1.3.3/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java +++ b/branches/sca-java-1.3.3/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java @@ -38,6 +38,7 @@ import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory; import org.apache.tuscany.sca.assembly.SCABinding; import org.apache.tuscany.sca.assembly.SCABindingFactory; import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; +import org.apache.tuscany.sca.assembly.impl.ExtensibleImpl; import org.apache.tuscany.sca.implementation.node.NodeImplementation; import org.apache.tuscany.sca.implementation.node.NodeImplementationFactory; import org.apache.tuscany.sca.implementation.node.impl.NodeImplementationFactoryImpl; @@ -549,7 +550,7 @@ public class CalculateBindingURITestCase extends TestCase { } } - public class TestBindingImpl implements SCABinding { + public class TestBindingImpl extends ExtensibleImpl implements SCABinding { private String name; private String uri; private boolean unresolved; |