summaryrefslogtreecommitdiffstats
path: root/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src')
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/ConfiguredNodeImplementation.java54
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementation.java45
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementationFactory.java42
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/builder/impl/NodeCompositeBuilderImpl.java111
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/ConfiguredNodeImplementationImpl.java104
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationFactoryImpl.java44
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationImpl.java97
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/ConfiguredNodeImplementationProcessor.java196
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/NodeImplementationProcessor.java119
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor20
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.node.NodeImplementationFactory19
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java603
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/ReadTestCase.java81
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/WriteTestCase.java65
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestComposite.composite29
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestNode.composite64
16 files changed, 1693 insertions, 0 deletions
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/ConfiguredNodeImplementation.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/ConfiguredNodeImplementation.java
new file mode 100644
index 0000000000..d4755f4071
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/ConfiguredNodeImplementation.java
@@ -0,0 +1,54 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node;
+
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.contribution.Contribution;
+
+
+
+/**
+ * The model representing a resource implementation in an SCA assembly model.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface ConfiguredNodeImplementation extends Implementation {
+
+ /**
+ * Returns the composite deployed to this node.
+ * @return the composite deployed to this node
+ */
+ Composite getComposite();
+
+ /**
+ * Sets the composite deployed to this node.
+ * @param composite the composite deployed to this node
+ */
+ void setComposite(Composite composite);
+
+ /**
+ * Returns the list of contributions deployed to this node.
+ * @return the list of contributions deployed to this node
+ */
+ List<Contribution> getContributions();
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementation.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementation.java
new file mode 100644
index 0000000000..527698ea91
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementation.java
@@ -0,0 +1,45 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.Implementation;
+
+
+
+/**
+ * The model representing a resource implementation in an SCA assembly model.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface NodeImplementation extends Implementation {
+
+ /**
+ * Returns the composite deployed to this node.
+ * @return the composite deployed to this node
+ */
+ Composite getComposite();
+
+ /**
+ * Sets the composite deployed to this node.
+ * @param composite the composite deployed to this node
+ */
+ void setComposite(Composite composite);
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementationFactory.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementationFactory.java
new file mode 100644
index 0000000000..9c4fed689b
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/NodeImplementationFactory.java
@@ -0,0 +1,42 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node;
+
+
+/**
+ * Factory for the resource implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface NodeImplementationFactory {
+
+ /**
+ * Creates a new node implementation.
+ * @return a new node implementation
+ */
+ NodeImplementation createNodeImplementation();
+
+ /**
+ * Creates a new configured node implementation.
+ * @return a new configured node implementation
+ */
+ ConfiguredNodeImplementation createConfiguredNodeImplementation();
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/builder/impl/NodeCompositeBuilderImpl.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/builder/impl/NodeCompositeBuilderImpl.java
new file mode 100644
index 0000000000..33257a22e4
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/builder/impl/NodeCompositeBuilderImpl.java
@@ -0,0 +1,111 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.builder.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.TransformerFactory;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+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.Implementation;
+import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.impl.BaseConfigurationBuilderImpl;
+import org.apache.tuscany.sca.definitions.SCADefinitions;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.monitor.Monitor;
+
+/**
+ * A composite builder that handles the configuration of composites assigned to
+ * node components, from the default configuration from the node components.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NodeCompositeBuilderImpl extends BaseConfigurationBuilderImpl implements CompositeBuilder {
+
+ @Deprecated
+ public NodeCompositeBuilderImpl(AssemblyFactory assemblyFactory,
+ SCABindingFactory scaBindingFactory,
+ InterfaceContractMapper interfaceContractMapper,
+ SCADefinitions policyDefinitions,
+ Monitor monitor) {
+ super(assemblyFactory, scaBindingFactory,
+ null, null,
+ interfaceContractMapper, policyDefinitions, monitor);
+ }
+
+ public NodeCompositeBuilderImpl(AssemblyFactory assemblyFactory,
+ SCABindingFactory scaBindingFactory,
+ DocumentBuilderFactory documentBuilderFactory,
+ TransformerFactory transformerFactory,
+ InterfaceContractMapper interfaceContractMapper,
+ SCADefinitions policyDefinitions,
+ Monitor monitor,
+ Map<Binding, Binding> bindingMap) {
+ super(assemblyFactory, scaBindingFactory,
+ documentBuilderFactory, transformerFactory,
+ interfaceContractMapper, policyDefinitions, monitor, bindingMap);
+ }
+
+ public void build(Composite composite) throws CompositeBuilderException {
+ configureNodeComponents(composite);
+ }
+
+ /**
+ * Configure the node components in the given composite.
+ *
+ * @param composite
+ * @throws CompositeBuilderException
+ */
+ private void configureNodeComponents(Composite composite) throws CompositeBuilderException {
+
+ // Process each node component in the given composite
+ for (Component component: composite.getComponents()) {
+ Implementation implementation = component.getImplementation();
+ if (implementation instanceof NodeImplementation) {
+
+ // Get the application composite assigned to the node
+ NodeImplementation nodeImplementation = (NodeImplementation)implementation;
+ Composite applicationComposite = nodeImplementation.getComposite();
+
+ // Get the default bindings configured on the node
+ List<Binding> defaultBindings = new ArrayList<Binding>();
+ for (ComponentService componentService: component.getServices()) {
+ defaultBindings.addAll(componentService.getBindings());
+ }
+
+ // Configure services in the application composite assigned to
+ // the node using the default bindings.
+ configureBindingURIs(applicationComposite, defaultBindings);
+ }
+ }
+
+ }
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/ConfiguredNodeImplementationImpl.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/ConfiguredNodeImplementationImpl.java
new file mode 100644
index 0000000000..1d183513b4
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/ConfiguredNodeImplementationImpl.java
@@ -0,0 +1,104 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.ConstrainingType;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.implementation.node.ConfiguredNodeImplementation;
+
+
+/**
+ * The model representing a configured node implementation in an SCA assembly model.
+ *
+ * @version $Rev$ $Date$
+ */
+class ConfiguredNodeImplementationImpl implements ConfiguredNodeImplementation {
+
+ private String uri;
+ private boolean unresolved;
+ private Composite composite;
+ private List<Contribution> contributions = new ArrayList<Contribution>();
+
+ /**
+ * Constructs a new node implementation.
+ */
+ ConfiguredNodeImplementationImpl() {
+ }
+
+ public ConstrainingType getConstrainingType() {
+ // The node implementation does not support constrainingTypes
+ return null;
+ }
+
+ public List<Property> getProperties() {
+ // The node implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public List<Service> getServices() {
+ // The node implementation does not support services
+ return Collections.emptyList();
+ }
+
+ public List<Reference> getReferences() {
+ // The node implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public String getURI() {
+ return uri;
+ }
+
+ public Composite getComposite() {
+ return composite;
+ }
+
+ public List<Contribution> getContributions() {
+ return contributions;
+ }
+
+ public void setConstrainingType(ConstrainingType constrainingType) {
+ // The node implementation does not support constrainingTypes
+ }
+
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ public void setComposite(Composite composite) {
+ this.composite = composite;
+ }
+
+
+ public boolean isUnresolved() {
+ return unresolved;
+ }
+
+ public void setUnresolved(boolean unresolved) {
+ this.unresolved = unresolved;
+ }
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationFactoryImpl.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationFactoryImpl.java
new file mode 100644
index 0000000000..94ea610314
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationFactoryImpl.java
@@ -0,0 +1,44 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.impl;
+
+import org.apache.tuscany.sca.implementation.node.ConfiguredNodeImplementation;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+import org.apache.tuscany.sca.implementation.node.NodeImplementationFactory;
+
+/**
+ * Factory for the resource implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NodeImplementationFactoryImpl implements NodeImplementationFactory {
+
+ public NodeImplementationFactoryImpl() {
+ }
+
+ public NodeImplementation createNodeImplementation() {
+ return new NodeImplementationImpl();
+ }
+
+ public ConfiguredNodeImplementation createConfiguredNodeImplementation() {
+ return new ConfiguredNodeImplementationImpl();
+ }
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationImpl.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationImpl.java
new file mode 100644
index 0000000000..8f6315d969
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/impl/NodeImplementationImpl.java
@@ -0,0 +1,97 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.ConstrainingType;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+
+
+/**
+ * The model representing a node implementation in an SCA assembly model.
+ *
+ * @version $Rev$ $Date$
+ */
+class NodeImplementationImpl implements NodeImplementation {
+
+ private String uri;
+ private boolean unresolved;
+ private Composite composite;
+
+ /**
+ * Constructs a new node implementation.
+ */
+ NodeImplementationImpl() {
+ }
+
+ public ConstrainingType getConstrainingType() {
+ // The node implementation does not support constrainingTypes
+ return null;
+ }
+
+ public List<Property> getProperties() {
+ // The node implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public List<Service> getServices() {
+ // The node implementation does not support services
+ return Collections.emptyList();
+ }
+
+ public List<Reference> getReferences() {
+ // The node implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public String getURI() {
+ return uri;
+ }
+
+ public Composite getComposite() {
+ return composite;
+ }
+
+ public void setConstrainingType(ConstrainingType constrainingType) {
+ // The node implementation does not support constrainingTypes
+ }
+
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ public void setComposite(Composite composite) {
+ this.composite = composite;
+ }
+
+
+ public boolean isUnresolved() {
+ return unresolved;
+ }
+
+ public void setUnresolved(boolean unresolved) {
+ this.unresolved = unresolved;
+ }
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/ConfiguredNodeImplementationProcessor.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/ConfiguredNodeImplementationProcessor.java
new file mode 100644
index 0000000000..e695340d45
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/ConfiguredNodeImplementationProcessor.java
@@ -0,0 +1,196 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.xml;
+
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.implementation.node.ConfiguredNodeImplementation;
+import org.apache.tuscany.sca.implementation.node.NodeImplementationFactory;
+import org.apache.tuscany.sca.monitor.Monitor;
+
+
+/**
+ * Implements a StAX artifact processor for configured node implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ConfiguredNodeImplementationProcessor extends BaseStAXArtifactProcessor implements StAXArtifactProcessor<ConfiguredNodeImplementation> {
+
+ private static final String ATOM_NS = "http://www.w3.org/2005/Atom";
+ private static final QName FEED_QNAME = new QName(ATOM_NS, "feed");
+ private static final QName ENTRY_QNAME = new QName(ATOM_NS, "entry");
+ private static final QName ID_QNAME = new QName(ATOM_NS, "id");
+ private static final QName LINK_QNAME = new QName(ATOM_NS, "link");
+ private static final String HREF = "href";
+
+ private ContributionFactory contributionFactory;
+ private AssemblyFactory assemblyFactory;
+ private NodeImplementationFactory implementationFactory;
+
+ public ConfiguredNodeImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ this.contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+ this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ this.implementationFactory = modelFactories.getFactory(NodeImplementationFactory.class);
+ }
+
+ public QName getArtifactType() {
+ return null;
+ }
+
+ public Class<ConfiguredNodeImplementation> getModelType() {
+ // Returns the type of model processed by this processor
+ return ConfiguredNodeImplementation.class;
+ }
+
+ public ConfiguredNodeImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+
+ ConfiguredNodeImplementation implementation = implementationFactory.createConfiguredNodeImplementation();
+ implementation.setUnresolved(true);
+
+ // Read a feed containing links to the composite and the contributions assigned to
+ // the node
+ Composite composite = null;
+ Contribution contribution = null;
+ boolean id = false;
+ QName name = null;
+
+ while (reader.hasNext()) {
+ int event = reader.getEventType();
+ switch (event) {
+
+ case START_ELEMENT:
+ name = reader.getName();
+
+ if (ENTRY_QNAME.equals(name)) {
+
+ // Read an <entry>
+ if (implementation.getComposite() == null) {
+ composite = assemblyFactory.createComposite();
+ } else {
+ contribution = contributionFactory.createContribution();
+ }
+ } else if (ID_QNAME.equals(name)) {
+
+ // Read an <id>
+ id = true;
+
+ } else if (LINK_QNAME.equals(name)) {
+
+ // Read a <link>
+ String href = getString(reader, HREF);
+
+ if (composite != null) {
+ composite.setURI(href);
+ } else if (contribution != null) {
+ contribution.setLocation(href);
+ }
+ }
+ break;
+
+ case XMLStreamConstants.CHARACTERS:
+
+ // Read characters inside an <id> element
+ if (id) {
+ if (contribution != null) {
+ contribution.setURI(reader.getText());
+ }
+ }
+ break;
+
+ case END_ELEMENT:
+ name = reader.getName();
+
+ // Clear current state when reading reaching end element
+ if (ENTRY_QNAME.equals(name)) {
+ if (composite != null) {
+ implementation.setComposite(composite);
+ } else if (contribution != null) {
+ implementation.getContributions().add(contribution);
+ }
+
+ composite = null;
+ contribution = null;
+
+ } else if (ID_QNAME.equals(name)) {
+ id = false;
+
+ } else if (FEED_QNAME.equals(name)) {
+
+ // We've reached the end of the feed
+ return implementation;
+ }
+ break;
+ }
+
+ // Read the next element
+ if (reader.hasNext()) {
+ reader.next();
+ }
+ }
+ return implementation;
+ }
+
+ public void resolve(ConfiguredNodeImplementation implementation, ModelResolver resolver) throws ContributionResolveException {
+
+ // Resolve the referenced composite
+ Composite composite = implementation.getComposite();
+ if (composite != null) {
+ composite = resolver.resolveModel(Composite.class, composite);
+ if (!composite.isUnresolved()) {
+ implementation.setComposite(composite);
+ }
+ }
+
+ // Resolve the referenced contributions
+ List<Contribution> contributions = implementation.getContributions();
+ for (int i = 0, n = contributions.size(); i < n; i++) {
+ Contribution contribution = contributions.get(i);
+ contribution = resolver.resolveModel(Contribution.class, contribution);
+ if (!contribution.isUnresolved()) {
+ contributions.set(i, contribution);
+ }
+ }
+
+ implementation.setUnresolved(false);
+ }
+
+ public void write(ConfiguredNodeImplementation implementation, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+ //TODO Write the feed describing the node configuration
+ }
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/NodeImplementationProcessor.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/NodeImplementationProcessor.java
new file mode 100644
index 0000000000..201354f89c
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/java/org/apache/tuscany/sca/implementation/node/xml/NodeImplementationProcessor.java
@@ -0,0 +1,119 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.xml;
+
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+import org.apache.tuscany.sca.implementation.node.NodeImplementationFactory;
+import org.apache.tuscany.sca.monitor.Monitor;
+
+
+/**
+ * Implements a StAX artifact processor for node implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NodeImplementationProcessor extends BaseStAXArtifactProcessor implements StAXArtifactProcessor<NodeImplementation> {
+ private static final QName IMPLEMENTATION_NODE = new QName(Constants.SCA10_TUSCANY_NS, "implementation.node");
+
+ private AssemblyFactory assemblyFactory;
+ private NodeImplementationFactory implementationFactory;
+
+ public NodeImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ this.implementationFactory = modelFactories.getFactory(NodeImplementationFactory.class);
+ }
+
+ public QName getArtifactType() {
+ // Returns the QName of the XML element processed by this processor
+ return IMPLEMENTATION_NODE;
+ }
+
+ public Class<NodeImplementation> getModelType() {
+ // Returns the type of model processed by this processor
+ return NodeImplementation.class;
+ }
+
+ public NodeImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+
+ // Read an <implementation.node> element
+ NodeImplementation implementation = implementationFactory.createNodeImplementation();
+ implementation.setUnresolved(false);
+
+ // Read the composite attribute
+ QName qname = getQName(reader, "composite");
+ if (qname != null) {
+ Composite composite = assemblyFactory.createComposite();
+ composite.setName(qname);
+ String uri = getString(reader, "uri");
+ composite.setURI(uri);
+ composite.setUnresolved(true);
+ implementation.setComposite(composite);
+ }
+
+ // Skip to end element
+ while (reader.hasNext()) {
+ if (reader.next() == END_ELEMENT && IMPLEMENTATION_NODE.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ return implementation;
+ }
+
+ public void resolve(NodeImplementation implementation, ModelResolver resolver) throws ContributionResolveException {
+ // We do not need to resolve the referenced composites here
+ // Nodes and application composites are not in the same composition tree
+ }
+
+ public void write(NodeImplementation implementation, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+
+ // Write <implementation.node>
+ Composite composite = implementation.getComposite();
+ QName qname;
+ String uri;
+ if (composite != null) {
+ qname = composite.getName();
+ uri = composite.getURI();
+ } else {
+ qname = null;
+ uri = null;
+ }
+ writeStart(writer, IMPLEMENTATION_NODE.getNamespaceURI(), IMPLEMENTATION_NODE.getLocalPart(),
+ new XAttr("composite", qname), new XAttr("uri", uri));
+
+ writeEnd(writer);
+ }
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
new file mode 100644
index 0000000000..9378db0875
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
@@ -0,0 +1,20 @@
+# 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.
+
+# Implementation class for the artifact processor extension
+org.apache.tuscany.sca.implementation.node.xml.NodeImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#implementation.node,model=org.apache.tuscany.sca.implementation.node.NodeImplementation,factory=org.apache.tuscany.sca.implementation.node.NodeImplementationFactory
+org.apache.tuscany.sca.implementation.node.xml.ConfiguredNodeImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#implementation.node.configured,model=org.apache.tuscany.sca.implementation.node.ConfiguredNodeImplementation,factory=org.apache.tuscany.sca.implementation.node.NodeImplementationFactory \ No newline at end of file
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.node.NodeImplementationFactory b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.node.NodeImplementationFactory
new file mode 100644
index 0000000000..b8a63a3b16
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.node.NodeImplementationFactory
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for model factory
+org.apache.tuscany.sca.implementation.node.impl.NodeImplementationFactoryImpl
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java
new file mode 100644
index 0000000000..db31b3c17e
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/builder/impl/CalculateBindingURITestCase.java
@@ -0,0 +1,603 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.builder.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+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.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;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.monitor.impl.ProblemImpl;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public class CalculateBindingURITestCase extends TestCase {
+ private static final Logger logger = Logger.getLogger(CalculateBindingURITestCase.class.getName());
+ private AssemblyFactory assemblyFactory;
+ private SCABindingFactory scaBindingFactory;
+ private NodeImplementationFactory nodeImplementationFactory;
+ private Monitor monitor;
+ private CompositeBuilder configurationBuilder;
+ private List<Binding> defaultBindings = new ArrayList<Binding>();
+
+ @Override
+ protected void setUp() throws Exception {
+ assemblyFactory = new DefaultAssemblyFactory();
+ scaBindingFactory = new TestBindingFactory();
+ nodeImplementationFactory = new NodeImplementationFactoryImpl();
+ monitor = new Monitor() {
+ public void problem(Problem problem) {
+ if (problem.getSeverity() == Severity.INFO) {
+ logger.info(problem.toString());
+ } else if (problem.getSeverity() == Severity.WARNING) {
+ logger.warning(problem.toString());
+ } else if (problem.getSeverity() == Severity.ERROR) {
+ if (problem.getCause() != null) {
+ logger.log(Level.SEVERE, problem.toString(), problem.getCause());
+ } else {
+ logger.severe(problem.toString());
+ }
+ }
+ }
+ public List<Problem> getProblems() {
+ return null;
+ }
+
+ public Problem createProblem(String sourceClassName, String bundleName,
+ Severity severity, Object problemObject, String messageId,
+ Exception cause) {
+ return new ProblemImpl(sourceClassName, bundleName, severity,
+ problemObject, messageId, cause);
+ }
+
+ public Problem createProblem(String sourceClassName, String bundleName,
+ Severity severity, Object problemObject, String messageId,
+ Object... messageParams) {
+ return new ProblemImpl(sourceClassName, bundleName, severity,
+ problemObject, messageId, messageParams);
+ }
+ };
+ configurationBuilder = new NodeCompositeBuilderImpl(assemblyFactory, scaBindingFactory, null, null, monitor);
+ Binding defaultBinding = new TestBindingImpl();
+ defaultBinding.setURI("http://myhost:8080/root");
+ defaultBindings.add(defaultBinding);
+ }
+
+ /**
+ * Create a composite containing a node component pointing to the
+ * given application composite.
+ *
+ * @param composite
+ * @return
+ */
+ private Composite nodeComposite(Composite composite) {
+ Composite nodeComposite = assemblyFactory.createComposite();
+ Component nodeComponent = assemblyFactory.createComponent();
+ NodeImplementation nodeImplementation = nodeImplementationFactory.createNodeImplementation();
+ nodeImplementation.setComposite(composite);
+ nodeComponent.setImplementation(nodeImplementation);
+ ComponentService nodeService = assemblyFactory.createComponentService();
+ nodeService.getBindings().addAll(defaultBindings);
+ nodeComponent.getServices().add(nodeService);
+ nodeComposite.getComponents().add(nodeComponent);
+ return nodeComposite;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ assemblyFactory = null;
+ }
+
+ /**
+ * Test that URI are generated in accordance with the Assembly Specification section 1.7.2.1 as
+ * follows. For the 3 parts that make up the URI;
+ *
+ * BaseURI / Component URI / Service Binding URI
+ *
+ * Test the following combinations for:
+ *
+ * NB. The short hand here, e.g. <service name="s1"> <binding.sca> <service name="s2"> means
+ * two services appear where the first has the sca binding specified.
+ *
+ * component service bindings
+ *
+ * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca>
+ * --> http://myhost:8080/root/c1
+ * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca> <service name="s2">
+ * --> http://myhost:8080/root/c1/s1
+ * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca name="n"> <service name="s2">
+ * --> http://myhost:8080/root/c1/n
+ * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca uri="b"> <service name="s2">
+ * --> http://myhost:8080/root/c1/b
+ * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca uri="http://myhost:8080/b"> <service name="s2">
+ * --> http://myhost:8080/b
+ * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca uri="../../b"> <service name="s2">
+ * --> http://myhost:8080/b
+ *
+ * top level composite service bindings
+ *
+ * http://myhost:8080/root / null / <service name="s1"> <binding.sca> <service name="s2">
+ * --> http://myhost:8080/root
+ * http://myhost:8080/root / null / <service name="s1"> <binding.sca> <service name="s2">
+ * --> http://myhost:8080/root/s1
+ * http://myhost:8080/root / null / <service name="s1"> <binding.sca name="n"> <service name="s2">
+ * --> http://myhost:8080/root/n
+ * http://myhost:8080/root / null / <service name="s1"> <binding.sca uri="b"> <service name="s2">
+ * --> http://myhost:8080/root/b
+ * http://myhost:8080/root / null / <service name="s1"> <binding.sca uri="http://myhost:8080/b"> <service name="s2">
+ * --> http://myhost:8080/b
+ *
+ * nested composite service bindings
+ *
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca>
+ * --> http://myhost:8080/root/c1/c2
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca> <service name="s2">
+ * --> http://myhost:8080/root/c1/c2/s1
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca name="n"> <service name="s2">
+ * --> http://myhost:8080/root/c1/c2/n
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca uri="b"> <service name="s2">
+ * --> http://myhost:8080/root/c1/c2/b
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca uri="http://myhost:8080/b"> <service name="s2">
+ * --> http://myhost:8080/b
+ *
+ * binding name duplication errors
+ *
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca> <binding.xyz>
+ * --> Error
+ * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca name="b1"> <binding.xyz name="b1">
+ * --> Error
+ */
+
+ private Composite createComponentServiceBinding() {
+ Composite composite1 = assemblyFactory.createComposite();
+ composite1.setName(new QName("http://foo", "C1"));
+
+ Component c1 = assemblyFactory.createComponent();
+ c1.setName("c1");
+ composite1.getComponents().add(c1);
+
+ ComponentService s1 = assemblyFactory.createComponentService();
+ c1.getServices().add(s1);
+ s1.setName("s1");
+
+ ComponentService s2 = assemblyFactory.createComponentService();
+ c1.getServices().add(s2);
+ s2.setName("s2");
+
+ Binding b1 = new TestBindingImpl();
+ s1.getBindings().add(b1);
+
+ Binding b2 = new TestBindingImpl();
+ s2.getBindings().add(b2);
+
+ return composite1;
+ }
+
+ private Composite createTopLevelCompositeServiceBinding(){
+ Composite composite1 = assemblyFactory.createComposite();
+ composite1.setName(new QName("http://foo", "C1"));
+
+ CompositeService s1 = assemblyFactory.createCompositeService();
+ s1.setName("s1");
+ composite1.getServices().add(s1);
+
+ Binding b1 = new TestBindingImpl();
+ s1.getBindings().add(b1);
+
+ CompositeService s2 = assemblyFactory.createCompositeService();
+ s2.setName("s2");
+ composite1.getServices().add(s2);
+
+ Binding b2 = new TestBindingImpl();
+ s2.getBindings().add(b2);
+
+ return composite1;
+ }
+
+ private Composite createNestCompositeServiceBinding(){
+ Composite composite1 = assemblyFactory.createComposite();
+ composite1.setName(new QName("http://foo", "C1"));
+
+ Component c1 = assemblyFactory.createComponent();
+ c1.setName("c1");
+ composite1.getComponents().add(c1);
+
+ Composite composite2 = assemblyFactory.createComposite();
+ c1.setImplementation(composite2);
+ composite2.setName(new QName("http://foo", "C2"));
+
+ Component c2 = assemblyFactory.createComponent();
+ composite2.getComponents().add(c2);
+ c2.setName("c2");
+
+ ComponentService s1 = assemblyFactory.createComponentService();
+ c2.getServices().add(s1);
+ s1.setName("s1");
+
+ ComponentService s2 = assemblyFactory.createComponentService();
+ c2.getServices().add(s2);
+ s2.setName("s2");
+
+ Binding b1 = new TestBindingImpl();
+ s1.getBindings().add(b1);
+
+ Binding b2 = new TestBindingImpl();
+ s2.getBindings().add(b2);
+
+ return composite1;
+ }
+
+ // component service binding tests
+
+ public void testComponentServiceSingleService() {
+ Composite composite = createComponentServiceBinding();
+ composite.getComponents().get(0).getServices().remove(1);
+ Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testComponentServiceBindingDefault() {
+ Composite composite = createComponentServiceBinding();
+ Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/s1", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testComponentServiceBindingName() {
+ Composite composite = createComponentServiceBinding();
+ Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/n", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testComponentServiceBindingURIRelative() {
+ Composite composite = createComponentServiceBinding();
+ Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testComponentServiceBindingURIAbsolute() {
+ Composite composite = createComponentServiceBinding();
+ Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("http://myhost:8080/b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testComponentServiceBindingURIRelative2() {
+ Composite composite = createComponentServiceBinding();
+ Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("../../b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ // top level composite service binding tests
+
+ public void testCompositeServiceSingleService() {
+ Composite composite = createTopLevelCompositeServiceBinding();
+ composite.getServices().remove(1);
+ Binding b = composite.getServices().get(0).getBindings().get(0);
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testCompositeServiceBindingDefault() {
+ Composite composite = createTopLevelCompositeServiceBinding();
+ Binding b = composite.getServices().get(0).getBindings().get(0);
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/s1", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testCompositeServiceBindingName() {
+ Composite composite = createTopLevelCompositeServiceBinding();
+ Binding b = composite.getServices().get(0).getBindings().get(0);
+ b.setName("n");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/n", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testCompositeServiceBindingURIRelative() {
+ Composite composite = createTopLevelCompositeServiceBinding();
+ Binding b = composite.getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testCompositeServiceBindingURIAbsolute() {
+ Composite composite = createTopLevelCompositeServiceBinding();
+ Binding b = composite.getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("http://myhost:8080/b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ // nested composite service binding tests
+
+ public void testNestedCompositeServiceSingleService() {
+ Composite composite = createNestCompositeServiceBinding();
+ ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().remove(1);
+ Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0);
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/c2", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testNestedCompositeServiceBindingDefault() {
+ Composite composite = createNestCompositeServiceBinding();
+ Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0);
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/c2/s1", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testNestedCompositeServiceBindingName() {
+ Composite composite = createNestCompositeServiceBinding();
+ Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/c2/n", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testNestedCompositeServiceBindingURIRelative() {
+ Composite composite = createNestCompositeServiceBinding();
+ Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/root/c1/c2/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ public void testNestedCompositeServiceBindingURIAbsolute() {
+ Composite composite = createNestCompositeServiceBinding();
+ Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0);
+ b.setName("n");
+ b.setURI("http://myhost:8080/b");
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+
+ assertEquals("http://myhost:8080/b", b.getURI());
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ fail();
+ }
+ }
+
+ // component service binding name error tests
+
+ //FIXME Need to find a better way to test these error cases as
+ // the composite builder now (intentionally) logs warnings instead of
+ // throwing exceptions
+ public void FIXMEtestComponentServiceBindingNameError1() {
+ Composite composite = createComponentServiceBinding();
+ Binding b1 = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+ Binding b2 = new TestBindingImpl();
+ composite.getComponents().get(0).getServices().get(0).getBindings().add(b2);
+
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+ fail();
+ } catch(Exception ex){
+ //System.out.println(ex.toString());
+ }
+ }
+
+ //FIXME Need to find a better way to test these error cases as
+ // the composite builder now (intentionally) logs warnings instead of
+ // throwing exceptions
+ public void FIXMEtestComponentServiceBindingNameError2() {
+ Composite composite = createComponentServiceBinding();
+ Binding b1 = composite.getComponents().get(0).getServices().get(0).getBindings().get(0);
+ Binding b2 = new TestBindingImpl();
+ composite.getComponents().get(0).getServices().get(0).getBindings().add(b2);
+
+ b1.setName("b");
+ b2.setName("b");
+
+
+ try {
+ configurationBuilder.build(nodeComposite(composite));
+ fail();
+ } catch(Exception ex){
+ System.out.println(ex.toString());
+ }
+ }
+
+
+ public class TestBindingFactory implements SCABindingFactory {
+ public SCABinding createSCABinding() {
+ return new TestBindingImpl();
+ }
+ }
+
+ public class TestBindingImpl extends ExtensibleImpl implements SCABinding {
+ private String name;
+ private String uri;
+ private boolean unresolved;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getURI() {
+ return uri;
+ }
+
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ public void setUnresolved(boolean unresolved) {
+ this.unresolved = unresolved;
+ }
+
+ public boolean isUnresolved() {
+ return unresolved;
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+ }
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/ReadTestCase.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/ReadTestCase.java
new file mode 100644
index 0000000000..bc0c3b1507
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/ReadTestCase.java
@@ -0,0 +1,81 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.xml;
+
+import java.io.InputStream;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.DefaultStAXArtifactProcessorExtensionPoint;
+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.UtilityExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl;
+import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
+
+/**
+ * Test reading Node implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ReadTestCase extends TestCase {
+
+ private XMLInputFactory inputFactory;
+ private StAXArtifactProcessor<Object> staxProcessor;
+ private CompositeBuilder compositeBuilder;
+
+ @Override
+ public void setUp() throws Exception {
+ DefaultExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry();
+ inputFactory = XMLInputFactory.newInstance();
+ StAXArtifactProcessorExtensionPoint staxProcessors = new DefaultStAXArtifactProcessorExtensionPoint(extensionPoints);
+ staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, null, null);
+
+ ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
+ AssemblyFactory assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ SCABindingFactory scaBindingFactory = modelFactories.getFactory(SCABindingFactory.class);
+ UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ InterfaceContractMapper mapper = utilities.getUtility(InterfaceContractMapper.class);
+ IntentAttachPointTypeFactory attachPointTypeFactory = modelFactories.getFactory(IntentAttachPointTypeFactory.class);
+ compositeBuilder = new CompositeBuilderImpl(assemblyFactory, scaBindingFactory, attachPointTypeFactory, mapper, null);
+ }
+
+ public void testReadComposite() throws Exception {
+ InputStream is = getClass().getResourceAsStream("TestNode.composite");
+ XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
+ Composite composite = (Composite)staxProcessor.read(reader);
+ assertNotNull(composite);
+
+ compositeBuilder.build(composite);
+ }
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/WriteTestCase.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/WriteTestCase.java
new file mode 100644
index 0000000000..c5e6a40f89
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/java/org/apache/tuscany/sca/implementation/node/xml/WriteTestCase.java
@@ -0,0 +1,65 @@
+/*
+ * 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.apache.tuscany.sca.implementation.node.xml;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.contribution.processor.DefaultStAXArtifactProcessorExtensionPoint;
+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;
+
+/**
+ * Test reading/writing Node implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public class WriteTestCase extends TestCase {
+
+ private XMLInputFactory inputFactory;
+ private XMLOutputFactory outputFactory;
+ private StAXArtifactProcessor<Object> staxProcessor;
+
+ @Override
+ public void setUp() throws Exception {
+ DefaultExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry();
+ inputFactory = XMLInputFactory.newInstance();
+ outputFactory = XMLOutputFactory.newInstance();
+ StAXArtifactProcessorExtensionPoint staxProcessors = new DefaultStAXArtifactProcessorExtensionPoint(extensionPoints);
+ staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory, null);
+ }
+
+ public void testReadWriteComposite() throws Exception {
+ InputStream is = getClass().getResourceAsStream("TestNode.composite");
+ Composite composite = (Composite)staxProcessor.read(inputFactory.createXMLStreamReader(is));
+ assertNotNull(composite);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ staxProcessor.write(composite, outputFactory.createXMLStreamWriter(bos));
+ }
+
+}
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestComposite.composite b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestComposite.composite
new file mode 100644
index 0000000000..55644c27e5
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestComposite.composite
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/composite"
+ xmlns:sc="http://sample/composite"
+ name="TestComposite">
+
+ <component name="TestComponent">
+ </component>
+
+</composite>
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestNode.composite b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestNode.composite
new file mode 100644
index 0000000000..92787d3ac1
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/implementation-node/src/test/resources/org/apache/tuscany/sca/implementation/node/xml/TestNode.composite
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/node"
+ xmlns:sc="http://sample/composite"
+ name="TestNode">
+
+ <component name="TestNode">
+ <tuscany:implementation.node composite="sc:TestComposite"/>
+ <service name="Default">
+ <binding.sca uri="http://localhost:8080"/>
+ </service>
+ </component>
+
+ <component name="TestNode2">
+ <tuscany:implementation.node.configured>
+
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <title type="text">Feed</title>
+ <entry>
+ <id>composite:store;http://store;store</id>
+ <title type="text">store - http://store;store</title>
+ <content type="text" />
+ <link
+ href="/resolved/composite/composite:store;http://store;store" />
+ </entry>
+ <entry>
+ <id>assets</id>
+ <title type="text">assets</title>
+ <content type="text" />
+ <link
+ href="http://localhost:9990/files/tutorial-assets.jar" />
+ </entry>
+ <entry>
+ <id>store</id>
+ <title type="text">store</title>
+ <content type="text" />
+ <link
+ href="http://localhost:9990/files/tutorial-store.jar" />
+ </entry>
+ </feed>
+
+ </tuscany:implementation.node.configured>
+ </component>
+
+</composite>