Author: jsdelfino
Date: Mon Mar  3 10:13:51 2008
New Revision: 633220

URL: http://svn.apache.org/viewvc?rev=633220&view=rev
Log:
Improved admin app UI, added a toolbar. Added code to represent one checkbox or 
multiple checkboxes consistently in an array. Added support for finding 
deployables inside contributions and returning their URL.

Added:
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
   (with props)
    
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/resources/home.html 
  (with props)
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js  
 (with props)
Modified:
    
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/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/main/resources/files.html
    
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
    
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java

Added: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java?rev=633220&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
 (added)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
 Mon Mar  3 10:13:51 2008
@@ -0,0 +1,32 @@
+/*
+ * 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.workspace.admin;
+
+import org.apache.tuscany.sca.implementation.data.collection.Collection;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+
+/**
+ * A local interface for the composite collection service.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface LocalCompositeCollection extends Collection<String, Item>{
+
+}

Propchange: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
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=633220&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
 (added)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
 Mon Mar  3 10:13:51 2008
@@ -0,0 +1,269 @@
+/*
+ * 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.workspace.admin.impl;
+
+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.util.ArrayList;
+import java.util.List;
+
+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.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.contribution.service.ContributionReadException;
+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.policy.PolicyFactory;
+import org.apache.tuscany.sca.workspace.admin.CompositeCollection;
+import org.apache.tuscany.sca.workspace.admin.LocalCompositeCollection;
+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.w3c.dom.Document;
+
+/**
+ * Implementation of a composite collection service. 
+ *
+ * @version $Rev$ $Date$
+ */
[EMAIL PROTECTED]("COMPOSITE")
+public class CompositeCollectionImpl implements CompositeCollection {
+    
+    @Property
+    public String compositeFileName;
+    
+    @Reference
+    public LocalCompositeCollection deployableCompositeCollection;
+
+    private AssemblyFactory assemblyFactory;
+    private Composite compositeCollection;
+    private CompositeProcessor compositeProcessor;
+    private XMLOutputFactory outputFactory;
+    
+    /**
+     * Initialize the workspace administration component.
+     */
+    @Init
+    public void init() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
+        
+        // Create factories
+        ModelFactoryExtensionPoint modelFactories = new 
DefaultModelFactoryExtensionPoint();
+        assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, 
true);
+        
+        // Read domain.composite
+        ContributionFactory contributionFactory = 
modelFactories.getFactory(ContributionFactory.class);
+        PolicyFactory policyFactory = 
modelFactories.getFactory(PolicyFactory.class);
+        compositeProcessor = new CompositeProcessor(contributionFactory, 
assemblyFactory, policyFactory, null);
+        File file = new File(compositeFileName);
+        if (file.exists()) {
+            XMLInputFactory inputFactory = 
modelFactories.getFactory(XMLInputFactory.class);
+            FileInputStream is = new FileInputStream(file);
+            XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
+            compositeCollection = compositeProcessor.read(reader);
+        } else {
+            compositeCollection = assemblyFactory.createComposite();
+            compositeCollection.setName(new QName(Constants.SCA10_TUSCANY_NS, 
compositeFileName));
+        }
+    }
+    
+    public Entry<String, Item>[] getAll() {
+        // Return all the composites in the domain composite
+        List<Entry<String, Item>> entries = new ArrayList<Entry<String, 
Item>>();
+        for (Composite composite: compositeCollection.getIncludes()) {
+            Entry<String, Item> entry = new Entry<String, Item>();
+            QName qname = composite.getName();
+            entry.setKey(name(qname));
+            Item item = new Item();
+            item.setTitle(name(qname));
+            item.setLink(compositeLink(qname, composite.getURI()));
+            entry.setData(item);
+            entries.add(entry);
+        }
+        return entries.toArray(new Entry[entries.size()]);
+    }
+
+    public Item get(String key) throws NotFoundException {
+
+        // Returns the composite with the given name key
+        for (Composite composite: compositeCollection.getIncludes()) {
+            QName qname = composite.getName();
+            if (key.equals(name(qname))) {
+                Item item = new Item();
+                item.setTitle(name(qname));
+                item.setLink(compositeLink(qname, composite.getURI()));
+                return item;
+            }
+        }
+        throw new NotFoundException(key);
+    }
+
+    public String post(String key, Item item) {
+        
+        // Adds a new composite to the domain composite
+        Composite composite = assemblyFactory.createComposite();
+        composite.setName(qname(key));
+        composite.setURI(item.getLink());
+        composite.setUnresolved(true);
+        compositeCollection.getIncludes().add(composite);
+        
+        // Write the domain composite
+        write();
+        
+        return key;
+    }
+
+    public void put(String key, Item item) throws NotFoundException {
+        
+        // Update a composite already in the domain composite
+        Composite newComposite = assemblyFactory.createComposite();
+        newComposite.setName(qname(key));
+        newComposite.setURI(item.getLink());
+        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)) {
+                composites.set(i, newComposite);
+                
+                // Write the domain composite
+                write();
+                
+                return;
+            }
+        }
+        throw new NotFoundException(key);
+    }
+
+    public void delete(String key) throws NotFoundException {
+        
+        // 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)) {
+                composites.remove(i);
+
+                // Write the domain composite
+                write();
+                
+                return;
+            }
+        }
+        throw new NotFoundException(key);
+    }
+
+    public Entry<String, Item>[] query(String queryString) {
+        if (queryString.startsWith("usedBy=")) {
+            //FIXME Invoke the Composite processing code from workspace-impl
+            return getAll();
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+    
+    /**
+     * Write the domain composite back to disk
+     */
+    private void write() {
+        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
+            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
+            FileOutputStream os = new FileOutputStream(new 
File(compositeFileName));
+            XMLSerializer serializer = new XMLSerializer(os, format);
+            serializer.serialize(document);
+            
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+    
+    private String compositeLink(QName qname, String contributionURI) {
+        String name = name(qname);
+        Entry<String, Item>[] entries = 
deployableCompositeCollection.query("contribution=" + contributionURI);
+        for (Entry<String, Item> entry: entries) {
+            if (name.equals(entry.getKey())) {
+                return entry.getData().getLink();
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Returns a qname object from its expression as namespace#localpart.
+     * @param name
+     * @return
+     */
+    private static QName qname(String name) {
+        int i = name.indexOf('}');
+        if (i != -1) {
+            return new QName(name.substring(1, i), name.substring(i + 1));
+        } else {
+            return new QName(name);
+        }
+    }
+    
+    /**
+     * Returns a qname expressed as 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();
+        }
+    }
+}

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -109,6 +109,7 @@
         // 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);
@@ -219,7 +220,7 @@
     }
 
     public Entry<String, Item>[] query(String queryString) {
-        if (queryString.startsWith("importedBy=")) {
+        if (queryString.startsWith("requiredBy=")) {
             
             // Return the collection of dependencies of the specified 
contribution
             List<Entry<String, Item>> entries = new 
ArrayList<Entry<String,Item>>();
@@ -241,10 +242,8 @@
             String key = queryString.substring(11);
             for (Contribution contribution: 
dependencyWorkspace.getContributions()) {
                 if (key.equals(contribution.getURI())) {
-                    entries.add(entry(contribution));
-                    
                     ContributionDependencyAnalyzer analyzer = new 
ContributionDependencyAnalyzer();
-                    Set<Contribution> dependencies = 
analyzer.calculateContributionDependencies(dependencyWorkspace, contribution);
+                    List<Contribution> dependencies = 
analyzer.calculateContributionDependencies(dependencyWorkspace, contribution);
                     
                     // Build the collection of dependencies
                     for (Contribution dependency: dependencies) {

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -20,9 +20,11 @@
 package org.apache.tuscany.sca.workspace.admin.impl;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URLDecoder;
 import java.util.List;
 
 import javax.servlet.ServletException;
@@ -86,13 +88,38 @@
     @Override
     protected void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
         
-        // Download a contribution
-        String path = request.getPathInfo();
+        // Download a contribution file
+        String requestURI = URLDecoder.decode(request.getRequestURI(), 
"UTF-8");
+        String path = requestURI.substring(request.getServletPath().length());
         if (path.startsWith("/")) {
             path = path.substring(1);
         }
         try {
-            FileInputStream is = new FileInputStream(new File(files, path));
+            URI uri = URI.create(path);
+            
+            // Default to file protocol
+            if (uri.getScheme() == null) {
+                uri = new File(files, path).toURI();
+            }
+            
+            // Support the following syntaxes
+            // foo.jar!/file.txt
+            // directory!/file.txt
+            // directory/!/file.txt
+            String str = uri.toString();
+            int e = str.indexOf("!/"); 
+            if (e != -1) {
+                int s = str.lastIndexOf('/', e - 2) +1;
+                if (str.substring(s, e).contains(".")) {
+                    str = "jar:" + str;
+                } else {
+                    str = str.substring(0, e) + str.substring(e + 1);
+                }
+                uri = URI.create(str);
+            }
+            
+            // Read the file and write to response 
+            InputStream is = uri.toURL().openStream();
             ServletOutputStream os = response.getOutputStream();
             byte[] buffer = new byte[4096];
             for (;;) {
@@ -104,6 +131,7 @@
             }
             is.close();
             os.flush();
+            
       } catch (FileNotFoundException e) {
           response.sendError(HttpServletResponse.SC_NOT_FOUND);
       }

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -35,6 +35,8 @@
 
 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;
@@ -48,6 +50,8 @@
 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.ExtensibleModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import 
org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
 import org.apache.tuscany.sca.contribution.service.ContributionReadException;
 import 
org.apache.tuscany.sca.contribution.xml.ContributionGeneratedMetadataDocumentProcessor;
@@ -56,13 +60,16 @@
 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.policy.PolicyFactory;
 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.ContributionInfoProcessor;
+import 
org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
 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;
 
 /**
  * Implementation of a deployable composite collection service. 
@@ -70,13 +77,16 @@
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
-public class DeployableCompositeCollectionImpl implements CompositeCollection {
[EMAIL PROTECTED](interfaces={CompositeCollection.class, 
LocalCompositeCollection.class})
+public class DeployableCompositeCollectionImpl implements CompositeCollection, 
LocalCompositeCollection {
     
     @Reference
     public LocalContributionCollection contributionCollection;
 
+    private ModelFactoryExtensionPoint modelFactories;
+    private ModelResolverExtensionPoint modelResolvers;
     private AssemblyFactory assemblyFactory;
-    private URLArtifactProcessor<Contribution> contributionInfoProcessor;
+    private URLArtifactProcessor<Contribution> contributionContentProcessor;
     
     /**
      * Initialize the workspace administration component.
@@ -85,27 +95,31 @@
     public void init() throws IOException, ContributionReadException, 
XMLStreamException, ParserConfigurationException {
         
         // Create factories
-        ModelFactoryExtensionPoint modelFactories = new 
DefaultModelFactoryExtensionPoint();
+        modelFactories = new DefaultModelFactoryExtensionPoint();
         assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
         XMLInputFactory inputFactory = 
modelFactories.getFactory(XMLInputFactory.class);
         XMLOutputFactory 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
-        ModelResolverExtensionPoint modelResolvers = new 
DefaultModelResolverExtensionPoint();
+        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));
 
         URLArtifactProcessorExtensionPoint urlProcessors = new 
DefaultURLArtifactProcessorExtensionPoint(modelFactories);
         URLArtifactProcessor<Object> urlProcessor = new 
ExtensibleURLArtifactProcessor(urlProcessors);
         urlProcessors.addArtifactProcessor(new 
ContributionMetadataDocumentProcessor(staxProcessor, inputFactory));
         urlProcessors.addArtifactProcessor(new 
ContributionGeneratedMetadataDocumentProcessor(staxProcessor, inputFactory));
+        urlProcessors.addArtifactProcessor(new 
CompositeDocumentProcessor(staxProcessor, inputFactory));
         
-        // Create contribution info processor
-        contributionInfoProcessor = new 
ContributionInfoProcessor(modelFactories, modelResolvers, urlProcessor);
+        // Create contribution processors
+        contributionContentProcessor = new 
ContributionContentProcessor(modelFactories, modelResolvers, urlProcessor);
 
     }
     
@@ -122,7 +136,9 @@
             try {
                 URI uri = URI.create(contributionEntry.getKey());
                 URL url = url(contributionEntry.getData().getLink());
-                contribution = 
(Contribution)contributionInfoProcessor.read(null, uri, url);
+                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);
             }
@@ -133,7 +149,7 @@
                 entry.setKey(name(deployable.getName()));
                 Item item = new Item();
                 item.setTitle(name(deployable.getName()));
-                item.setLink("/workspace/" + contribution.getURI());
+                item.setLink(deployableLink(contribution.getLocation(), 
deployable.getURI()));
                 entry.setData(item);
                 entries.add(entry);
             }
@@ -171,14 +187,16 @@
             try {
                 contributionItem = contributionCollection.get(key);
             } catch (NotFoundException e) {
-                return null;
+                return entries.toArray(new Entry[entries.size()]);
             }
 
             Contribution contribution;
             try {
                 URI uri = URI.create(key);
                 URL url = url(contributionItem.getLink());
-                contribution = 
(Contribution)contributionInfoProcessor.read(null, uri, url);
+                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);
             }
@@ -189,7 +207,7 @@
                 entry.setKey(name(deployable.getName()));
                 Item item = new Item();
                 item.setTitle(name(deployable.getName()));
-                item.setLink("/workspace/" + deployable.getURI());
+                item.setLink(deployableLink(contribution.getLocation(), 
deployable.getURI()));
                 entry.setData(item);
                 entries.add(entry);
             }
@@ -198,6 +216,15 @@
             
         } else {
             throw new UnsupportedOperationException();
+        }
+    }
+    
+    private static String deployableLink(String contributionLocation, String 
deployableURI) {
+        URI uri = URI.create(contributionLocation);
+        if (uri.getPath().startsWith("/files/")) {
+            return contributionLocation + "!/" + deployableURI;
+        } else {
+            return "/files/" + contributionLocation + "!/" + deployableURI;
         }
     }
     

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -22,6 +22,13 @@
        targetNamespace="http://tuscany.apache.org/xmlns/sca/1.0";
     name="Admin">
 
+    <component name="AdminUI">
+        <t:implementation.widget location="home.html"/>
+        <service name="Widget">
+               <t:binding.http uri="http://localhost:9990/ui/home"/>
+        </service>
+    </component>
+    
     <component name="ContributionUI">
         <t:implementation.widget location="workspace.html"/>
         <service name="Widget">
@@ -47,7 +54,7 @@
         <service name="Widget">
                <t:binding.http uri="http://localhost:9990/ui/composite"/>
         </service>
-                <reference name="domainComposite" 
target="DomainCompositeCollectionComponent">
+                <reference name="domainComposite" 
target="DomainCompositeCollectionComponent/CompositeCollection">
                        <t:binding.atom/>
                 </reference>
     </component>
@@ -57,7 +64,7 @@
         <service name="Widget">
                <t:binding.http uri="http://localhost:9990/ui/cloud"/>
         </service>
-                <reference name="cloudComposite" 
target="CloudCollectionComponent">
+                <reference name="cloudComposite" 
target="CloudCollectionComponent/CompositeCollection">
                        <t:binding.atom/>
                 </reference>
     </component>
@@ -92,6 +99,7 @@
                <service name="CompositeCollection">
                        <t:binding.atom uri="http://localhost:9990/composite"/>
                </service>
+        <reference name="deployableCompositeCollection" 
target="DeployableCompositeCollectionComponent/LocalCompositeCollection"/>
     </component>
 
     <component name="DeployableCompositeCollectionComponent">
@@ -108,6 +116,7 @@
                <service name="CompositeCollection">
                        <t:binding.atom uri="http://localhost:9990/cloud"/>
                </service>
+        <reference name="deployableCompositeCollection" 
target="DeployableCompositeCollectionComponent/LocalCompositeCollection"/>
     </component>
 
 </composite>

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -21,6 +21,7 @@
 <title>SCA Node Cloud</title>
 
 <script type="text/javascript" src="cloud.js"></script>
+<script type="text/javascript" src="utils.js"></script>
 
 <script language="JavaScript">
 
@@ -50,7 +51,7 @@
        }
 
        function deleteComposite() {
-               var composites  = document.cloudCompositeForm.composites;
+               var composites  = array(document.cloudCompositeForm.composites);
                for (var i = 0; i < composites.length; i++) {
                        if (composites[i].checked) {
                            var id = composites[i].value;
@@ -82,24 +83,29 @@
        }       
 
        getComposites();
+
 </script>
 
 </head>
 
-<body>
+<body onload="toolbar()">
+  <div id="toolbar"></div>
+
   <div id="cloudComposite">
   <p style="font-size:150%">
-  <b>SCA Node Cloud</b>&nbsp;<a href="/cloud/"><img src="icons/feed-icon.png" 
border="0"></a>
+  <b>SCA Domain</b><br><br><b>Node Cloud</b>&nbsp;<a href="/cloud/"><img 
src="icons/feed-icon.png" border="0"></a>
   </p>
   <form name="cloudCompositeForm">
     <div id="composites" ></div>
     <br/>
+    <input type="button" onClick="startComposite()"  value="Start" />
+    <input type="button" onClick="stopComposite()"  value="Stop" />
+    &nbsp;&nbsp;
     <input type="button" onClick="deleteComposite()"  value="Delete" />
-    <a href="/cloud/">(feed)</a>
   </form>
   <br/>
   
-  <b>Add Composite</b>
+  <b>Add Node</b>
   <form name="newCompositeForm">
     <table border="0">
     <tr><td>QName:</td><td><input type="text" name="compositeQName" 
/></td></tr> 
@@ -111,4 +117,5 @@
   
   </div>
 </body>
+
 </html>

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -21,6 +21,7 @@
 <title>SCA Domain Composites</title>
 
 <script type="text/javascript" src="composite.js"></script>
+<script type="text/javascript" src="utils.js"></script>
 
 <script language="JavaScript">
 
@@ -50,7 +51,7 @@
        }
 
        function deleteComposite() {
-               var composites  = document.domainCompositeForm.composites;
+               var composites  = 
array(document.domainCompositeForm.composites);
                for (var i = 0; i < composites.length; i++) {
                        if (composites[i].checked) {
                            var id = composites[i].value;
@@ -86,10 +87,12 @@
 
 </head>
 
-<body>
+<body onload="toolbar()">
+  <div id="toolbar"></div>
+
   <div id="domainComposite">
   <p style="font-size:150%">
-  <b>SCA Domain Composites</b>&nbsp;<a href="/composite/"><img 
src="icons/feed-icon.png" border="0"></a>
+  <b>SCA Domain</b><br><br><b>Included Composites</b>&nbsp;<a 
href="/composite/"><img src="icons/feed-icon.png" border="0"></a>
   </p>
   <form name="domainCompositeForm">
     <div id="composites" ></div>

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html?rev=633220&r1=633219&r2=633220&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html
 Mon Mar  3 10:13:51 2008
@@ -21,6 +21,7 @@
 <title>SCA Contribution File Server</title>
 
 <script type="text/javascript" src="files.js"></script>
+<script type="text/javascript" src="utils.js"></script>
 
 <script language="JavaScript">
 
@@ -46,7 +47,7 @@
        }                               
 
        function deleteFile() {
-               var list = document.filesForm.files;
+               var list = array(document.filesForm.files);
                for (var i=0; i < list.length; i++) {
                        if (list[i].checked) {
                            var id = list[i].value;
@@ -68,10 +69,12 @@
 
 </head>
 
-<body>
+<body onload="toolbar()">
+  <div id="toolbar"></div>
+
   <div id="fileServer">
   <p style="font-size:150%">
-  <b>SCA Contribution Files</b>&nbsp;<a href="/feed/files/"><img 
src="icons/feed-icon.png" border="0"></a>
+  <b>SCA Contribution File Server</b>&nbsp;<a href="/feed/files/"><img 
src="icons/feed-icon.png" border="0"></a>
   </p>
   <form name="filesForm">
     <div id="files" ></div>

Added: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html?rev=633220&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html 
(added)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html 
Mon Mar  3 10:13:51 2008
@@ -0,0 +1,47 @@
+<!--
+    * 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.    
+-->
+<html>
+<head>
+<title>SCA Admin</title>
+
+<script type="text/javascript" src="home.js"></script>
+<script type="text/javascript" src="utils.js"></script>
+
+<script language="JavaScript">
+</script>
+
+</head>
+
+<body onload="toolbar()">
+  <div id="toolbar"></div>
+  
+  <p style="font-size:150%">
+  <b>SCA Domain</b>
+  </p>
+  
+       <br><br><br><br><br>
+       <form>
+       <table border="0" align="center">
+       <tr><td valign="top"><span style="font-size:150%; color: 
blue">Search:</span></td><td><input type="text" name="search" 
size="50"/></td></tr>
+       <tr><td></td><td align="center"><input type="button" name="search" 
value="Search" /></td></tr>
+       </table>
+       </form>
+
+</body>
+</html>

Propchange: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js?rev=633220&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js 
(added)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js 
Mon Mar  3 10:13:51 2008
@@ -0,0 +1,74 @@
+/*
+ * 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.    
+ */
+ 
+function Tool(name, href) {
+       this.name = name;
+       this.href = href;
+}
+
+Tool.prototype.print = function() {
+    var loc = '' + location;
+       if (loc.match(this.href) == null) {
+               return '<a href="' + this.href + '" style="color: blue">' + 
this.name + '</a>';
+       } else {
+               return '<span>' + this.name + '</span>';
+       }
+}
+
+function toolbar() {
+
+       var toolbar = '<table border="0" cellspacing="0" cellpadding="0" 
width="100%" ' +
+       ' style="padding-bottom: 2px; border-bottom: 1px solid blue"><tr>' + 
+       '<td>' +
+       '<table border="0" cellspacing="0" cellpadding="0"><tr>';
+   
+       for (var i = 0; i < tools.length; i++) {
+          toolbar = toolbar + '<td>' +tools[i].print() + 
'&nbsp;&nbsp;&nbsp;</td>'
+       }
+   
+       toolbar = toolbar + '</tr></table>' + 
+       '</td>' +
+       '<td>' +
+       '<table border="0" cellspacing="0" cellpadding="0" align="right"><tr>' +
+       '<td>' + home.print() + '</td>' +
+       '</tr></table>' +
+       '</td>' + 
+       '</tr></table>';
+
+       document.getElementById('toolbar').innerHTML = toolbar;
+}
+
+function array(obj) {
+    if (obj.length == undefined) {
+               var a = new Array();
+               a[0] = obj;
+               return a;
+       }
+       else {
+               return obj;
+       }
+}
+
+var tools = new Array();
+tools[0] = new Tool("Contributions", "/ui/workspace");
+tools[1] = new Tool("Composites", "/ui/composite");
+tools[2] = new Tool("Nodes", "/ui/cloud");
+tools[3] = new Tool("Files", "/ui/files");
+
+var home = new Tool("Home", "/ui/home");

Propchange: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html?rev=633220&r1=633219&r2=633220&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
 (original)
+++ 
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
 Mon Mar  3 10:13:51 2008
@@ -21,6 +21,7 @@
 <title>SCA Contributions</title>
 
 <script type="text/javascript" src="workspace.js"></script>
+<script type="text/javascript" src="utils.js"></script>
 
 <script language="JavaScript">
 
@@ -42,7 +43,7 @@
                                contributions += '<tr valign="bottom">'
                                contributions += '<td><input 
name="contributions" type="checkbox" value="' + id + '">' +
                                                                                
        '<a href=\"' + location + '\">' + id + '</a></td>';
-                               contributions += '<td>&nbsp;&nbsp;&nbsp;<a 
href=\"/workspace/?importedBy=' + id + '\">dependencies</a></td>';
+                               contributions += '<td>&nbsp;&nbsp;&nbsp;<a 
href=\"/workspace/?requiredBy=' + id + '\">dependencies</a></td>';
                                contributions += '<td>&nbsp;&nbsp;&nbsp;<a 
href=\"/deployable/?contribution=' + id + '\">deployables</a></td>';
                                contributions += '</tr>';
                        }
@@ -52,7 +53,7 @@
        }                               
 
        function deleteContribution() {
-               var contributions  = document.workspaceForm.contributions;
+               var contributions  = 
array(document.workspaceForm.contributions);
                for (var i=0; i < contributions.length; i++) {
                        if (contributions[i].checked) {
                            var id = contributions[i].value;
@@ -88,10 +89,12 @@
 
 </head>
 
-<body>
+<body onload="toolbar()">
+  <div id="toolbar"></div>
+
   <div id="workspace">
   <p style="font-size:150%">
-  <b>SCA Contributions</b>&nbsp;<a href="/workspace/"><img 
src="icons/feed-icon.png" border="0"></a>
+  <b>SCA Domain</b><br><br><b>Contributions</b>&nbsp;<a 
href="/workspace/"><img src="icons/feed-icon.png" border="0"></a>
   </p>
   <form name="workspaceForm">
     <div id="contributions" ></div>

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=633220&r1=633219&r2=633220&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
 Mon Mar  3 10:13:51 2008
@@ -86,12 +86,12 @@
     }
     
     public void testDependencies1() {
-        Entry<String, Item>[] entries = 
contributionCollection.query("importedBy=store");
+        Entry<String, Item>[] entries = 
contributionCollection.query("requiredBy=store");
         assertEquals(2, entries.length);
     }
     
     public void testDependencies2() {
-        Entry<String, Item>[] entries = 
contributionCollection.query("importedBy=assets");
+        Entry<String, Item>[] entries = 
contributionCollection.query("requiredBy=assets");
         assertEquals(1, entries.length);
         assertEquals("assets", entries[0].getKey());
     }



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

Reply via email to