Author: jsdelfino
Date: Wed Mar  5 10:54:33 2008
New Revision: 633974

URL: http://svn.apache.org/viewvc?rev=633974&view=rev
Log:
Use proper IRIs to represent deployable composites and deployed composites. 
Integrated calls to the CompositeBuilder to generated deployed/built 
composites. Minor related fixes in the client side components.

Modified:
    incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
    
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java

Modified: incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/pom.xml?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/pom.xml Wed Mar  5 
10:54:33 2008
@@ -43,6 +43,18 @@
 
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-implementation-node</artifactId>
+            <version>1.2-incubating-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-implementation-node-xml</artifactId>
+            <version>1.2-incubating-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
             <artifactId>tuscany-workspace-impl</artifactId>
             <version>1.2-incubating-SNAPSHOT</version>
         </dependency>

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
 Wed Mar  5 10:54:33 2008
@@ -59,6 +59,7 @@
 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;
 
 /**
@@ -67,6 +68,7 @@
  * @version $Rev: 632617 $ $Date: 2008-03-01 08:24:33 -0800 (Sat, 01 Mar 2008) 
$
  */
 @Scope("COMPOSITE")
[EMAIL PROTECTED](CompositeCollection.class)
 public class CompositeCollectionImpl implements CompositeCollection {
     
     @Property
@@ -81,10 +83,10 @@
     private XMLOutputFactory outputFactory;
     
     /**
-     * Initialize the workspace administration component.
+     * Initialize the component.
      */
     @Init
-    public void init() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
+    public void initialize() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
         
         // Create factories
         ModelFactoryExtensionPoint modelFactories = new 
DefaultModelFactoryExtensionPoint();
@@ -114,10 +116,12 @@
         for (Composite composite: compositeCollection.getIncludes()) {
             Entry<String, Item> entry = new Entry<String, Item>();
             QName qname = composite.getName();
-            entry.setKey(name(qname));
+            String contributionURI = composite.getURI();
+            String key = key(contributionURI, qname); 
+            entry.setKey(key);
             Item item = new Item();
-            item.setTitle(name(qname));
-            item.setLink(compositeLink(qname, composite.getURI()));
+            item.setTitle(key);
+            item.setLink(compositeLink(contributionURI, qname));
             entry.setData(item);
             entries.add(entry);
         }
@@ -125,14 +129,15 @@
     }
 
     public Item get(String key) throws NotFoundException {
+        String contributionURI = uri(key);
+        QName qname = qname(key);
 
         // Returns the composite with the given name key
         for (Composite composite: compositeCollection.getIncludes()) {
-            QName qname = composite.getName();
-            if (key.equals(name(qname))) {
+            if (contributionURI.equals(composite.getURI()) && 
qname.equals(composite.getName())) {
                 Item item = new Item();
-                item.setTitle(name(qname));
-                item.setLink(compositeLink(qname, composite.getURI()));
+                item.setTitle(key);
+                item.setLink(compositeLink(composite.getURI(), qname));
                 return item;
             }
         }
@@ -140,11 +145,13 @@
     }
 
     public String post(String key, Item item) {
+        String contributionURI = uri(key);
+        QName qname = qname(key);
         
         // Adds a new composite to the domain composite
         Composite composite = assemblyFactory.createComposite();
-        composite.setName(qname(key));
-        composite.setURI(item.getLink());
+        composite.setName(qname);
+        composite.setURI(contributionURI);
         composite.setUnresolved(true);
         compositeCollection.getIncludes().add(composite);
         
@@ -155,15 +162,18 @@
     }
 
     public void put(String key, Item item) throws NotFoundException {
+        String contributionURI = uri(key);
+        QName qname = qname(key);
         
         // Update a composite already in the domain composite
         Composite newComposite = assemblyFactory.createComposite();
-        newComposite.setName(qname(key));
-        newComposite.setURI(item.getLink());
+        newComposite.setName(qname);
+        newComposite.setURI(contributionURI);
         newComposite.setUnresolved(true);
         List<Composite> composites = compositeCollection.getIncludes();
         for (int i = 0, n = composites.size(); i < n; i++) {
-            if (name(composites.get(i).getName()).equals(key)) {
+            Composite composite = composites.get(i);
+            if (contributionURI.equals(composite.getURI()) && 
qname.equals(composite.getName())) {
                 composites.set(i, newComposite);
                 
                 // Write the domain composite
@@ -176,11 +186,14 @@
     }
 
     public void delete(String key) throws NotFoundException {
+        String contributionURI = uri(key);
+        QName qname = qname(key);
         
         // Delete a composite from the domain composite
         List<Composite> composites = compositeCollection.getIncludes();
         for (int i = 0, n = composites.size(); i < n; i++) {
-            if (name(composites.get(i).getName()).equals(key)) {
+            Composite composite = composites.get(i);
+            if (contributionURI.equals(composite.getURI()) && 
qname.equals(composite.getName())) {
                 composites.remove(i);
 
                 // Write the domain composite
@@ -193,7 +206,7 @@
     }
 
     public Entry<String, Item>[] query(String queryString) {
-        if (queryString.startsWith("usedBy=")) {
+        if (queryString.startsWith("uris=true")) {
             //FIXME Invoke the Composite processing code from workspace-impl
             return getAll();
         } else {
@@ -228,11 +241,11 @@
         }
     }
     
-    private String compositeLink(QName qname, String contributionURI) {
-        String name = name(qname);
+    private String compositeLink(String contributionURI, QName qname) {
+        String key = key(contributionURI, qname);
         Entry<String, Item>[] entries = 
deployableCompositeCollection.query("contribution=" + contributionURI);
         for (Entry<String, Item> entry: entries) {
-            if (name.equals(entry.getKey())) {
+            if (key.equals(entry.getKey())) {
                 return entry.getData().getLink();
             }
         }
@@ -240,30 +253,33 @@
     }
     
     /**
-     * Returns a qname object from its expression as namespace#localpart.
-     * @param name
+     * Extracts a qname from a key expressed as 
contributionURI;namespace;localpart.
+     * @param key
      * @return
      */
-    private static QName qname(String name) {
-        int i = name.indexOf(';');
-        if (i != -1) {
-            return new QName(name.substring(0, i), name.substring(i + 1));
-        } else {
-            return new QName(name);
-        }
+    private static QName qname(String key) {
+        int i = key.indexOf(';');
+        key = key.substring(i + 1);
+        i = key.indexOf(';');
+        return new QName(key.substring(0, i), key.substring(i + 1));
+    }
+    
+    /**
+     * Extracts a contribution uri from a key expressed as 
contributionURI;namespace;localpart.
+     * @param key
+     * @return
+     */
+    private static String uri(String key) {
+        int i = key.indexOf(';');
+        return key.substring("composite:".length(), i);
     }
     
     /**
-     * Returns a qname expressed as namespace;localpart.
+     * Returns a composite key expressed as 
contributionURI;namespace;localpart.
      * @param qname
      * @return
      */
-    private static String name(QName qname) {
-        String ns = qname.getNamespaceURI();
-        if (ns != null) {
-            return ns + ';' + qname.getLocalPart();
-        } else {
-            return qname.getLocalPart();
-        }
+    private static String key(String uri, QName qname) {
+        return "composite:" + uri + ';' + qname.getNamespaceURI() + ';' + 
qname.getLocalPart();
     }
 }

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
 Wed Mar  5 10:54:33 2008
@@ -30,7 +30,6 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -101,10 +100,10 @@
     private XMLOutputFactory outputFactory;
     
     /**
-     * Initialize the workspace administration component.
+     * Initialize the component.
      */
     @Init
-    public void init() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
+    public void initialize() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
         
         // Create model factories
         ModelFactoryExtensionPoint modelFactories = new 
DefaultModelFactoryExtensionPoint();

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
 Wed Mar  5 10:54:33 2008
@@ -31,6 +31,7 @@
 import org.osoa.sca.annotations.Init;
 import org.osoa.sca.annotations.Property;
 import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
 
 /**
  * Implementation of a file collection service component. 
@@ -38,6 +39,7 @@
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
[EMAIL PROTECTED](ContributionFileCollection.class)
 public class ContributionFileCollectionImpl implements 
ContributionFileCollection {
     
     @Property
@@ -49,7 +51,7 @@
      * Initialize the component.
      */
     @Init
-    public void init() throws IOException {
+    public void initialize() throws IOException {
         files = new File(directoryName);
         if (!files.exists()) {
             files.mkdirs();

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
 Wed Mar  5 10:54:33 2008
@@ -27,6 +27,7 @@
 import java.net.URLDecoder;
 import java.util.List;
 
+import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServlet;
@@ -39,6 +40,7 @@
 import org.osoa.sca.annotations.Init;
 import org.osoa.sca.annotations.Property;
 import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
 
 /**
  * Implementation of a servlet component supporting file upload/download.
@@ -46,6 +48,7 @@
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
[EMAIL PROTECTED](Servlet.class)
 public class ContributionFileServiceImpl extends HttpServlet {
     private static final long serialVersionUID = -4560385595481971616L;
     

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
 Wed Mar  5 10:54:33 2008
@@ -19,22 +19,37 @@
 
 package org.apache.tuscany.sca.workspace.admin.impl;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 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 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.XMLStreamException;
+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.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.xml.CompositeDocumentProcessor;
 import org.apache.tuscany.sca.assembly.xml.CompositeProcessor;
 import org.apache.tuscany.sca.contribution.Contribution;
@@ -60,16 +75,23 @@
 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.NotFoundException;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl;
+import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
 import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.policy.PolicySet;
 import org.apache.tuscany.sca.workspace.admin.CompositeCollection;
 import org.apache.tuscany.sca.workspace.admin.LocalCompositeCollection;
 import org.apache.tuscany.sca.workspace.admin.LocalContributionCollection;
 import 
org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
+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.Reference;
 import org.osoa.sca.annotations.Scope;
 import org.osoa.sca.annotations.Service;
+import org.w3c.dom.Document;
 
 /**
  * Implementation of a deployable composite collection service. 
@@ -77,9 +99,10 @@
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
[EMAIL PROTECTED](interfaces={CompositeCollection.class, 
LocalCompositeCollection.class})
-public class DeployableCompositeCollectionImpl implements CompositeCollection, 
LocalCompositeCollection {
-    
[EMAIL PROTECTED](interfaces={CompositeCollection.class, 
LocalCompositeCollection.class, Servlet.class})
+public class DeployableCompositeCollectionImpl extends HttpServlet implements 
CompositeCollection, LocalCompositeCollection {
+    private static final long serialVersionUID = -8809641932774129151L;
+
     @Reference
     public LocalContributionCollection contributionCollection;
 
@@ -87,30 +110,31 @@
     private ModelResolverExtensionPoint modelResolvers;
     private AssemblyFactory assemblyFactory;
     private URLArtifactProcessor<Contribution> contributionContentProcessor;
+    private StAXArtifactProcessor<Composite> compositeProcessor;
+    private XMLOutputFactory outputFactory;
+    private CompositeBuilder compositeBuilder;
     
     /**
-     * Initialize the workspace administration component.
+     * Initialize the component.
      */
     @Init
-    public void init() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
+    public void initialize() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
         
         // Create factories
         modelFactories = new DefaultModelFactoryExtensionPoint();
         assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
         XMLInputFactory inputFactory = 
modelFactories.getFactory(XMLInputFactory.class);
-        XMLOutputFactory outputFactory = 
modelFactories.getFactory(XMLOutputFactory.class);
+        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
         outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, 
true);
         ContributionFactory contributionFactory = 
modelFactories.getFactory(ContributionFactory.class);
         PolicyFactory policyFactory = 
modelFactories.getFactory(PolicyFactory.class);
 
-        // Create model resolvers
-        modelResolvers = new DefaultModelResolverExtensionPoint();
-
         // Create artifact processors
         StAXArtifactProcessorExtensionPoint staxProcessors = new 
DefaultStAXArtifactProcessorExtensionPoint(modelFactories);
         StAXArtifactProcessor<Object> staxProcessor = new 
ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory);
         staxProcessors.addArtifactProcessor(new 
ContributionMetadataProcessor(assemblyFactory, contributionFactory, 
staxProcessor));
-        staxProcessors.addArtifactProcessor(new 
CompositeProcessor(contributionFactory, assemblyFactory, policyFactory, 
staxProcessor));
+        compositeProcessor = new CompositeProcessor(contributionFactory, 
assemblyFactory, policyFactory, staxProcessor);
+        staxProcessors.addArtifactProcessor(compositeProcessor);
 
         URLArtifactProcessorExtensionPoint urlProcessors = new 
DefaultURLArtifactProcessorExtensionPoint(modelFactories);
         URLArtifactProcessor<Object> urlProcessor = new 
ExtensibleURLArtifactProcessor(urlProcessors);
@@ -118,9 +142,17 @@
         urlProcessors.addArtifactProcessor(new 
ContributionGeneratedMetadataDocumentProcessor(staxProcessor, inputFactory));
         urlProcessors.addArtifactProcessor(new 
CompositeDocumentProcessor(staxProcessor, inputFactory));
         
-        // Create contribution processors
+        // Create contribution processor
+        modelResolvers = new DefaultModelResolverExtensionPoint();
         contributionContentProcessor = new 
ContributionContentProcessor(modelFactories, modelResolvers, urlProcessor);
 
+        // Create composite builder
+        SCABindingFactory scaBindingFactory = 
modelFactories.getFactory(SCABindingFactory.class);
+        IntentAttachPointTypeFactory intentAttachPointTypeFactory = 
modelFactories.getFactory(IntentAttachPointTypeFactory.class);
+        InterfaceContractMapper contractMapper = new 
InterfaceContractMapperImpl();
+        List<PolicySet> domainPolicySets = new ArrayList<PolicySet>();
+        compositeBuilder = new CompositeBuilderImpl(assemblyFactory, 
scaBindingFactory, intentAttachPointTypeFactory,
+                                                                               
             contractMapper, domainPolicySets, null);
     }
     
     public Entry<String, Item>[] getAll() {
@@ -132,7 +164,7 @@
 
         // Read contribution metadata
         for (Entry<String, Item> contributionEntry: contributionEntries) {
-            Contribution contribution;
+            Contribution contribution = 
contribution(contributionEntry.getKey(), contributionEntry.getData().getLink());
             try {
                 URI uri = URI.create(contributionEntry.getKey());
                 URL url = url(contributionEntry.getData().getLink());
@@ -146,9 +178,10 @@
             // Create entries for the deployable composites
             for (Composite deployable: contribution.getDeployables()) {
                 Entry<String, Item> entry = new Entry<String, Item>();
-                entry.setKey(name(deployable.getName()));
+                String key = key(contribution.getURI(), deployable.getName());
+                entry.setKey(key);
                 Item item = new Item();
-                item.setTitle(name(deployable.getName()));
+                item.setTitle(key);
                 item.setLink(deployableLink(contribution.getLocation(), 
deployable.getURI()));
                 entry.setData(item);
                 entries.add(entry);
@@ -159,7 +192,28 @@
     }
 
     public Item get(String key) throws NotFoundException {
-        throw new UnsupportedOperationException();
+
+        // Get the specified contribution info 
+        String contributionURI = uri(key);
+        Item contributionItem = contributionCollection.get(contributionURI);
+        
+        // Read the contribution
+        Contribution contribution = contribution(contributionURI, 
contributionItem.getLink());
+
+        // Find the specified deployable composite
+        QName qname = qname(key);
+        for (Composite deployable: contribution.getDeployables()) {
+            if (qname.equals(deployable.getName())) {
+                
+                // Return an item describing the deployable composite
+                Item item = new Item();
+                item.setTitle(key);
+                item.setLink(deployableLink(contribution.getLocation(), 
deployable.getURI()));
+                return item;
+            }
+        }
+
+        throw new NotFoundException();
     }
 
     public String post(String key, Item item) {
@@ -173,7 +227,7 @@
     public void delete(String key) throws NotFoundException {
         throw new UnsupportedOperationException();
     }
-
+    
     public Entry<String, Item>[] query(String queryString) {
         if (queryString.startsWith("contribution=")) {
 
@@ -182,31 +236,24 @@
             List<Entry<String, Item>> entries = new ArrayList<Entry<String, 
Item>>();
 
             // Get the specified contribution info 
-            String key = queryString.substring(13);
+            String contributionURI = queryString.substring(13);
             Item contributionItem;
             try {
-                contributionItem = contributionCollection.get(key);
+                contributionItem = contributionCollection.get(contributionURI);
             } catch (NotFoundException e) {
                 return entries.toArray(new Entry[entries.size()]);
             }
-
-            Contribution contribution;
-            try {
-                URI uri = URI.create(key);
-                URL url = url(contributionItem.getLink());
-                contribution = 
(Contribution)contributionContentProcessor.read(null, uri, url);
-                ModelResolver modelResolver = new 
ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
-                contributionContentProcessor.resolve(contribution, 
modelResolver);
-            } catch (Exception e) {
-                throw new ServiceRuntimeException(e);
-            }
+            
+            // Read the contribution
+            Contribution contribution = contribution(contributionURI, 
contributionItem.getLink());
 
             // Create entries for the deployable composites
             for (Composite deployable: contribution.getDeployables()) {
                 Entry<String, Item> entry = new Entry<String, Item>();
-                entry.setKey(name(deployable.getName()));
+                String key = key(contributionURI, deployable.getName());
+                entry.setKey(key);
                 Item item = new Item();
-                item.setTitle(name(deployable.getName()));
+                item.setTitle(key);
                 item.setLink(deployableLink(contribution.getLocation(), 
deployable.getURI()));
                 entry.setData(item);
                 entries.add(entry);
@@ -219,27 +266,152 @@
         }
     }
     
+    @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;
+
+        // Get the specified contribution info 
+        String contributionURI = uri(key);
+        Item contributionItem;
+        try {
+            contributionItem = contributionCollection.get(contributionURI);
+        } catch (NotFoundException e) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+        
+        // Read the contribution
+        Contribution contribution = contribution(contributionURI, 
contributionItem.getLink());
+
+        // Find the specified deployable composite
+        Composite deployable = null;
+        QName qname = qname(key);
+        for (Composite d: contribution.getDeployables()) {
+            if (qname.equals(d.getName())) {
+                deployable = d;
+                break;
+            }
+        }
+        if (deployable == null) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+        
+        // Build the composite
+        try {
+            compositeBuilder.build(deployable);
+        } catch (CompositeBuilderException e) {
+            throw new ServletException(e);
+        }
+        
+        // Write the deployable composite back to XML
+        try {
+            // First write to a byte stream
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
+            compositeProcessor.write(deployable, writer);
+            
+            // Parse again to pretty format the document
+            DocumentBuilder documentBuilder = 
DocumentBuilderFactory.newInstance().newDocumentBuilder();
+            Document document = documentBuilder.parse(new 
ByteArrayInputStream(bos.toByteArray()));
+            OutputFormat format = new OutputFormat();
+            format.setIndenting(true);
+            format.setIndent(2);
+            
+            // Write to domain.composite
+            XMLSerializer serializer = new 
XMLSerializer(response.getOutputStream(), format);
+            serializer.serialize(document);
+            
+        } catch (Exception e) {
+            throw new ServletException(e);
+        }
+    }
+
+    /**
+     * Returns the contribution with the given URI.
+     * 
+     * @param contributionURI
+     * @return
+     * @throws NotFoundException
+     */
+    private Contribution contribution(String contributionURI, String 
contributionURL) {
+        try {
+            URI uri = URI.create(contributionURI);
+            URL url = url(contributionURL);
+            Contribution contribution = 
(Contribution)contributionContentProcessor.read(null, uri, url);
+            ModelResolver modelResolver = new 
ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
+            contributionContentProcessor.resolve(contribution, modelResolver);
+            return contribution;
+
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+
+    /**
+     * Returns a link to a deployable composite.
+     * 
+     * If the containing contribution is a local directory, return the URI of  
the local composite file
+     * inside the contribution.
+     * 
+     * If the containing contribution is a local or remote file, return a URI 
of the form:
+     * /files/ contribution URI !/ composite URI.
+     * The contribution file servlet at '/files/' will open the contribution 
and extract the composite
+     * file from it.
+     *  
+     * @param contributionLocation
+     * @param deployableURI
+     * @return
+     */
     private static String deployableLink(String contributionLocation, String 
deployableURI) {
         URI uri = URI.create(contributionLocation);
-        if (uri.getPath().startsWith("/files/")) {
-            return contributionLocation + "!/" + deployableURI;
+        if ("file".equals(uri.getScheme())) {
+            if (new File(uri).isDirectory()) {
+                return contributionLocation + "/" + deployableURI;
+            } else {
+                return "/files/" + contributionLocation + "!/" + 
deployableURI; 
+            }
         } else {
-            return "/files/" + contributionLocation + "!/" + deployableURI;
+            if (uri.getPath().startsWith("/files/")) {
+                return contributionLocation + "!/" + deployableURI;
+            } else {
+                return "/files/" + contributionLocation + "!/" + deployableURI;
+            }
         }
     }
     
     /**
-     * Returns a qname expressed as namespace#localpart.
+     * Extracts a qname from a key expressed as 
contributionURI;namespace;localpart.
+     * @param key
+     * @return
+     */
+    private static QName qname(String key) {
+        int i = key.indexOf(';');
+        key = key.substring(i + 1);
+        i = key.indexOf(';');
+        return new QName(key.substring(0, i), key.substring(i + 1));
+    }
+    
+    /**
+     * Extracts a contribution uri from a key expressed as 
contributionURI;namespace;localpart.
+     * @param key
+     * @return
+     */
+    private static String uri(String key) {
+        int i = key.indexOf(';');
+        return key.substring("composite:".length(), i);
+    }
+    
+    /**
+     * Returns a composite key expressed as 
contributionURI;namespace;localpart.
      * @param qname
      * @return
      */
-    private static String name(QName qname) {
-        String ns = qname.getNamespaceURI();
-        if (ns != null) {
-            return ns + ';' + qname.getLocalPart();
-        } else {
-            return qname.getLocalPart();
-        }
+    private static String key(String uri, QName qname) {
+        return "composite:" + uri + ';' + qname.getNamespaceURI() + ';' + 
qname.getLocalPart();
     }
 
     /**

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
 Wed Mar  5 10:54:33 2008
@@ -88,7 +88,7 @@
     <component name="ContributionFileServiceComponent">
         <implementation.java 
class="org.apache.tuscany.sca.workspace.admin.impl.ContributionFileServiceImpl"/>
         <property name="directoryName">contributions</property>             
-               <service name="ContributionFileServiceImpl">
+               <service name="Servlet">
                        <t:binding.http uri="http://localhost:9990/files"/>
                </service>
     </component>
@@ -106,6 +106,9 @@
         <implementation.java 
class="org.apache.tuscany.sca.workspace.admin.impl.DeployableCompositeCollectionImpl"/>
                <service name="CompositeCollection">
                        <t:binding.atom uri="http://localhost:9990/deployable"/>
+               </service>
+               <service name="Servlet">
+                       <t:binding.http 
uri="http://localhost:9990/resolved/composite/"/>
                </service>
                <reference name="contributionCollection" 
target="ContributionCollectionComponent/LocalContributionCollection"/>
     </component>

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
 Wed Mar  5 10:54:33 2008
@@ -65,13 +65,12 @@
        }       
 
        function addComposite() {
-               var id  = document.newCompositeForm.compositeQName.value;
-               var location  = document.newCompositeForm.contributionURI.value;
+               var id  = 'composite:' +
+                       document.newCompositeForm.contributionURI.value + ';' +
+                       document.newCompositeForm.compositeQName.value;
                var entry = '<entry xmlns="http://www.w3.org/2005/Atom";>' +
-                               '<title>Contribution - ' + id +'</title>' +
+                               '<title>' + id +'</title>' +
                '<id>' + id + '</id>' +
-               '<link rel="alternate" href="' + location + '" />' +
-               '<link rel="edit" href="' + location + '" />' +
                        '</entry>';
                cloudComposite.post(entry, addCompositeResponse);
        }
@@ -108,8 +107,8 @@
   <b>Add Node</b>
   <form name="newCompositeForm">
     <table border="0">
-    <tr><td>QName:</td><td><input type="text" name="compositeQName" 
/></td></tr> 
     <tr><td>Contribution URI:</td><td><input type="text" 
name="contributionURI" /></td></tr>
+    <tr><td>QName:</td><td><input type="text" name="compositeQName" 
/></td></tr> 
     </table>
     <br/>
     <input type="button" onClick="addComposite()" value="Add" />

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
 Wed Mar  5 10:54:33 2008
@@ -43,6 +43,7 @@
                                composites += '<tr valign="bottom">'
                                composites += '<td><input name="composites" 
type="checkbox" value="' + id + '">' +
                                                                                
        '<a href=\"' + location + '\">' + id + '</a></td>';
+                               composites += '<td>&nbsp;&nbsp;&nbsp;<a 
href=\"/resolved/composite/' + id + '\">resolved</a></td>';
                                composites += '</tr>';
                        }
                        composites += '</table>';
@@ -65,13 +66,12 @@
        }       
 
        function addComposite() {
-               var id  = document.newCompositeForm.compositeQName.value;
-               var location  = document.newCompositeForm.contributionURI.value;
+               var id  = 'composite:' +
+                       document.newCompositeForm.contributionURI.value + ';' +
+                       document.newCompositeForm.compositeQName.value;
                var entry = '<entry xmlns="http://www.w3.org/2005/Atom";>' +
-                               '<title>Contribution - ' + id +'</title>' +
+                               '<title>' + id +'</title>' +
                '<id>' + id + '</id>' +
-               '<link rel="alternate" href="' + location + '" />' +
-               '<link rel="edit" href="' + location + '" />' +
                        '</entry>';
                domainComposite.post(entry, addCompositeResponse);
        }
@@ -104,8 +104,8 @@
   <b>Add Composite</b>
   <form name="newCompositeForm">
     <table border="0">
-    <tr><td>QName:</td><td><input type="text" name="compositeQName" 
/></td></tr> 
     <tr><td>Contribution URI:</td><td><input type="text" 
name="contributionURI" /></td></tr>
+    <tr><td>QName:</td><td><input type="text" name="compositeQName" 
/></td></tr> 
     </table>
     <br/>
     <input type="button" onClick="addComposite()" value="Add" />

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
 Wed Mar  5 10:54:33 2008
@@ -63,7 +63,7 @@
         contributionCollection.workspaceFileName = url.getFile();
         deployableCollection = new DeployableCompositeCollectionImpl();
         deployableCollection.contributionCollection = contributionCollection;
-        contributionCollection.init();
+        contributionCollection.initialize();
         deployableCollection.init();
         
         // Populate the workspace with test data



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to