You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2007/06/19 17:16:59 UTC

svn commit: r548761 - in /incubator/tuscany/java/sca/modules/topology-xml/src: main/java/org/ main/java/org/apache/ main/java/org/apache/tuscany/ main/java/org/apache/tuscany/sca/ main/java/org/apache/tuscany/sca/topology/ main/java/org/apache/tuscany/...

Author: slaws
Date: Tue Jun 19 08:16:57 2007
New Revision: 548761

URL: http://svn.apache.org/viewvc?view=rev&rev=548761
Log:
The XML based reader for the topology model
TUSCANY-1338

Added:
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java   (with props)
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/xml/
    incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/xml/runtime.topology

Added: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,283 @@
+/*
+ * 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.topology.xml;
+
+import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
+import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+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.Binding;
+import org.apache.tuscany.sca.assembly.Contract;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.topology.TopologyFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * A base class with utility methods for the other artifact processors in this module. 
+ * 
+ * @version $Rev$ $Date$
+ */
+public abstract class BaseArtifactProcessor implements Constants {
+
+    protected TopologyFactory               topologyFactory;
+    protected AssemblyFactory               assemblyFactory;    
+    protected StAXArtifactProcessor<Object> extensionProcessor;
+
+    private static final DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
+    static {
+        domFactory.setNamespaceAware(true);
+    }
+
+    /**
+     * Construct a new BaseArtifactProcessor.
+     * @param factory
+     * @param policyFactory
+     */
+    @SuppressWarnings("unchecked")
+    public BaseArtifactProcessor(TopologyFactory topologyFactory, AssemblyFactory assemblyFactory, StAXArtifactProcessor extensionProcessor) {
+        this.topologyFactory = topologyFactory;
+        this.assemblyFactory = assemblyFactory;
+        this.extensionProcessor = (StAXArtifactProcessor<Object>)extensionProcessor;
+    }
+
+    /**
+     * Returns the string value of an attribute.
+     * @param reader
+     * @param name
+     * @return
+     */
+    protected String getString(XMLStreamReader reader, String name) {
+        return reader.getAttributeValue(null, name);
+    }
+
+    /**
+     * Returns the qname value of an attribute.
+     * @param reader
+     * @param name
+     * @return
+     */
+    protected QName getQName(XMLStreamReader reader, String name) {
+        String qname = reader.getAttributeValue(null, name);
+        return getQNameValue(reader, qname);
+    }
+
+    /**
+     * Returns the value of xsi:type attribute
+     * @param reader The XML stream reader
+     * @return The QName of the type, if the attribute is not present, null is
+     *         returned.
+     */
+    protected QName getXSIType(XMLStreamReader reader) {
+        String qname = reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "type");
+        return getQNameValue(reader, qname);
+    }
+
+    /**
+     * Returns a qname from a string.  
+     * @param reader
+     * @param value
+     * @return
+     */
+    protected QName getQNameValue(XMLStreamReader reader, String value) {
+        if (value != null) {
+            int index = value.indexOf(':');
+            String prefix = index == -1 ? "" : value.substring(0, index);
+            String localName = index == -1 ? value : value.substring(index + 1);
+            String ns = reader.getNamespaceContext().getNamespaceURI(prefix);
+            if (ns == null) {
+                ns = "";
+            }
+            return new QName(ns, localName, prefix);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Returns the boolean value of an attribute.
+     * @param reader
+     * @param name
+     * @return
+     */
+    protected boolean getBoolean(XMLStreamReader reader, String name) {
+        String value = reader.getAttributeValue(null, name);
+        if (value == null) {
+            value = Boolean.toString(false);
+        }
+        return Boolean.valueOf(value);
+    }
+
+    /**
+     * Returns the value of an attribute as a list of qnames.
+     * @param reader
+     * @param name
+     * @return
+     */
+    protected List<QName> getQNames(XMLStreamReader reader, String name) {
+        String value = reader.getAttributeValue(null, name);
+        if (value != null) {
+            List<QName> qnames = new ArrayList<QName>();
+            for (StringTokenizer tokens = new StringTokenizer(value); tokens.hasMoreTokens();) {
+                qnames.add(getQName(reader, tokens.nextToken()));
+            }
+            return qnames;
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * Start an element.
+     * @param uri
+     * @param name
+     * @param attrs
+     * @throws XMLStreamException
+     */
+    protected void writeStart(XMLStreamWriter writer, String uri, String name, XAttr... attrs) throws XMLStreamException {
+        writer.writeStartElement(uri, name);
+        writeAttributes(writer, attrs);
+    }
+
+    /**
+     * Start an element.
+     * @param writer
+     * @param name
+     * @param attrs
+     * @throws XMLStreamException
+     */
+    protected void writeStart(XMLStreamWriter writer, String name, XAttr... attrs) throws XMLStreamException {
+        writer.writeStartElement(TUSCANY_TOPOLOGY_10_NS, name);
+        writeAttributes(writer, attrs);
+    }
+
+    /**
+     * End an element. 
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void writeEnd(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeEndElement();
+    }
+
+    /**
+     * Start a document.
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void writeStartDocument(XMLStreamWriter writer, String name, XAttr... attrs) throws XMLStreamException {
+        writer.writeStartDocument();
+        writer.setDefaultNamespace(TUSCANY_TOPOLOGY_10_NS);
+        writeStart(writer, name, attrs);
+        writer.writeDefaultNamespace(TUSCANY_TOPOLOGY_10_NS);
+    }
+    
+    /**
+     * End a document.
+     * @param writer
+     * @throws XMLStreamException
+     */
+    protected void writeEndDocument(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeEndDocument();
+    }
+
+    /**
+     * Write attributes to the current element.
+     * @param writer
+     * @param attrs
+     * @throws XMLStreamException
+     */
+    protected void writeAttributes(XMLStreamWriter writer, XAttr... attrs) throws XMLStreamException {
+        for (XAttr attr : attrs) {
+            if (attr != null)
+                attr.write(writer);
+        }
+    }
+    
+    /**
+     * Resolve an implementation.
+     * @param implementation
+     * @param resolver
+     * @return
+     * @throws ContributionResolveException
+     */
+    protected Implementation resolveImplementation(Implementation implementation, ModelResolver resolver) throws ContributionResolveException {
+        if (implementation != null) {
+            if (implementation.isUnresolved()) {
+                implementation = resolver.resolveModel(Implementation.class, implementation);
+
+                // Lazily resolve implementations
+                if (implementation.isUnresolved()) {
+                    extensionProcessor.resolve(implementation, resolver);
+                    if (!implementation.isUnresolved()) {
+                        resolver.addModel(implementation);
+                    }
+                }
+            }
+        }
+        return implementation;
+    }
+
+    /**
+     * Resolve interface, callback interface and bindings on a list of contracts.
+     * @param contracts the list of contracts
+     * @param resolver the resolver to use to resolve models
+     */
+    protected <C extends Contract> void resolveContracts(List<C> contracts, ModelResolver resolver) throws ContributionResolveException {
+        for (Contract contract: contracts) {
+
+            // Resolve the interface contract
+            InterfaceContract interfaceContract = contract.getInterfaceContract();
+            if (interfaceContract != null) {
+                extensionProcessor.resolve(interfaceContract, resolver);
+            }
+
+            // Resolve bindings
+            for (int i = 0, n = contract.getBindings().size(); i < n; i++) {
+                Binding binding = contract.getBindings().get(i);
+                extensionProcessor.resolve(binding, resolver);
+            }
+        }
+    }    
+
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/BaseArtifactProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,48 @@
+/*
+ * 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.topology.xml;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Constants used in Tuscany Topology XML files.
+ */
+public interface Constants {
+   
+    String TUSCANY_TOPOLOGY_10_NS = "http://www.apache.org/tuscany/topology/1.0";
+    
+    String RUNTIME = "runtime";
+    QName RUNTIME_QNAME = new QName(TUSCANY_TOPOLOGY_10_NS, RUNTIME);    
+    String NODE = "node";
+    QName NODE_QNAME = new QName(TUSCANY_TOPOLOGY_10_NS, NODE);
+    String DOMAIN = "domain";
+    QName DOMAIN_QNAME = new QName(TUSCANY_TOPOLOGY_10_NS, DOMAIN);    
+    String SCHEME = "scheme";
+    QName SCHEME_QNAME = new QName(TUSCANY_TOPOLOGY_10_NS, SCHEME);
+    String COMPONENT = "component";
+    QName COMPONENT_QNAME = new QName(TUSCANY_TOPOLOGY_10_NS, COMPONENT);
+   
+    
+    String TARGET_NAMESPACE = "targetNamespace";
+    String NAME = "name";
+    String BASE_URL = "baseURL";    
+    String DEFAULT_DOMAIN = "nodomain"; 
+
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/Constants.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,93 @@
+/*
+ * 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.topology.xml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+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.topology.Runtime;
+
+/**
+ * A composite processor.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TopologyDocumentProcessor extends BaseArtifactProcessor implements URLArtifactProcessor<Runtime> {
+    private XMLInputFactory inputFactory;
+
+    /**
+     * Construct a new composite processor
+     * @param assemblyFactory
+     * @param policyFactory
+     * @param staxProcessor
+     */
+    public TopologyDocumentProcessor(StAXArtifactProcessor staxProcessor, XMLInputFactory inputFactory) {
+        super(null, null, staxProcessor);
+        this.inputFactory = inputFactory;
+    }
+
+    public Runtime read(URL contributionURL, URI uri, URL url) throws ContributionReadException {
+        InputStream urlStream = null;
+        try {
+            urlStream = url.openStream();
+            XMLStreamReader reader = inputFactory.createXMLStreamReader(urlStream);
+            reader.nextTag();
+            Runtime node = (Runtime)extensionProcessor.read(reader);
+            return node;
+            
+        } catch (XMLStreamException e) {
+            throw new ContributionReadException(e);
+        } catch (IOException e) {
+            throw new ContributionReadException(e);
+        } finally {
+            try {
+                if (urlStream != null) {
+                    urlStream.close();
+                    urlStream = null;
+                }
+            } catch (IOException ioe) {
+                //ignore
+            }
+        }
+    }
+    
+    public void resolve(Runtime node, ModelResolver resolver) throws ContributionResolveException {
+        extensionProcessor.resolve(node, resolver);
+    }
+
+    public String getArtifactType() {
+        return ".topology";
+    }
+    
+    public Class<Runtime> getModelType() {
+        return Runtime.class;
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyDocumentProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,194 @@
+/*
+ * 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.topology.xml;
+
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+
+import java.util.StringTokenizer;
+
+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.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.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.topology.Node;
+import org.apache.tuscany.sca.topology.Runtime;
+import org.apache.tuscany.sca.topology.Scheme;
+import org.apache.tuscany.sca.topology.Component;
+import org.apache.tuscany.sca.topology.TopologyFactory;
+
+/**
+ * A composite processor.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TopologyProcessor extends BaseArtifactProcessor implements StAXArtifactProcessor<Runtime> {
+    
+    /**
+     * Construct a new composite processor
+     * @param assemblyFactory
+     * @param policyFactory
+     * @param extensionProcessor 
+     */
+    public TopologyProcessor(TopologyFactory topologyFactory,
+                             AssemblyFactory assemblyFactory,
+                             StAXArtifactProcessor extensionProcessor) {
+        super(topologyFactory, assemblyFactory, extensionProcessor);
+    }
+    
+    public Runtime read(XMLStreamReader reader) throws ContributionReadException {
+        QName name = null;
+        Runtime runtime = null;
+        Node node = null;
+        String domainName = DEFAULT_DOMAIN;
+      
+        try {
+            
+            // Read the composite document
+            while (reader.hasNext()) {
+                int event = reader.getEventType();
+                switch (event) {
+                    case START_ELEMENT:
+                        name = reader.getName();
+                        
+                        if (RUNTIME_QNAME.equals(name)) {
+                            // Read a <runtime>
+                            runtime = topologyFactory.createRuntime();
+                        } else if (NODE_QNAME.equals(name)) {
+                            // Read a <node>
+                            node = topologyFactory.createNode();
+                            node.setName(getString(reader, NAME));
+                            
+                            // add node to runtime
+                            runtime.getNodes().add(node);
+                            
+                            // reset domain name to the default
+                            domainName = DEFAULT_DOMAIN;
+                        } else if (DOMAIN_QNAME.equals(name)) {
+                            // Read a <domain>
+                            domainName = getString(reader, NAME);                            
+                        } else if (SCHEME_QNAME.equals(name)) {
+                            // Read a <scheme>
+                            Scheme scheme = topologyFactory.createScheme();
+                            scheme.setName(getString(reader, NAME));
+                            scheme.setBaseURL(getString(reader, BASE_URL));
+                            
+                            scheme.setDomainName(domainName);
+                            
+                            // Add scheme to the node
+                            node.getSchemes(domainName).add(scheme);
+                        } else if (COMPONENT_QNAME.equals(name)) {
+                            // Read a <component>
+                            Component component = topologyFactory.createComponent();
+                            component.setName(getString(reader, NAME));
+                            
+                            component.setDomainName(domainName);
+                            
+                            // Add scheme to the node
+                            node.getComponents(domainName).add(component);                            
+
+                        } else {
+                            
+                            // Read an extension element
+                            Object extension = extensionProcessor.read(reader);
+                            
+                            if (extension != null) {
+                                // no extensions are supported
+                            }
+                        }
+    
+                    case END_ELEMENT:
+                        name = reader.getName();
+                        // Clear current state when reading reaching end element                
+                }
+                
+                if (reader.hasNext()) {
+                    reader.next();
+                }
+            }
+            return runtime;
+                        
+        } catch (XMLStreamException e) {
+            throw new ContributionReadException(e);
+        }        
+    }
+
+    
+    public void write(Runtime runtime, XMLStreamWriter writer) throws ContributionWriteException {
+        try {
+            writeStartDocument(writer, RUNTIME);
+            
+            // TODO - write out the scheme definitions
+    
+            for (Node node : runtime.getNodes()) {
+                writeStart(writer, NODE, new XAttr(NAME, node.getName()));
+               
+    
+                for (String domainName : node.getDomainNames()) {
+                    
+                    writeStart(writer, DOMAIN, new XAttr(NAME, domainName));
+                   
+                    for (Scheme scheme: node.getSchemes(domainName)) {
+                        writeStart(writer, SCHEME, new XAttr(NAME, scheme.getName()), new XAttr(BASE_URL, scheme.getBaseURL()));
+                        writeEnd(writer);
+                    }
+                    
+                    for (Component component: node.getComponents(domainName)) {
+                        writeStart(writer, COMPONENT, new XAttr(NAME, component.getName()));
+                        writeEnd(writer);
+                    }                    
+                    
+                    writeEnd(writer);
+                }
+      
+                writeEnd(writer);
+            }
+       
+            writeEndDocument(writer);
+            
+        } catch (XMLStreamException e) {
+            throw new ContributionWriteException(e);
+        }
+    }
+    
+    public void resolve(Runtime runtime, ModelResolver resolver) throws ContributionResolveException {
+        // no resolution steps defined 
+    }
+
+    public QName getArtifactType() {
+        return RUNTIME_QNAME;
+    }
+    
+    public Class<Runtime> getModelType() {
+        return Runtime.class;
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/TopologyProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,122 @@
+/*
+ * 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.topology.xml;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+
+/**
+ * Represents an XML attribute that needs to be written to a document.
+ *
+ * @version $Rev$ $Date$
+ */
+class XAttr {
+
+    String uri = Constants.TUSCANY_TOPOLOGY_10_NS;
+    String name;
+    Object value;
+
+    public XAttr(String uri, String name, String value) {
+        this.uri = uri;
+        this.name = name;
+        this.value = value;
+    }
+
+    public XAttr(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public XAttr(String uri, String name, boolean value) {
+        this.uri = uri;
+        this.name = name;
+        this.value = value;
+    }
+
+    public XAttr(String name, boolean value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public XAttr(String uri, String name, QName value) {
+        this.uri = uri;
+        this.name = name;
+        this.value = value;
+    }
+
+    public XAttr(String name, QName value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    /**
+     * Writes a string from a qname and registers a prefix for its namespace.  
+     * @param reader
+     * @param value
+     * @return
+     */
+    protected String writeQNameValue(XMLStreamWriter writer, QName qname) throws XMLStreamException {
+        if (qname != null) {
+            String prefix = qname.getPrefix();
+            String uri = qname.getNamespaceURI();
+            prefix = writer.getPrefix(uri);
+            if (prefix != null) {
+
+                // Use the prefix already bound to the given uri
+                return prefix + ":" + qname.getLocalPart();
+            } else {
+                
+                // Find an available prefix and bind it to the given uri 
+                NamespaceContext nsc = writer.getNamespaceContext();
+                for (int i=1; ; i++) {
+                    prefix = "ns" + i;
+                    if (nsc.getNamespaceURI(prefix) == null) {
+                        break;
+                    }
+                }
+                writer.setPrefix(prefix, uri);
+                writer.writeNamespace(prefix, uri);
+                return prefix + ":" + qname.getLocalPart();
+            }
+        } else {
+            return null;
+        }
+    }
+
+    void write(XMLStreamWriter writer) throws XMLStreamException {
+        if (value != null) {
+            String str;
+            if (value instanceof QName) {
+                str = writeQNameValue(writer, (QName)value);
+            } else {
+                str = String.valueOf(value);
+            }
+            if (uri != null && !uri.equals(Constants.TUSCANY_TOPOLOGY_10_NS)) {
+                writer.writeAttribute(uri, name, str);
+            } else {
+                writer.writeAttribute(name,str);
+            }
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/main/java/org/apache/tuscany/sca/topology/xml/XAttr.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,99 @@
+/*
+ * 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.topology.xml;
+
+import java.net.URL;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory;
+import org.apache.tuscany.sca.assembly.xml.ComponentTypeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.ComponentTypeProcessor;
+import org.apache.tuscany.sca.assembly.xml.ConstrainingTypeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.ConstrainingTypeProcessor;
+import org.apache.tuscany.sca.contribution.processor.DefaultStAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.DefaultURLArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl;
+import org.apache.tuscany.sca.policy.DefaultPolicyFactory;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.topology.DefaultTopologyFactory;
+import org.apache.tuscany.sca.topology.Node;
+import org.apache.tuscany.sca.topology.Runtime;
+import org.apache.tuscany.sca.topology.Scheme;
+import org.apache.tuscany.sca.topology.Component;
+import org.apache.tuscany.sca.topology.TopologyFactory;
+
+/**
+ * Test reading SCA XML assembly documents.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class ReadDocumentTestCase extends TestCase {
+
+    private ExtensibleURLArtifactProcessor documentProcessor;
+    private TestModelResolver resolver; 
+
+    public void setUp() throws Exception {
+        AssemblyFactory factory = new DefaultAssemblyFactory();
+        TopologyFactory topologyFactory = new DefaultTopologyFactory();
+        
+        URLArtifactProcessorExtensionPoint documentProcessors = new DefaultURLArtifactProcessorExtensionPoint();
+        documentProcessor = new ExtensibleURLArtifactProcessor(documentProcessors); 
+        
+        // Create Stax processors
+        DefaultStAXArtifactProcessorExtensionPoint staxProcessors = new DefaultStAXArtifactProcessorExtensionPoint();
+        ExtensibleStAXArtifactProcessor staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, XMLInputFactory.newInstance(), XMLOutputFactory.newInstance());
+        staxProcessors.addArtifactProcessor(new TopologyProcessor(topologyFactory, factory, staxProcessor));        
+        
+        // Create document processors
+        XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
+        documentProcessors.addArtifactProcessor(new TopologyDocumentProcessor(staxProcessor, inputFactory));
+
+        resolver = new TestModelResolver(getClass().getClassLoader());
+    }
+
+    public void tearDown() throws Exception {
+        documentProcessor = null;
+        resolver = null;
+    }
+
+    public void testReadTopology() throws Exception {
+        URL url = getClass().getResource("runtime.topology");
+        Runtime runtime = (Runtime)documentProcessor.read(null, null, url);
+        assertNotNull(runtime);
+        
+        Node node0 = runtime.getNodes().get(0);
+        Scheme scheme0 = node0.getSchemes("nodomain").get(0);
+        assertEquals(scheme0.getName(), "http");
+        
+        Node node1 = runtime.getNodes().get(1);
+        Component component0 = node1.getComponents("domainA").get(0);
+        assertEquals(component0.getName(), "AddServiceComponent");
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/ReadDocumentTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java Tue Jun 19 08:16:57 2007
@@ -0,0 +1,63 @@
+/*
+ * 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.topology.xml;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+
+
+/**
+ * A default implementation of an artifact resolver, based on a map.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestModelResolver implements ModelResolver {
+    private static final long serialVersionUID = -7826976465762296634L;
+    
+    private Map<Object, Object> map = new HashMap<Object, Object>();
+    
+    public TestModelResolver(ClassLoader classLoader) {
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        Object resolved = map.get(unresolved);
+        if (resolved != null) {
+            
+            // Return the resolved object
+            return modelClass.cast(resolved);
+            
+        } else {
+            
+            // Return the unresolved object
+            return unresolved;
+        }
+    }
+    
+    public void addModel(Object resolved) {
+        map.put(resolved, resolved);
+    }
+    
+    public Object removeModel(Object resolved) {
+        return map.remove(resolved);
+    }
+    
+}

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/topology-xml/src/test/java/org/apache/tuscany/sca/topology/xml/TestModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/xml/runtime.topology
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/xml/runtime.topology?view=auto&rev=548761
==============================================================================
--- incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/xml/runtime.topology (added)
+++ incubator/tuscany/java/sca/modules/topology-xml/src/test/resources/org/apache/tuscany/sca/topology/xml/runtime.topology Tue Jun 19 08:16:57 2007
@@ -0,0 +1,35 @@
+<?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.    
+-->
+
+<runtime xmlns="http://www.apache.org/tuscany/topology/1.0">
+    <node name="nodeA">
+        <scheme name="http" baseURL="http://localhost:80" /> 
+        <scheme name="https" baseURL="https://localhost:443" />
+        <component name="CalculatorServiceComponent" />
+    </node>
+    <node name="nodeB">
+        <domain name="domainA">
+            <scheme name="http" baseURL="http://localhost:81" /> 
+            <scheme name="https" baseURL="https://localhost:444" />
+            <component name="AddServiceComponent" />
+        </domain>
+    </node>    
+</runtime>
+



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org