You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2008/04/25 18:12:55 UTC

svn commit: r651636 [1/2] - in /incubator/tuscany/java/sca: distribution/bundle/ distribution/manifest/ itest/osgi-tuscany/tuscany-runtime/ modules/ modules/domain-manager/ modules/domain-manager/src/ modules/domain-manager/src/main/java/org/apache/tus...

Author: jsdelfino
Date: Fri Apr 25 09:12:51 2008
New Revision: 651636

URL: http://svn.apache.org/viewvc?rev=651636&view=rev
Log:
Renamed module workspace-admin to domain-manager, adjusted references to it.

Added:
    incubator/tuscany/java/sca/modules/domain-manager/
      - copied from r651440, incubator/tuscany/java/sca/modules/workspace-admin/
    incubator/tuscany/java/sca/modules/domain-manager/DISCLAIMER
      - copied unchanged from r651633, incubator/tuscany/java/sca/modules/workspace-admin/DISCLAIMER
    incubator/tuscany/java/sca/modules/domain-manager/LICENSE
      - copied unchanged from r651633, incubator/tuscany/java/sca/modules/workspace-admin/LICENSE
    incubator/tuscany/java/sca/modules/domain-manager/NOTICE
      - copied unchanged from r651633, incubator/tuscany/java/sca/modules/workspace-admin/NOTICE
    incubator/tuscany/java/sca/modules/domain-manager/pom.xml
      - copied, changed from r651633, incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
    incubator/tuscany/java/sca/modules/domain-manager/src/
      - copied from r651633, incubator/tuscany/java/sca/modules/workspace-admin/src/
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DomainAdminUtil.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileCollectionImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileServiceImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/NodeProcessCollectionFacadeImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/QuickStartServiceImpl.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/launcher/
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/launcher/DomainManagerLauncherBootstrap.java   (with props)
    incubator/tuscany/java/sca/modules/domain-manager/src/test/java/org/apache/tuscany/sca/workspace/manager/
    incubator/tuscany/java/sca/modules/domain-manager/src/test/java/org/apache/tuscany/sca/workspace/manager/impl/
    incubator/tuscany/java/sca/modules/domain-manager/src/test/java/org/apache/tuscany/sca/workspace/manager/impl/AdminTestCase.java   (with props)
Removed:
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/workspace/admin/launcher/
    incubator/tuscany/java/sca/modules/domain-manager/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/
    incubator/tuscany/java/sca/modules/workspace-admin/
Modified:
    incubator/tuscany/java/sca/distribution/bundle/pom.xml
    incubator/tuscany/java/sca/distribution/manifest/pom.xml
    incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-runtime/pom.xml
    incubator/tuscany/java/sca/modules/domain-manager/src/main/resources/DomainManager.composite
    incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java
    incubator/tuscany/java/sca/modules/pom.xml
    incubator/tuscany/java/sca/samples/calculator-distributed/pom.xml
    incubator/tuscany/java/sca/tutorial/domain/pom.xml

Modified: incubator/tuscany/java/sca/distribution/bundle/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/distribution/bundle/pom.xml?rev=651636&r1=651635&r2=651636&view=diff
==============================================================================
--- incubator/tuscany/java/sca/distribution/bundle/pom.xml (original)
+++ incubator/tuscany/java/sca/distribution/bundle/pom.xml Fri Apr 25 09:12:51 2008
@@ -445,7 +445,7 @@
         </dependency>
         <dependency>
             <groupId>${pom.groupId}</groupId>
-            <artifactId>tuscany-workspace-admin</artifactId>
+            <artifactId>tuscany-domain-manager</artifactId>
             <version>${pom.version}</version>
         </dependency>
         <dependency>

Modified: incubator/tuscany/java/sca/distribution/manifest/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/distribution/manifest/pom.xml?rev=651636&r1=651635&r2=651636&view=diff
==============================================================================
--- incubator/tuscany/java/sca/distribution/manifest/pom.xml (original)
+++ incubator/tuscany/java/sca/distribution/manifest/pom.xml Fri Apr 25 09:12:51 2008
@@ -523,7 +523,7 @@
         </dependency>
         <dependency>
             <groupId>${pom.groupId}</groupId>
-            <artifactId>tuscany-workspace-admin</artifactId>
+            <artifactId>tuscany-domain-manager</artifactId>
             <version>${pom.version}</version>
         </dependency>
         <dependency>

Modified: incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-runtime/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-runtime/pom.xml?rev=651636&r1=651635&r2=651636&view=diff
==============================================================================
--- incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-runtime/pom.xml (original)
+++ incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-runtime/pom.xml Fri Apr 25 09:12:51 2008
@@ -152,7 +152,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-workspace-admin</artifactId>
+            <artifactId>tuscany-domain-manager</artifactId>
             <version>2.0-incubating-SNAPSHOT</version>
         </dependency>
         <dependency>

Copied: incubator/tuscany/java/sca/modules/domain-manager/pom.xml (from r651633, incubator/tuscany/java/sca/modules/workspace-admin/pom.xml)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/pom.xml?p2=incubator/tuscany/java/sca/modules/domain-manager/pom.xml&p1=incubator/tuscany/java/sca/modules/workspace-admin/pom.xml&r1=651633&r2=651636&rev=651636&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/domain-manager/pom.xml Fri Apr 25 09:12:51 2008
@@ -25,8 +25,8 @@
         <version>2.0-incubating-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
-    <artifactId>tuscany-workspace-admin</artifactId>
-    <name>Apache Tuscany SCA Domain Workspace Manager</name>
+    <artifactId>tuscany-domain-manager</artifactId>
+    <name>Apache Tuscany SCA Domain Manager Application</name>
 
     <dependencies>
         <dependency>

Added: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java?rev=651636&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java (added)
+++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java Fri Apr 25 09:12:51 2008
@@ -0,0 +1,171 @@
+/*
+ * 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.domain.manager.impl;
+
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeQName;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeTitle;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.contributionURI;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.implementation.data.collection.Entry;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+import org.apache.tuscany.sca.implementation.data.collection.ItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Implementation of a composite install image collection service. 
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={ItemCollection.class, LocalItemCollection.class, Servlet.class})
+public class CompositeImageCollectionImpl extends HttpServlet implements ItemCollection, LocalItemCollection, Servlet {
+    private static final long serialVersionUID = 1L;
+
+    private final static Logger logger = Logger.getLogger(CompositeImageCollectionImpl.class.getName());    
+
+    @Reference
+    public LocalItemCollection contributionCollection;
+    
+    @Reference
+    public LocalItemCollection cloudCollection;
+    
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() {
+    }
+    
+    public Entry<String, Item>[] getAll() {
+        throw new UnsupportedOperationException();
+    }
+
+    public Item get(String key) throws NotFoundException {
+        throw new UnsupportedOperationException();
+    }
+
+    public String post(String key, Item item) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void put(String key, Item item) throws NotFoundException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void delete(String key) throws NotFoundException {
+        throw new UnsupportedOperationException();
+    }
+    
+    public Entry<String, Item>[] query(String queryString) {
+        logger.info("query " + queryString);
+        
+        if (queryString.startsWith("composite=")) {
+
+            // Expecting a key in the form:
+            // composite:contributionURI;namespace;localName
+            int e = queryString.indexOf('=');
+            String key = queryString.substring(e + 1);
+            String contributionURI = contributionURI(key);
+            QName qname = compositeQName(key);
+            
+            // Return a collection containing the following entries:
+            // the resolved version of the specified composite
+            // the required contributions
+            List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+            
+            // Add the resolved composite entry
+            Entry<String, Item> compositeEntry = new Entry<String, Item>();
+            Item compositeItem = new Item();
+            compositeItem.setTitle(compositeTitle(contributionURI, qname));
+            compositeItem.setLink("/composite-resolved/" + key);
+            compositeEntry.setKey(key);
+            compositeEntry.setData(compositeItem);
+            entries.add(compositeEntry);
+            
+            // Get the collection of required contributions
+            Entry<String, Item>[] contributionEntries = contributionCollection.query("alldependencies=" + contributionURI);
+            for (Entry<String, Item> entry: contributionEntries) {
+                Item item = entry.getData();
+                item.setContents(null);
+                entries.add(entry);
+            }
+
+            return entries.toArray(new Entry[entries.size()]);
+            
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+        String key = path.startsWith("/")? path.substring(1) : path;
+        logger.info("get " + key);
+        
+        // The key contains a node name, redirect 
+        // to the corresponding composite image
+            
+        // Get the collection of cloud composites
+        Entry<String, Item>[] cloudEntries = cloudCollection.getAll();
+
+        // Find the specified node
+        for (Entry<String, Item> cloudEntry: cloudEntries) {
+            QName qname = compositeQName(cloudEntry.getKey());
+            if (qname.getLocalPart().equals(key)) {
+                
+                // Found the specified node
+                String related = cloudEntry.getData().getRelated();
+                int i = related.indexOf("composite:");
+                if (i != -1) {
+                    
+                    // Redirect to its composite image
+                    String compositeImage = "/composite-image/?composite=" + related.substring(i);
+                    response.sendRedirect(compositeImage);
+                    return;
+                }
+            }
+        }
+        
+        // Node not found
+        response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+        return;
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeImageCollectionImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java?rev=651636&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java (added)
+++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java Fri Apr 25 09:12:51 2008
@@ -0,0 +1,529 @@
+/*
+ * 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.domain.manager.impl;
+
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.DEPLOYMENT_CONTRIBUTION_URI;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeSimpleTitle;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeSourceLink;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.locationURL;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+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.CompositeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.CompositeProcessor;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+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.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.DefaultModelResolverExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
+import org.apache.tuscany.sca.contribution.xml.ContributionGeneratedMetadataDocumentProcessor;
+import org.apache.tuscany.sca.contribution.xml.ContributionMetadataDocumentProcessor;
+import org.apache.tuscany.sca.contribution.xml.ContributionMetadataProcessor;
+import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.implementation.data.collection.Entry;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+import org.apache.tuscany.sca.implementation.data.collection.ItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.workspace.WorkspaceFactory;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilder;
+import org.apache.tuscany.sca.workspace.builder.impl.ContributionDependencyBuilderImpl;
+import org.apache.tuscany.sca.workspace.processor.impl.ContributionInfoProcessor;
+import org.apache.tuscany.sca.workspace.xml.WorkspaceProcessor;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.osoa.sca.ServiceRuntimeException;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Property;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+import org.w3c.dom.Document;
+
+/**
+ * Implementation of a contribution collection service component. 
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={ItemCollection.class, LocalItemCollection.class, Servlet.class})
+public class ContributionCollectionImpl extends HttpServlet implements ItemCollection, LocalItemCollection {
+    private static final long serialVersionUID = -4759297945439322773L;
+
+    private final static Logger logger = Logger.getLogger(ContributionCollectionImpl.class.getName());    
+
+    @Property
+    public String workspaceFile;
+    
+    @Property
+    public String deploymentContributionDirectory;
+    
+    private ExtensionPointRegistry extensionPoints;
+    private Monitor monitor;
+    private ContributionFactory contributionFactory;
+    private AssemblyFactory assemblyFactory;
+    private WorkspaceFactory workspaceFactory;
+    private StAXArtifactProcessor<Object> staxProcessor;
+    private URLArtifactProcessor<Object> urlProcessor;
+    private URLArtifactProcessor<Contribution> contributionInfoProcessor;
+    private XMLInputFactory inputFactory;
+    private XMLOutputFactory outputFactory;
+    private DocumentBuilder documentBuilder;
+    
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() throws ParserConfigurationException {
+        
+        extensionPoints = new DefaultExtensionPointRegistry();
+        
+        // Create a validation monitor
+        UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+        MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class);
+        monitor = monitorFactory.createMonitor();
+        
+        
+        // Create model factories
+        ModelFactoryExtensionPoint modelFactories = new DefaultModelFactoryExtensionPoint();
+        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
+        contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+        assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+        workspaceFactory = modelFactories.getFactory(WorkspaceFactory.class);
+        PolicyFactory policyFactory = modelFactories.getFactory(PolicyFactory.class);
+        
+        // Create model resolvers
+        ModelResolverExtensionPoint modelResolvers = new DefaultModelResolverExtensionPoint();
+
+        // Create artifact processors
+        inputFactory = modelFactories.getFactory(XMLInputFactory.class);
+        StAXArtifactProcessorExtensionPoint staxProcessors = new DefaultStAXArtifactProcessorExtensionPoint(modelFactories);
+        staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory);
+        staxProcessors.addArtifactProcessor(new ContributionMetadataProcessor(assemblyFactory, contributionFactory, staxProcessor));
+        staxProcessors.addArtifactProcessor(new WorkspaceProcessor(workspaceFactory, contributionFactory, staxProcessor));
+        staxProcessors.addArtifactProcessor(new CompositeProcessor(contributionFactory, assemblyFactory, policyFactory, staxProcessor));
+
+        URLArtifactProcessorExtensionPoint urlProcessors = new DefaultURLArtifactProcessorExtensionPoint(modelFactories);
+        urlProcessor = new ExtensibleURLArtifactProcessor(urlProcessors);
+        urlProcessors.addArtifactProcessor(new ContributionMetadataDocumentProcessor(staxProcessor, inputFactory));
+        urlProcessors.addArtifactProcessor(new ContributionGeneratedMetadataDocumentProcessor(staxProcessor, inputFactory));
+        urlProcessors.addArtifactProcessor(new CompositeDocumentProcessor(staxProcessor, inputFactory, null));
+        
+        // Create contribution info processor
+        contributionInfoProcessor = new ContributionInfoProcessor(modelFactories, modelResolvers, urlProcessor);
+
+        // Create a document builder (used to pretty print XML)
+        documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+    }
+    
+    public Entry<String, Item>[] getAll() {
+        logger.info("getAll");
+
+        // Return all the contributions
+        List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+        Workspace workspace = readContributions(readWorkspace());
+        
+        for (Contribution contribution: workspace.getContributions()) {
+            if (contribution.getURI().equals(DEPLOYMENT_CONTRIBUTION_URI)) {
+                continue;
+            }
+            entries.add(entry(workspace, contribution));
+        }
+        return entries.toArray(new Entry[entries.size()]);
+    }
+
+    public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
+
+        // Returns the contribution with the given URI key
+        Workspace workspace = readContributions(readWorkspace());
+        for (Contribution contribution: workspace.getContributions()) {
+            if (key.equals(contribution.getURI())) {
+                return item(workspace, contribution);
+            }
+        }
+        throw new NotFoundException(key);
+    }
+    
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+
+        // The key is the contribution URI
+        String key = path.startsWith("/")? path.substring(1) : path;
+        logger.info("get " + key);
+        
+        // Get the item describing the composite
+        Item item;
+        try {
+            item = get(key);
+        } catch (NotFoundException e) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+            return;
+        }
+
+        // Redirect to the actual contribution location
+        response.sendRedirect("/files/" + item.getAlternate());
+    }
+
+    public String post(String key, Item item) {
+        logger.info("post " + key);
+        
+        // Adds a new contribution to the workspace
+        Workspace workspace = readWorkspace();
+        Contribution contribution = contributionFactory.createContribution();
+        contribution.setURI(key);
+        try {
+            contribution.setLocation(locationURL(item.getLink()).toString());
+        } catch (MalformedURLException e) {
+            throw new ServiceRuntimeException(e);
+        }
+        workspace.getContributions().add(contribution);
+        
+        // Write the workspace
+        writeWorkspace(workspace);
+        
+        return key;
+    }
+
+    public void put(String key, Item item) throws NotFoundException {
+        
+        // Update a contribution already in the workspace
+        Workspace workspace = readWorkspace();
+        Contribution newContribution = contributionFactory.createContribution();
+        newContribution.setURI(key);
+        try {
+            newContribution.setLocation(locationURL(item.getLink()).toString());
+        } catch (MalformedURLException e) {
+            throw new ServiceRuntimeException(e);
+        }
+        List<Contribution> contributions = workspace.getContributions();
+        for (int i = 0, n = contributions.size(); i < n; i++) {
+            if (contributions.get(i).getURI().equals(key)) {
+                contributions.set(i, newContribution);
+                
+                // Write the workspace
+                writeWorkspace(workspace);
+                return;
+            }
+        }
+        throw new NotFoundException(key);
+    }
+
+    public void delete(String key) throws NotFoundException {
+        logger.info("delete " + key);
+        
+        // Delete a contribution from the workspace
+        Workspace workspace = readWorkspace();
+        List<Contribution> contributions = workspace.getContributions();
+        for (int i = 0, n = contributions.size(); i < n; i++) {
+            if (contributions.get(i).getURI().equals(key)) {
+                contributions.remove(i);
+
+                // Write the workspace
+                writeWorkspace(workspace);
+                return;
+            }
+        }
+        throw new NotFoundException(key);
+    }
+
+    public Entry<String, Item>[] query(String queryString) {
+        logger.info("query " + queryString);
+        
+        if (queryString.startsWith("dependencies=") || queryString.startsWith("alldependencies=")) {
+
+            // Return the collection of dependencies of the specified contribution
+            List<Entry<String, Item>> entries = new ArrayList<Entry<String,Item>>();
+            
+            // Extract the contribution URI
+            int eq = queryString.indexOf('=');
+            String key = queryString.substring(eq+1);
+            
+            // Read the metadata for all the contributions
+            Workspace workspace = readContributions(readWorkspace());
+            
+            // Look for the specified contribution
+            for (Contribution contribution: workspace.getContributions()) {
+                if (key.equals(contribution.getURI())) {                
+
+                    // Compute the contribution dependencies
+                    ContributionDependencyBuilder analyzer = new ContributionDependencyBuilderImpl(monitor);
+                    List<Contribution> dependencies = analyzer.buildContributionDependencies(contribution, workspace);
+                    
+                    // Returns entries for the dependencies
+                    // optionally skip the specified contribution
+                    boolean allDependencies = queryString.startsWith("alldependencies=");
+                    for (Contribution dependency: dependencies) {
+                        if (!allDependencies && dependency == contribution) {
+                            // Skip the specified contribution
+                            continue;
+                        }
+                        entries.add(entry(workspace, dependency));
+                    }
+                    break;
+                }
+            }
+
+            return entries.toArray(new Entry[entries.size()]);
+            
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+    
+    /**
+     * Returns an entry representing a contribution
+     * @param contribution
+     * @return
+     */
+    private static Entry<String, Item> entry(Workspace workspace, Contribution contribution) {
+        Entry<String, Item> entry = new Entry<String, Item>();
+        entry.setKey(contribution.getURI());
+        entry.setData(item(workspace, contribution));
+        return entry;
+    }
+    
+    /**
+     * Returns an item representing a contribution.
+     * 
+     * @param contribution
+     * @return
+     */
+    private static Item item(Workspace workspace, Contribution contribution) {
+        String contributionURI = contribution.getURI();
+        Item item = new Item();
+        item.setTitle(title(contributionURI));
+        item.setLink(link(contributionURI));
+        item.setAlternate(contribution.getLocation());
+        
+        // List the contribution dependencies in the item contents
+        final List<String> problems = new ArrayList<String>();
+        Monitor monitor = new Monitor() {
+            public void problem(Problem problem) {
+                problems.add(problem.getMessageId() + " " + problem.getProblemObject().toString());
+            }
+        };
+        
+        StringBuffer sb = new StringBuffer();
+        ContributionDependencyBuilderImpl analyzer = new ContributionDependencyBuilderImpl(monitor);
+        List<Contribution> dependencies = analyzer.buildContributionDependencies(contribution, workspace);
+        if (dependencies.size() > 1) {
+            sb.append("Dependencies: <span id=\"dependencies\">");
+            for (int i = 0, n = dependencies.size(); i < n ; i++) {
+                if (i > 0) {
+                    sb.append("  ");
+                }
+                Contribution dependency = dependencies.get(i);
+                if (dependency != contribution) {
+                    String dependencyURI = dependency.getURI();
+                    sb.append("<a href=\""+ link(dependencyURI) +"\">" + title(dependencyURI) + "</a>");
+                }
+            }
+            sb.append("</span><br>");
+        }
+        
+        // List the deployables
+        List<Composite> deployables = contribution.getDeployables();
+        if (!deployables.isEmpty()) {
+            sb.append("Deployables: <span id=\"deployables\">");
+            for (int i = 0, n = deployables.size(); i < n ; i++) {
+                if (i > 0) {
+                    sb.append("  ");
+                }
+                Composite deployable = deployables.get(i);
+                QName qname = deployable.getName();
+                sb.append("<a href=\""+ compositeSourceLink(contributionURI, qname) +"\">" + compositeSimpleTitle(contributionURI, qname) + "</a>");
+            }
+            sb.append("</span><br>");
+        }
+        
+        // List the dependency problems
+        if (problems.size() > 1) {
+            sb.append("<span id=\"problems\" style=\"color: red\">");
+            for (int i = 0, n = problems.size(); i < n ; i++) {
+                sb.append("Problem: "+ problems.get(i) + "<br>");
+            }
+            sb.append("</span>");
+        }
+        
+        // Store in the item contents
+        item.setContents(sb.toString());
+        
+        return item;
+    }
+
+    /**
+     * Returns a link to a contribution.
+     * @param contributionURI
+     * @return
+     */
+    private static String link(String contributionURI) {
+        return "/contribution/" + contributionURI;
+    }
+    
+    /**
+     * Returns a title for the given contribution
+     * 
+     * @param contributionURI
+     * @return
+     */
+    private static String title(String contributionURI) {
+        return contributionURI;
+    }
+
+    
+    /**
+     * Read the workspace.
+     * 
+     * @return
+     */
+    private Workspace readWorkspace() {
+        Workspace workspace;
+        File file = new File(workspaceFile);
+        if (file.exists()) {
+            try {
+                FileInputStream is = new FileInputStream(file);
+                XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
+                reader.nextTag();
+                workspace = (Workspace)staxProcessor.read(reader);
+            } catch (Exception e) {
+                throw new ServiceRuntimeException(e);
+            }
+        } else {
+            workspace = workspaceFactory.createWorkspace();
+        }
+        
+        // Make sure that the workspace contains the cloud contribution
+        // The cloud contribution contains the composites describing the
+        // SCA nodes declared in the cloud
+        Contribution cloudContribution = null;
+        for (Contribution contribution: workspace.getContributions()) {
+            if (contribution.getURI().equals(DEPLOYMENT_CONTRIBUTION_URI)) {
+                cloudContribution = contribution;
+            }
+        }
+        if (cloudContribution == null) {
+            Contribution contribution = contributionFactory.createContribution();
+            contribution.setURI(DEPLOYMENT_CONTRIBUTION_URI);
+            File cloudDirectory = new File(deploymentContributionDirectory);
+            contribution.setLocation(cloudDirectory.toURI().toString());
+            workspace.getContributions().add(contribution);
+        }
+        return workspace;
+    }
+    
+    /**
+     * Write the workspace back to disk
+     * 
+     * @param workspace
+     */
+    private void writeWorkspace(Workspace workspace) {
+        try {
+            // First write to a byte stream
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
+            staxProcessor.write(workspace, writer);
+            
+            // Parse again to pretty format the document
+            Document document = documentBuilder.parse(new ByteArrayInputStream(bos.toByteArray()));
+            OutputFormat format = new OutputFormat();
+            format.setIndenting(true);
+            format.setIndent(2);
+            
+            // Write to workspace.xml
+            FileOutputStream os = new FileOutputStream(new File(workspaceFile));
+            XMLSerializer serializer = new XMLSerializer(os, format);
+            serializer.serialize(document);
+            os.close();
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+
+    /**
+     * Returns a workspace populated with the contribution info read from
+     * the contributions.
+     * 
+     * @param workspace
+     * @return
+     */
+    private Workspace readContributions(Workspace workspace) {
+        Workspace dependencyWorkspace = workspaceFactory.createWorkspace();
+        try {
+            for (Contribution c: workspace.getContributions()) {
+                URI uri = URI.create(c.getURI());
+                URL url = locationURL(c.getLocation());
+                Contribution contribution = (Contribution)contributionInfoProcessor.read(null, uri, url);
+                dependencyWorkspace.getContributions().add(contribution);
+            }
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+        return dependencyWorkspace;
+    }
+    
+}

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java?rev=651636&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java (added)
+++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java Fri Apr 25 09:12:51 2008
@@ -0,0 +1,662 @@
+/*
+ * 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.domain.manager.impl;
+
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeAlternateLink;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeKey;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeQName;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeSourceLink;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeTitle;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.contributionURI;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.locationURL;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.newRuntime;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+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.Component;
+import org.apache.tuscany.sca.assembly.ComponentService;
+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.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeIncludeBuilderImpl;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.Artifact;
+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.ExtensibleStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.xml.ContributionGeneratedMetadataDocumentProcessor;
+import org.apache.tuscany.sca.contribution.xml.ContributionMetadataDocumentProcessor;
+import org.apache.tuscany.sca.contribution.xml.ContributionMetadataProcessor;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime;
+import org.apache.tuscany.sca.implementation.data.collection.Entry;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+import org.apache.tuscany.sca.implementation.data.collection.ItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+import org.apache.tuscany.sca.implementation.node.builder.impl.NodeCompositeBuilderImpl;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
+import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
+import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.workspace.WorkspaceFactory;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilder;
+import org.apache.tuscany.sca.workspace.builder.impl.ContributionDependencyBuilderImpl;
+import org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Implementation of a deployable composite collection service. 
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={ItemCollection.class, LocalItemCollection.class, Servlet.class})
+public class DeployableCompositeCollectionImpl extends HttpServlet implements ItemCollection, LocalItemCollection {
+    private static final long serialVersionUID = -8809641932774129151L;
+    
+    private final static Logger logger = Logger.getLogger(DeployableCompositeCollectionImpl.class.getName());    
+
+    @Reference
+    public LocalItemCollection contributionCollection;
+    
+    @Reference 
+    public LocalItemCollection domainCompositeCollection;
+    
+    @Reference 
+    public LocalItemCollection cloudCollection;    
+
+    private ModelFactoryExtensionPoint modelFactories;
+    private ModelResolverExtensionPoint modelResolvers;
+    private AssemblyFactory assemblyFactory;
+    private WorkspaceFactory workspaceFactory;
+    private URLArtifactProcessor<Contribution> contributionContentProcessor;
+    private StAXArtifactProcessor<Composite> compositeProcessor;
+    private XMLOutputFactory outputFactory;
+    private ContributionDependencyBuilder contributionDependencyBuilder;
+    private CompositeBuilder compositeBuilder;
+    private CompositeBuilder compositeIncludeBuilder;
+    private CompositeBuilder nodeConfigurationBuilder;
+    private Monitor monitor;
+    
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() throws ParserConfigurationException {
+        
+        // FIXME Remove this later
+        ReallySmallRuntime runtime = newRuntime();
+        
+        ExtensionPointRegistry extensionPoints = runtime.getExtensionPointRegistry();
+        
+        // Get model factories
+        modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
+        assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+        XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class);
+        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
+        ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+        workspaceFactory = modelFactories.getFactory(WorkspaceFactory.class);
+        
+        // Get and initialize artifact processors
+        StAXArtifactProcessorExtensionPoint staxProcessors = extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        StAXArtifactProcessor<Object> staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory);
+        staxProcessors.addArtifactProcessor(new ContributionMetadataProcessor(assemblyFactory, contributionFactory, staxProcessor));
+        compositeProcessor = (StAXArtifactProcessor<Composite>)staxProcessors.getProcessor(Composite.class);
+
+        URLArtifactProcessorExtensionPoint urlProcessors = extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
+        URLArtifactProcessor<Object> urlProcessor = new ExtensibleURLArtifactProcessor(urlProcessors);
+        urlProcessors.addArtifactProcessor(new ContributionMetadataDocumentProcessor(staxProcessor, inputFactory));
+        urlProcessors.addArtifactProcessor(new ContributionGeneratedMetadataDocumentProcessor(staxProcessor, inputFactory));
+        
+        // Create contribution processor
+        modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
+        contributionContentProcessor = new ContributionContentProcessor(modelFactories, modelResolvers, urlProcessor);
+
+        // Create a monitor
+        UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+        MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class);
+        monitor = monitorFactory.createMonitor();
+        
+        // Create contribution and composite builders
+        contributionDependencyBuilder = new ContributionDependencyBuilderImpl(monitor);
+        SCABindingFactory scaBindingFactory = modelFactories.getFactory(SCABindingFactory.class);
+        IntentAttachPointTypeFactory intentAttachPointTypeFactory = modelFactories.getFactory(IntentAttachPointTypeFactory.class);
+        InterfaceContractMapper contractMapper = utilities.getUtility(InterfaceContractMapper.class);
+        compositeBuilder = new CompositeBuilderImpl(assemblyFactory, scaBindingFactory, intentAttachPointTypeFactory, contractMapper, monitor);
+        compositeIncludeBuilder = new CompositeIncludeBuilderImpl(monitor);
+        nodeConfigurationBuilder = new NodeCompositeBuilderImpl(assemblyFactory, scaBindingFactory, contractMapper, null, monitor);
+    }
+    
+    public Entry<String, Item>[] getAll() {
+        logger.info("getAll");
+        
+        // Return all the deployable composites in the contributions
+        List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+        
+        // Get the list of contributions in the workspace
+        Entry<String, Item>[] contributionEntries = contributionCollection.getAll();
+
+        // Read contribution metadata
+        for (Entry<String, Item> contributionEntry: contributionEntries) {
+            Item contributionItem = contributionEntry.getData();
+            Contribution contribution;
+            try {
+                contribution = contribution(contributionEntry.getKey(), contributionItem.getAlternate());
+            } catch (ContributionReadException e) {
+                continue;
+            }
+
+            // Create entries for the deployable composites
+            for (Composite deployable: contribution.getDeployables()) {
+                entries.add(entry(contribution, deployable));
+            }
+            
+        }
+        return entries.toArray(new Entry[entries.size()]);
+    }
+
+    public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
+
+        // Get the specified contribution info 
+        String contributionURI = contributionURI(key);
+        Item contributionItem = contributionCollection.get(contributionURI);
+        
+        // Read the contribution
+        Contribution contribution;
+        try {
+            contribution = contribution(contributionURI, contributionItem.getAlternate());
+        } catch (ContributionReadException e) {
+            throw new NotFoundException(key);
+        }
+
+        // Find the specified deployable composite
+        QName qname = compositeQName(key);
+        for (Composite deployable: contribution.getDeployables()) {
+            if (qname.equals(deployable.getName())) {
+                if (deployable.isUnresolved()) {
+                    throw new NotFoundException(key);
+                }
+                
+                // Return an item describing the deployable composite
+                return item(contribution, deployable);
+            }
+        }
+
+        throw new NotFoundException(key);
+    }
+
+    public String post(String key, Item item) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void put(String key, Item item) throws NotFoundException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void delete(String key) throws NotFoundException {
+        throw new UnsupportedOperationException();
+    }
+    
+    public Entry<String, Item>[] query(String queryString) {
+        logger.info("query " + queryString);
+        
+        if (queryString.startsWith("contribution=")) {
+
+            // Return all the deployable composites in the specified
+            // contribution
+            List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+
+            // Get the specified contribution info 
+            String contributionURI = queryString.substring(queryString.indexOf('=') + 1);
+            Item contributionItem;
+            try {
+                contributionItem = contributionCollection.get(contributionURI);
+            } catch (NotFoundException e) {
+                return entries.toArray(new Entry[entries.size()]);
+            }
+            
+            // Read the contribution
+            Contribution contribution;
+            try {
+                contribution = contribution(contributionURI, contributionItem.getAlternate());
+            } catch (ContributionReadException e) {
+                return entries.toArray(new Entry[entries.size()]);
+            }
+
+            // Create entries for the deployable composites
+            for (Composite deployable: contribution.getDeployables()) {
+                entries.add(entry(contribution, deployable));
+            }
+
+            return entries.toArray(new Entry[entries.size()]);
+            
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+    
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+        String key = path.startsWith("/")? path.substring(1) : path;
+        logger.info("get " + key);
+        
+        // Expect a key in the form
+        // composite:contributionURI;namespace;localName
+        // and return the corresponding resolved composite
+        
+        // Extract the composite qname from the key
+        QName qname = compositeQName(key);
+        
+        // Somewhere to store the composite we expect to write out at the end
+        Composite compositeImage = null;
+
+        // Create a domain composite model
+        Composite domainComposite = assemblyFactory.createComposite();
+        domainComposite.setName(new QName(Constants.SCA10_TUSCANY_NS, "domain"));
+            
+        // Get the domain composite items
+        Entry<String, Item>[] domainEntries = domainCompositeCollection.getAll();
+        
+        // Populate the domain composite
+        Workspace workspace = workspaceFactory.createWorkspace();
+        workspace.setModelResolver(new ExtensibleModelResolver(workspace, modelResolvers, modelFactories));
+        Map<String, Contribution> contributionMap = new HashMap<String, Contribution>(); 
+        for (Entry<String, Item> domainEntry: domainEntries) {
+            
+            // Load the required contributions
+            String contributionURI = contributionURI(domainEntry.getKey());
+            Contribution contribution = contributionMap.get(contributionURI);
+            if (contribution == null) {
+                
+                // The contribution has not been loaded yet, load it with all its dependencies
+                Entry<String, Item>[] entries = contributionCollection.query("alldependencies=" + contributionURI);
+                for (Entry<String, Item> entry: entries) {
+                    Item contributionItem = entry.getData();
+    
+                    // Read the contribution
+                    Contribution c;
+                    try {
+                        c = contribution(workspace, entry.getKey(), contributionItem.getAlternate());
+                    } catch (ContributionReadException e) {
+                        continue;
+                    }
+                    workspace.getContributions().add(c);
+                    if (contributionURI.equals(entry.getKey())) {
+                        contribution = c;
+                        contributionMap.put(contributionURI, contribution);
+                    }
+                    
+                    // Build contribution dependencies
+                    
+                }
+            }
+            
+            if (contribution == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND, contributionURI);
+                return;
+            }
+            
+            // Find the specified deployable composite in the contribution
+            Composite deployable = null;
+            QName qn = compositeQName(domainEntry.getKey());
+            for (Composite d: contribution.getDeployables()) {
+                if (qn.equals(d.getName())) {
+                    deployable = d;
+                    break;
+                }
+            }
+            if (deployable == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND, qn.toString());
+                return;
+            }
+            
+            // add the deployable composite to the domain composite
+            domainComposite.getIncludes().add(deployable);
+
+            // Fuse includes into the deployable composite
+            try {
+                compositeIncludeBuilder.build(deployable);
+            } catch (CompositeBuilderException e) {
+                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
+            }
+            
+            // store away the composite we are generating the deployable XML for. 
+            if (qname.equals(deployable.getName())){
+                compositeImage = deployable;
+            }
+        }
+        
+        // Composite not found
+        if (compositeImage == null) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+            return;
+        }
+
+        // Get the clouds composite
+        Composite cloudsComposite;
+        try {
+            cloudsComposite = cloud();
+        } catch (NotFoundException e) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
+            return;
+        }
+        
+        // configure the endpoints for each composite in the domain
+        List<Composite> domainIncludes = domainComposite.getIncludes(); 
+        for (int i = 0, n =domainIncludes.size(); i < n; i++) {
+            Composite composite = domainIncludes.get(i);
+            QName compositeName = composite.getName();
+            String contributionURI = contributionURI(domainEntries[i].getKey());
+            
+            // find the node that will run this composite and the default
+            // bindings that it configures
+            Component nodeComponent = null;
+            for (Composite cloudComposite : cloudsComposite.getIncludes()) {
+                for (Component nc : cloudComposite.getComponents()) {
+                    NodeImplementation nodeImplementation = (NodeImplementation)nc.getImplementation();
+                    if (nodeImplementation.getComposite().getName().equals(compositeName) &&
+                        nodeImplementation.getComposite().getURI().equals(contributionURI)) {
+                        nodeComponent = nc;
+                        nodeImplementation.setComposite(composite);
+                        break;
+                    }
+                }
+            }
+
+            if (nodeComponent != null) {
+                try {
+                    Composite nodeComposite = assemblyFactory.createComposite();
+                    nodeComposite.getComponents().add(nodeComponent);
+                    nodeConfigurationBuilder.build(nodeComposite);
+                } catch (CompositeBuilderException e) {
+                    throw new ServletException(e);
+                }
+            }
+        }
+        
+        // Build the domain composite
+        try {
+            compositeBuilder.build(domainComposite);
+        } catch (CompositeBuilderException e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
+            return;
+        }        
+        
+        // Rebuild the requested composite from the domain composite
+        // we have to reverse the flattening that went on when the domain
+        // composite was built
+        List<Component> tempComponentList = new ArrayList<Component>();
+        tempComponentList.addAll(compositeImage.getComponents());
+        compositeImage.getComponents().clear();
+        for (Component inputComponent : tempComponentList){
+            for (Component deployComponent : domainComposite.getComponents()){
+                if (deployComponent.getName().equals(inputComponent.getName())){
+                    compositeImage.getComponents().add(deployComponent);
+                }
+            }
+        }
+        
+        // Write the deployable composite
+        try {
+            response.setContentType("text/xml");
+            XMLStreamWriter writer = outputFactory.createXMLStreamWriter(response.getOutputStream());
+            compositeProcessor.write(compositeImage, writer);
+        } catch (Exception e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
+            return;
+        }
+    }
+
+    /**
+     * Returns the cloud composite.
+     * 
+     * @return the cloud composite
+     */
+    private Composite cloud() throws NotFoundException {
+
+        // Create a new composite for the clouds
+        Composite cloudComposite = assemblyFactory.createComposite();
+        cloudComposite.setName(new QName(Constants.SCA10_TUSCANY_NS, "cloud"));
+        
+        // Get the collection of cloud composites
+        Entry<String, Item>[] cloudEntries = cloudCollection.getAll();
+        
+        // Load the cloud contributions
+        Workspace workspace = workspaceFactory.createWorkspace();
+        Map<String, Contribution> contributionMap = new HashMap<String, Contribution>(); 
+        for (Entry<String, Item> cloudEntry: cloudEntries) {
+            String key = cloudEntry.getKey();
+            String contributionURI = contributionURI(key);
+
+            // Load the contribution
+            Contribution contribution = contributionMap.get(contributionURI);
+            if (contribution == null) {
+                Item contributionItem = contributionCollection.get(contributionURI);
+                
+                // Read the contribution
+                try {
+                    contribution = contribution(workspace, contributionURI, contributionItem.getAlternate());
+                } catch (ContributionReadException e) {
+                    continue;
+                }
+                workspace.getContributions().add(contribution);
+                contributionMap.put(contributionURI, contribution);
+                
+            }
+
+            // Include the cloud composite in the clouds composite
+            QName qname = compositeQName(key);
+            for (Artifact artifact : contribution.getArtifacts()) {
+                if (artifact.getModel() instanceof Composite) {
+                    Composite composite = (Composite)artifact.getModel();
+                    if (composite.getName().equals(qname)) {
+                        cloudComposite.getIncludes().add(composite);
+                    }
+                }
+            } 
+        }
+        
+        return cloudComposite;
+    }
+
+    /**
+     * Returns the contribution with the given URI.
+     * 
+     * @param workspace
+     * @param contributionURI
+     * @param contributionLocation
+     * @return
+     * @throws NotFoundException
+     */
+    private Contribution contribution(Workspace workspace, String contributionURI, String contributionLocation) throws ContributionReadException {
+        try {
+            URI uri = URI.create(contributionURI);
+            URL location = locationURL(contributionLocation);
+            Contribution contribution = (Contribution)contributionContentProcessor.read(null, uri, location);
+            
+            // Resolve the contribution dependencies
+            contributionDependencyBuilder.buildContributionDependencies(contribution, workspace);
+            
+            contributionContentProcessor.resolve(contribution, workspace.getModelResolver());
+            return contribution;
+
+        } catch (ContributionReadException e) {
+            throw e;
+        } catch (ContributionResolveException e) {
+            throw new ContributionReadException(e);
+        } catch (MalformedURLException e) {
+            throw new ContributionReadException(e);
+        }
+    }
+
+    /**
+     * Returns the contribution with the given URI.
+     * 
+     * @param contributionURI
+     * @param contributionLocation
+     * @return
+     * @throws NotFoundException
+     */
+    private Contribution contribution(String contributionURI, String contributionLocation) throws ContributionReadException {
+        return contribution(workspaceFactory.createWorkspace(), contributionURI, contributionLocation);
+    }
+    
+    /**
+     * Returns the entry contents describing a composite.
+     * 
+     * @param composite
+     * @return
+     */
+    private static String content(Composite composite) {
+        StringBuffer sb = new StringBuffer();
+        List<Component> components = composite.getComponents();
+        for (int i = 0, n = components.size(); i < n; i++) {
+            Component component = components.get(i);
+            if (component.getImplementation() instanceof NodeImplementation) {
+                List<ComponentService> services = component.getServices();
+                if (!services.isEmpty()) {
+                    List<Binding> bindings = services.get(0).getBindings();
+                    if (!bindings.isEmpty()) {
+                        
+                        // List node URIs
+                        sb.append("Node URI: <span id=\"nodeURI\">");
+                        sb.append(component.getServices().get(0).getBindings().get(0).getURI());
+                        break;
+                    }
+                }
+            } else {
+                
+                // List component names
+                if (sb.length() == 0) {
+                    sb.append("Components: <span id=\"components\">");
+                } else {
+                    sb.append(" ");
+                }
+                sb.append(component.getName());
+            }
+        }
+        if (sb.length() != 0) {
+            sb.append("</span>");
+        }
+        return sb.toString();
+    }
+    
+    /**
+     * Returns the link to the resource related to a composite.
+     * 
+     * @param composite
+     * @return
+     */
+    private static String relatedLink(Composite composite) {
+        for (Component component: composite.getComponents()) {
+            if (component.getImplementation() instanceof NodeImplementation) {
+                NodeImplementation nodeImplementation = (NodeImplementation)component.getImplementation();
+                Composite deployable = nodeImplementation.getComposite();
+                String contributionURI = deployable.getURI();
+                QName qname = deployable.getName();
+                String key = compositeKey(contributionURI, qname);
+                return "/composite-source/" + key;
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Returns an entry describing the given deployable.
+     * 
+     * @param contribution
+     * @param deployable
+     * @return
+     */
+    private static Entry<String, Item> entry(Contribution contribution, Composite deployable) {
+        Entry<String, Item> entry = new Entry<String, Item>();
+        entry.setKey(DomainAdminUtil.compositeKey(contribution.getURI(), deployable.getName()));
+        entry.setData(item(contribution, deployable));
+        return entry;
+    }
+
+    /**
+     * Returns an item describing the given deployable.
+     * 
+     * @param contribution
+     * @param deployable
+     * @return
+     */
+    private static Item item(Contribution contribution, Composite deployable) {
+        String contributionURI = contribution.getURI();
+        String contributionLocation = contribution.getLocation();
+        QName qname = deployable.getName();
+        String deployableURI = deployable.getURI();
+        Item item = new Item();
+        item.setTitle(compositeTitle(contributionURI, qname));
+        item.setContents(content(deployable));
+        item.setLink(compositeSourceLink(contributionURI, qname));
+        item.setAlternate(compositeAlternateLink(contributionLocation, deployableURI));
+        item.setRelated(relatedLink(deployable));
+        return item;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java?rev=651636&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java (added)
+++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java Fri Apr 25 09:12:51 2008
@@ -0,0 +1,399 @@
+/*
+ * 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.domain.manager.impl;
+
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.DEPLOYMENT_CONTRIBUTION_URI;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeKey;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeQName;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeSourceLink;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.compositeTitle;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainAdminUtil.contributionURI;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+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.CompositeProcessor;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.implementation.data.collection.Entry;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+import org.apache.tuscany.sca.implementation.data.collection.ItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.osoa.sca.ServiceRuntimeException;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Property;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+import org.w3c.dom.Document;
+
+/**
+ * Implementation of a composite collection service. 
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={ItemCollection.class,LocalItemCollection.class, Servlet.class})
+public class DeployedCompositeCollectionImpl extends HttpServlet implements ItemCollection, LocalItemCollection {
+    private static final long serialVersionUID = -3477992129462720901L;
+
+    private final static Logger logger = Logger.getLogger(DeployedCompositeCollectionImpl.class.getName());    
+
+    @Property
+    public String compositeFile;
+    
+    @Property
+    public String deploymentContributionDirectory;
+    
+    @Reference
+    public LocalItemCollection deployableCollection;
+    
+    @Reference(required=false)
+    public LocalItemCollection processCollection;
+
+    private ModelFactoryExtensionPoint modelFactories;
+    private AssemblyFactory assemblyFactory;
+    private CompositeProcessor compositeProcessor;
+    private XMLOutputFactory outputFactory;
+    private DocumentBuilder documentBuilder;
+    
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() throws ParserConfigurationException {
+        
+        // Create factories
+        modelFactories = new DefaultModelFactoryExtensionPoint();
+        assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
+        
+        // Create composite processor
+        ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+        PolicyFactory policyFactory = modelFactories.getFactory(PolicyFactory.class);
+        compositeProcessor = new CompositeProcessor(contributionFactory, assemblyFactory, policyFactory, null);
+
+        // Create a document builder (used to pretty print XML)
+        documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+    }
+    
+    public Entry<String, Item>[] getAll() {
+        logger.info("getAll");
+
+        // Return all the composites in the domain composite
+        List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+        Composite compositeCollection = readCompositeCollection();
+        for (Composite composite: compositeCollection.getIncludes()) {
+            String contributionURI = composite.getURI();
+            QName qname = composite.getName();
+            String key = compositeKey(contributionURI, qname);
+            Item item;
+            try {
+                item = deployableCollection.get(key);
+            } catch (NotFoundException e) {
+                item = new Item();
+                item.setTitle(compositeTitle(contributionURI, qname));
+                item.setLink(compositeSourceLink(contributionURI, qname));
+                item.setContents("<span id=\"problem\" style=\"color: red\">Problem: Composite not found</span>");
+            }
+            Entry<String, Item> entry = new Entry<String, Item>();
+            entry.setKey(key);
+            entry.setData(item);
+            entries.add(entry);
+        }
+        return entries.toArray(new Entry[entries.size()]);
+    }
+
+    public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
+        
+        String contributionURI = contributionURI(key);
+        QName qname = compositeQName(key);
+
+        // Look for the specified composite in the domain composite
+        List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+        Composite compositeCollection = readCompositeCollection();
+        for (Composite composite: compositeCollection.getIncludes()) {
+            if (contributionURI.equals(composite.getURI()) && qname.equals(composite.getName())) {
+                return deployableCollection.get(key);
+            }
+        }
+        throw new NotFoundException(key);
+    }
+    
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+        // Expect a key in the form
+        // composite:contributionURI;namespace;localName
+        // and return the corresponding source file
+        
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+        String key = path.startsWith("/")? path.substring(1) : path;
+        logger.info("get " + key);
+        
+        // Get the item describing the composite
+        Item item;
+        try {
+            item = deployableCollection.get(key);
+        } catch (NotFoundException e) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+            return;
+        }
+
+        // Support reading source composite file inside a JAR
+        String uri = item.getAlternate();
+        int e = uri.indexOf("!/"); 
+        if (e != -1) {
+            int s = uri.lastIndexOf('/', e - 2) +1;
+            if (uri.substring(s, e).contains(".")) {
+                uri = "jar:" + uri;
+            } else {
+                uri = uri.substring(0, e) + uri.substring(e + 1);
+            }
+        }
+        
+        // Read the composite file and write to response
+        response.setContentType("text/xml");
+        URLConnection connection = new URL(uri).openConnection();
+        connection.setUseCaches(false);
+        connection.connect();
+        InputStream is = connection.getInputStream();
+        ServletOutputStream os = response.getOutputStream();
+        byte[] buffer = new byte[4096];
+        for (;;) {
+            int n = is.read(buffer);
+            if (n < 0) {
+                break;
+            }
+            os.write(buffer, 0, n);
+        }
+        is.close();
+        os.flush();
+    }
+
+    public String post(String key, Item item) {
+        logger.info("post " + key);
+        
+        String contributionURI = contributionURI(key);
+        QName qname = compositeQName(key);
+
+        // Adds a new composite to the domain composite
+        Composite compositeCollection = readCompositeCollection();
+        Composite composite = assemblyFactory.createComposite();
+        composite.setName(qname);
+        composite.setURI(contributionURI);
+        composite.setUnresolved(true);
+        compositeCollection.getIncludes().add(composite);
+        
+        // Optionally, write the composite contents in a new composite file
+        // under the deployment composites directory, if that directory is
+        // configured on this component
+        if (deploymentContributionDirectory != null && item.getContents() != null) {
+            File directory = new File(deploymentContributionDirectory);
+            if (!directory.exists()) {
+                directory.mkdirs();
+            }
+            File file = new File(directory, qname.getLocalPart() + ".composite");
+            try {
+                Writer w = new OutputStreamWriter(new FileOutputStream(file));
+                w.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+                w.write(item.getContents());
+                w.close();
+            } catch (IOException e) {
+                throw new ServiceRuntimeException(e);
+            }
+        }
+        
+        // Write the composite collection
+        writeCompositeCollection(compositeCollection);
+        
+        return key;
+    }
+
+    public void put(String key, Item item) throws NotFoundException {
+        logger.info("put " + key);
+
+        String contributionURI = contributionURI(key);
+        QName qname = compositeQName(key);
+        
+        // Update a composite already in the domain composite
+        Composite compositeCollection = readCompositeCollection();
+        Composite newComposite = assemblyFactory.createComposite();
+        newComposite.setName(qname);
+        newComposite.setURI(contributionURI);
+        newComposite.setUnresolved(true);
+        List<Composite> composites = compositeCollection.getIncludes();
+        for (int i = 0, n = composites.size(); i < n; i++) {
+            Composite composite = composites.get(i);
+            if (contributionURI.equals(composite.getURI()) && qname.equals(composite.getName())) {
+                composites.set(i, newComposite);
+                
+                // Write the domain composite
+                writeCompositeCollection(compositeCollection);
+                
+                return;
+            }
+        }
+        throw new NotFoundException(key);
+    }
+
+    public void delete(String key) throws NotFoundException {
+        logger.info("delete " + key);
+        
+        String contributionURI = contributionURI(key);
+        QName qname = compositeQName(key);
+        
+        // Delete/stop the corresponding process, if any
+        try {
+            processCollection.delete(qname.getLocalPart());
+        } catch (Exception e) {}
+        
+        // Delete a composite from the composite collection
+        Composite compositeCollection = readCompositeCollection();
+        List<Composite> composites = compositeCollection.getIncludes();
+        Composite deleted = null;
+        for (int i = 0, n = composites.size(); i < n; i++) {
+            Composite composite = composites.get(i);
+            if (contributionURI.equals(composite.getURI()) && qname.equals(composite.getName())) {
+                composites.remove(i);
+                deleted = composite;
+                
+                // Write the domain composite
+                writeCompositeCollection(compositeCollection);
+                break;
+            }
+        }
+
+        // Delete the file too if it is in the deployment contribution directory
+        if (deploymentContributionDirectory != null && contributionURI.equals(DEPLOYMENT_CONTRIBUTION_URI)) {
+            File file = new File(deploymentContributionDirectory, qname.getLocalPart() + ".composite");
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+        
+        if (deleted == null) {
+            throw new NotFoundException(key);
+        }
+    }
+
+    public Entry<String, Item>[] query(String queryString) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * Reads the domain composite.
+     * 
+     * @return the domain composite
+     * @throws ServiceRuntimeException
+     */
+    private Composite readCompositeCollection() throws ServiceRuntimeException {
+        Composite compositeCollection;
+        File file = new File(compositeFile);
+        if (file.exists()) {
+            XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class);
+            try {
+                FileInputStream is = new FileInputStream(file);
+                XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
+                compositeCollection = compositeProcessor.read(reader);
+            } catch (Exception e) {
+                throw new ServiceRuntimeException(e);
+            }
+        } else {
+            compositeCollection = assemblyFactory.createComposite();
+            String name;
+            int d = compositeFile.lastIndexOf('.');
+            if (d != -1) {
+                name = compositeFile.substring(0, d);
+            } else {
+                name = compositeFile;
+            }
+            compositeCollection.setName(new QName(Constants.SCA10_TUSCANY_NS, name));
+        }
+        return compositeCollection;
+    }
+    
+    /**
+     * Write the domain composite back to disk.
+     * 
+     * @param compositeCollection
+     */
+    private void writeCompositeCollection(Composite compositeCollection) {
+        try {
+            // First write to a byte stream
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
+            compositeProcessor.write(compositeCollection, writer);
+            
+            // Parse again to pretty format the document
+            Document document = documentBuilder.parse(new ByteArrayInputStream(bos.toByteArray()));
+            OutputFormat format = new OutputFormat();
+            format.setIndenting(true);
+            format.setIndent(2);
+            
+            // Write to domain.composite
+            FileOutputStream os = new FileOutputStream(new File(compositeFile));
+            XMLSerializer serializer = new XMLSerializer(os, format);
+            serializer.serialize(document);
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date