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/03/21 21:11:21 UTC

svn commit: r639788 - in /incubator/tuscany/java/sca/modules: implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/ implementation-node-runtime/src/main/resources/ node2-launcher/src/main/java/org/apache/tuscany...

Author: jsdelfino
Date: Fri Mar 21 13:11:14 2008
New Revision: 639788

URL: http://svn.apache.org/viewvc?rev=639788&view=rev
Log:
Added logging calls. Added a ping and quickstart services to simplify the eclipse plugin launcher integration. Minor UI fixes. Simplified cloud contribution uri and namespace.

Added:
    incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java   (with props)
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java   (with props)
Modified:
    incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeProcessCollectionImpl.java
    incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/resources/NodeDaemon.composite
    incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/DomainNodeLauncher.java
    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/CompositeImageCollectionImpl.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/DeployableCompositeCollectionImpl.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployedCompositeCollectionImpl.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DomainAdminUtil.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileCollectionImpl.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileServiceImpl.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/DomainAdmin.composite
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html

Modified: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeProcessCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeProcessCollectionImpl.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeProcessCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeProcessCollectionImpl.java Fri Mar 21 13:11:14 2008
@@ -83,13 +83,24 @@
 
     public String post(String key, Item item) {
         logger.info("post " + key);
-        
-        // Start a new VM and add it to the collection
+
+        // If the VM is already running just return it
         SCANodeVM vm = vm(key);
         if (vm != null) {
-            return key;
+            if (vm.isAlive()) {
+                return key;
+            } else {
+                // Remove dead VM entry
+                try {
+                    vm.stop();
+                } catch (InterruptedException e) {
+                    throw new ServiceRuntimeException(e);
+                }
+                nodeVMs.remove(vm);
+            }
         }
-        
+
+        // Start a new VM and add it to the collection
         vm = new SCANodeVM(key);
         nodeVMs.add(0, vm);
         try {

Added: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java?rev=639788&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java Fri Mar 21 13:11:14 2008
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.implementation.node.launcher;
+
+import java.io.IOException;
+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.parsers.ParserConfigurationException;
+
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Implementation of a ping service component.
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={Servlet.class})
+public class PingServiceImpl extends HttpServlet {
+    private static final long serialVersionUID = -3477992129462720901L;
+
+    private final static Logger logger = Logger.getLogger(PingServiceImpl.class.getName());    
+
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() throws ParserConfigurationException {
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        logger.info("ping");
+        response.getWriter().print("<html><body><span id=\"ping\">OK</span></body></html>");
+    }
+    
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/PingServiceImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/resources/NodeDaemon.composite
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/resources/NodeDaemon.composite?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/resources/NodeDaemon.composite (original)
+++ incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/resources/NodeDaemon.composite Fri Mar 21 13:11:14 2008
@@ -25,7 +25,14 @@
     <component name="NodeProcessCollectionComponent">
         <implementation.java class="org.apache.tuscany.sca.implementation.node.launcher.NodeProcessCollectionImpl"/>
    		<service name="ItemCollection">
-   	 		<t:binding.atom uri="http://localhost:9991/process" title="Running Nodes"/>
+   	 		<t:binding.atom uri="http://localhost:9990/process" title="Log"/>
+   		</service>
+    </component>
+
+    <component name="PingServiceComponent">
+        <implementation.java class="org.apache.tuscany.sca.implementation.node.launcher.PingServiceImpl"/>
+   		<service name="Servlet">
+   	 		<t:binding.http uri="http://localhost:9990/ping"/>
    		</service>
     </component>
 

Modified: incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/DomainNodeLauncher.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/DomainNodeLauncher.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/DomainNodeLauncher.java (original)
+++ incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/DomainNodeLauncher.java Fri Mar 21 13:11:14 2008
@@ -33,7 +33,7 @@
     private final static Logger logger = Logger.getLogger(DomainNodeLauncher.class.getName());    
 
     public static void main(String[] args) throws Exception {
-        logger.info("Apache Tuscany SCA Domain Administration starting...");
+        logger.info("Apache Tuscany SCA Domain Manager starting...");
 
         Class<?> adminClass;
         Object admin;
@@ -60,11 +60,11 @@
             adminClass.getMethod("start").invoke(admin);
             
         } catch (Exception e) {
-            logger.log(Level.SEVERE, "SCA Domain Administration could not be started", e);
+            logger.log(Level.SEVERE, "SCA Domain Manager could not be started", e);
             throw e;
         }
         
-        logger.info("SCA Domain Administration started.");
+        logger.info("SCA Domain Manager started.");
         logger.info("Press enter to shutdown.");
         try {
             System.in.read();
@@ -74,7 +74,7 @@
         try {
             adminClass.getMethod("stop").invoke(admin);
         } catch (Exception e) {
-            logger.log(Level.SEVERE, "SCA Domain Administration could not be stopped", e);
+            logger.log(Level.SEVERE, "SCA Domain Manager could not be stopped", e);
             throw e;
         }
     }

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=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/pom.xml Fri Mar 21 13:11:14 2008
@@ -26,7 +26,7 @@
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>tuscany-workspace-admin</artifactId>
-    <name>Apache Tuscany SCA Domain Workspace Administration</name>
+    <name>Apache Tuscany SCA Domain Workspace Manager</name>
 
     <dependencies>
         <dependency>

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeImageCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeImageCollectionImpl.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeImageCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeImageCollectionImpl.java Fri Mar 21 13:11:14 2008
@@ -92,6 +92,8 @@
     }
     
     public Entry<String, Item>[] query(String queryString) {
+        logger.info("query " + queryString);
+        
         if (queryString.startsWith("composite=")) {
 
             // Expecting a key in the form:
@@ -136,6 +138,7 @@
         // 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

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=639788&r1=639787&r2=639788&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 Fri Mar 21 13:11:14 2008
@@ -154,6 +154,7 @@
     }
     
     public Entry<String, Item>[] getAll() {
+        logger.info("getAll");
 
         // Return all the contributions
         List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
@@ -169,6 +170,7 @@
     }
 
     public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
 
         // Returns the contribution with the given URI key
         Workspace workspace = readContributions(readWorkspace());
@@ -188,6 +190,7 @@
 
         // 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;
@@ -203,6 +206,7 @@
     }
 
     public String post(String key, Item item) {
+        logger.info("post " + key);
         
         // Adds a new contribution to the workspace
         Workspace workspace = readWorkspace();
@@ -238,6 +242,7 @@
     }
 
     public void delete(String key) throws NotFoundException {
+        logger.info("delete " + key);
         
         // Delete a contribution from the workspace
         Workspace workspace = readWorkspace();
@@ -255,6 +260,8 @@
     }
 
     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

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=639788&r1=639787&r2=639788&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 Fri Mar 21 13:11:14 2008
@@ -20,6 +20,7 @@
 package org.apache.tuscany.sca.workspace.admin.impl;
 
 import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.DEPLOYMENT_CONTRIBUTION_URI;
+import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.compositeAlternateLink;
 import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.compositeKey;
 import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.compositeQName;
 import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.compositeSourceLink;
@@ -27,7 +28,6 @@
 import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.contributionURI;
 import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.locationURL;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
@@ -55,6 +55,7 @@
 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;
@@ -205,6 +206,8 @@
     }
     
     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>>();
         
@@ -231,6 +234,7 @@
     }
 
     public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
 
         // Get the specified contribution info 
         String contributionURI = contributionURI(key);
@@ -270,6 +274,8 @@
     }
     
     public Entry<String, Item>[] query(String queryString) {
+        logger.info("query " + queryString);
+        
         if (queryString.startsWith("contribution=")) {
 
             // Return all the deployable composites in the specified
@@ -311,6 +317,7 @@
         // 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
@@ -576,55 +583,40 @@
     }
     
     /**
-     * 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:
-     * jar: contribution URI !/ composite URI.
-     *  
-     * @param contributionLocation
-     * @param deployableURI
-     * @return
-     */
-    private static String alternateLink(String contributionLocation, String deployableURI) {
-        URI uri = URI.create(contributionLocation);
-        if ("file".equals(uri.getScheme())) {
-            String path = uri.toString().substring(5);
-            File file = new File(path);
-            if (file.isDirectory()) {
-                if (contributionLocation.endsWith("/")) {
-                    return contributionLocation + deployableURI;
-                } else {
-                    return contributionLocation + "/" + deployableURI;
-                }
-            } else {
-                return contributionLocation + "!/" + deployableURI; 
-            }
-        } else {
-            return contributionLocation + "!/" + deployableURI;
-        }
-    }
-    
-    /**
-     * Returns the list of components in a composite.
+     * Returns the entry contents describing a composite.
      * 
      * @param composite
      * @return
      */
-    private static String components(Composite composite) {
+    private static String content(Composite composite) {
         StringBuffer sb = new StringBuffer();
         List<Component> components = composite.getComponents();
-        if (!components.isEmpty()) {
-            sb.append("Components: <span id=\"components\">");
-            for (int i = 0, n = components.size(); i < n; i++) {
-                Component component = components.get(i);
-                if (i != 0) {
+        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();
@@ -678,9 +670,9 @@
         String deployableURI = deployable.getURI();
         Item item = new Item();
         item.setTitle(compositeTitle(contributionURI, qname));
-        item.setContents(components(deployable));
+        item.setContents(content(deployable));
         item.setLink(compositeSourceLink(contributionURI, qname));
-        item.setAlternate(alternateLink(contributionLocation, deployableURI));
+        item.setAlternate(compositeAlternateLink(contributionLocation, deployableURI));
         item.setRelated(relatedLink(deployable));
         return item;
     }

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployedCompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployedCompositeCollectionImpl.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployedCompositeCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployedCompositeCollectionImpl.java Fri Mar 21 13:11:14 2008
@@ -129,6 +129,7 @@
     }
     
     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>>();
@@ -155,8 +156,20 @@
     }
 
     public Item get(String key) throws NotFoundException {
-        // Returns the composite with the given key
-        return deployableCollection.get(key);
+        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
@@ -169,6 +182,7 @@
         // 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;
@@ -211,6 +225,8 @@
     }
 
     public String post(String key, Item item) {
+        logger.info("post " + key);
+        
         String contributionURI = contributionURI(key);
         QName qname = compositeQName(key);
 
@@ -248,6 +264,8 @@
     }
 
     public void put(String key, Item item) throws NotFoundException {
+        logger.info("put " + key);
+
         String contributionURI = contributionURI(key);
         QName qname = compositeQName(key);
         
@@ -273,6 +291,8 @@
     }
 
     public void delete(String key) throws NotFoundException {
+        logger.info("delete " + key);
+        
         String contributionURI = contributionURI(key);
         QName qname = compositeQName(key);
         

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DomainAdminUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DomainAdminUtil.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DomainAdminUtil.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DomainAdminUtil.java Fri Mar 21 13:11:14 2008
@@ -33,7 +33,7 @@
  */
 public final class DomainAdminUtil {
 
-    static final String DEPLOYMENT_CONTRIBUTION_URI = "http://tuscany.apache.org/xmlns/sca/1.0/cloud";
+    static final String DEPLOYMENT_CONTRIBUTION_URI = "http://tuscany.apache.org/cloud";
 
     /**
      * Extracts a qname from a key expressed as contributionURI;namespace;localpart.
@@ -119,6 +119,38 @@
             return file.toURI().toURL();
         } else {
             return uri.toURL();
+        }
+    }
+
+    /**
+     * 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:
+     * jar: contribution URI !/ composite URI.
+     *  
+     * @param contributionLocation
+     * @param deployableURI
+     * @return
+     */
+    static String compositeAlternateLink(String contributionLocation, String deployableURI) {
+        URI uri = URI.create(contributionLocation);
+        if ("file".equals(uri.getScheme())) {
+            String path = uri.toString().substring(5);
+            File file = new File(path);
+            if (file.isDirectory()) {
+                if (contributionLocation.endsWith("/")) {
+                    return contributionLocation + deployableURI;
+                } else {
+                    return contributionLocation + "/" + deployableURI;
+                }
+            } else {
+                return contributionLocation + "!/" + deployableURI; 
+            }
+        } else {
+            return contributionLocation + "!/" + deployableURI;
         }
     }
 

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileCollectionImpl.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileCollectionImpl.java Fri Mar 21 13:11:14 2008
@@ -56,6 +56,8 @@
     }
     
     public Entry<String, Item>[] getAll() {
+        logger.info("getAll");
+        
         // Return all the files
         List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
         File directory = new File(directoryName);
@@ -71,6 +73,7 @@
     }
 
     public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
         return item(key);
     }
 
@@ -83,6 +86,8 @@
     }
 
     public void delete(String key) throws NotFoundException {
+        logger.info("delete " + key);
+
         File directory = new File(directoryName);
         File file = new File(directory, key);
         if (file.exists()) {

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileServiceImpl.java?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileServiceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/FileServiceImpl.java Fri Mar 21 13:11:14 2008
@@ -80,6 +80,7 @@
                     if (!directory.exists()) {
                         directory.mkdirs();
                     }
+                    logger.info("post " + item.getName());
                     item.write(new File(directory, item.getName()));
                 }
             }
@@ -101,6 +102,8 @@
         if (path.startsWith("/")) {
             path = path.substring(1);
         }
+        logger.info("get " + path);
+        
         try {
             
             // Analyze the given path

Added: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java?rev=639788&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java (added)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java Fri Mar 21 13:11:14 2008
@@ -0,0 +1,243 @@
+/*
+ * 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 static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.compositeKey;
+import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.compositeQName;
+import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.contributionURI;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URLDecoder;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+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 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.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 component that provides a quick start path for a
+ * composite in a contribution. 
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={Servlet.class})
+public class QuickStartServiceImpl extends HttpServlet {
+    private static final long serialVersionUID = -3477992129462720901L;
+
+    private final static Logger logger = Logger.getLogger(QuickStartServiceImpl.class.getName());    
+
+    @Reference
+    public LocalItemCollection contributionCollection;
+    
+    @Reference
+    public LocalItemCollection deployableCollection;
+
+    @Reference 
+    public LocalItemCollection domainCompositeCollection;
+    
+    @Reference
+    public LocalItemCollection cloudCollection;
+    
+    @Reference
+    public LocalItemCollection processCollection;
+    
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() throws ParserConfigurationException {
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        try {
+            
+            // Get the request path
+            String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+            if (path.startsWith("/")) {
+                path = path.substring(1);
+            }
+            
+            // Get the request parameters
+            String contributionURI = request.getParameter("contribution");
+            String contributionLocation = request.getParameter("location");
+            String compositeURI = request.getParameter("composite");
+            String start = request.getParameter("start");
+    
+            logger.info("Composite Quick Start.");
+            logger.info("Contribution URI: " + contributionURI);
+            logger.info("Contribution location: " + contributionLocation);
+            logger.info("Composite URI: " + compositeURI);
+            
+            // Look for the contribution in the workspace
+            Entry<String, Item>[] contributionEntries = contributionCollection.getAll();
+            Entry<String, Item> contributionEntry = null;
+            for (Entry<String, Item> entry: contributionEntries) {
+                if (contributionURI.equals(entry.getKey())) {
+                    contributionEntry = entry;
+                    break;
+                }
+            }
+            
+            // Add the contribution if necessary
+            if (contributionEntry == null) {
+                Item item = new Item();
+                item.setLink(contributionLocation);
+                contributionCollection.post(contributionURI, item);
+            }
+            
+            // Look for the specified deployable composite in the contribution
+            String compositeKey = null;
+            Entry<String, Item>[] deployableEntries = deployableCollection.query("contribution=" + contributionURI);
+            for (Entry<String, Item> entry: deployableEntries) {
+                Item item = entry.getData();
+                if (contributionURI.equals(contributionURI(entry.getKey())) && item.getAlternate().endsWith(compositeURI)) {
+                    compositeKey = entry.getKey();
+                    break;
+                }
+            }
+            
+            if (compositeKey == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND, compositeURI);
+                return;
+            }
+            
+            // Look for the deployable composite in the domain composite
+            try {
+                domainCompositeCollection.get(compositeKey);
+            } catch (NotFoundException e) {
+    
+                // Add the deployable composite to the domain composite
+                Item item = new Item();
+                domainCompositeCollection.post(compositeKey, item);
+            }
+    
+            // Check if the deployable composite is already assigned a node
+            Entry<String, Item>[] nodeEntries = cloudCollection.getAll();
+            String nodeName = null;
+            for (Entry<String, Item> entry: nodeEntries) {
+                Item item = entry.getData();
+                String related = item.getRelated();
+                if (related != null) {
+                    int c = related.indexOf("composite:");
+                    related = related.substring(c);
+                    if (compositeKey.equals(related)) {
+                        nodeName = compositeQName(entry.getKey()).getLocalPart();
+                    }
+                }
+            }
+            
+            // Create a new node for the composite if necessary
+            if (nodeName == null) {
+                
+                // Construct node name and key
+                QName compositeName = compositeQName(compositeKey); 
+                nodeName = compositeName.getLocalPart() + "Node"; 
+                String nodeKey = compositeKey("http://tuscany.apache.org/cloud", new QName("http://tuscany.apache.org/cloud", nodeName));
+                
+                // Find a free node port
+                Set<Integer> nodePorts = new HashSet<Integer>(); 
+                for (Entry<String, Item> entry: nodeEntries) {
+                    Item item = entry.getData();
+                    String content = item.getContents();
+                    if (content != null) {
+                        int bs = content.indexOf("<span id=\"nodeURI\">");
+                        if (bs != -1) {
+                            content = content.substring(bs + 19);
+                            int es = content.indexOf("</span>");
+                            if (es != -1) {
+                                content = content.substring(0, es);
+                                URI uri = URI.create(content);
+                                int port = uri.getPort();
+                                if (port != -1) {
+                                    nodePorts.add(port);
+                                }
+                            }
+                        }
+                    }
+                }
+                String nodeURI = null;
+                for (int port = 8100; port<8200; port++) {
+                    if (!nodePorts.contains(port)) {
+                        nodeURI = "http://localhost:" + port;
+                        break;
+                    }
+                }
+                if (nodeURI == null) {
+                    throw new RuntimeException("Couldn't find a free port for new node: " + nodeName);
+                }
+                
+                // Build the entry describing the node
+                Item item = new Item();
+                String content = 
+                                "<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\"\n" +
+                                "       xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.0\"\n" +
+                                "       targetNamespace=\"http://tuscany.apache.org/cloud\"\n" +
+                                "       xmlns:c=\"" + compositeName.getNamespaceURI() + "\"\n" +
+                                "       name=\"" + nodeName + "\">\n" +
+                                "\n" +
+                                "       <component name=\"" + nodeName + "\">\n" +
+                                "               <t:implementation.node uri=\"" + contributionURI + "\" composite=\"c:" + compositeName.getLocalPart() + "\"/>\n" +
+                                "               <service name=\"Node\">\n" +
+                                "                       <binding.ws uri=\"" + nodeURI + "\"/>\n" +
+                                "                       <t:binding.http uri=\"" + nodeURI + "\"/>\n" +
+                                "                       <t:binding.jsonrpc uri=\"" + nodeURI + "\"/>\n" +
+                                "                       <t:binding.atom uri=\"" + nodeURI + "\"/>\n" +
+                                "               </service>\n" +
+                                "       </component>\n" + 
+                                "</composite>";
+                item.setContents(content);
+    
+                // Create the new node
+                cloudCollection.post(nodeKey, item);
+            }
+            
+            // Finally, start the node
+            if ("true".equals(start)) {
+                processCollection.post(nodeName, new Item());
+            }
+            
+            response.getWriter().print("<html><body>Node <span id=\"node\">" + nodeName + "</span> OK.</body></html>");
+
+        } catch (Exception e) {
+            logger.log(Level.SEVERE, "Could not start composite", e);
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
+        }
+    }
+    
+}

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

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

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/DomainAdmin.composite
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/DomainAdmin.composite?rev=639788&r1=639787&r2=639788&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/DomainAdmin.composite (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/DomainAdmin.composite Fri Mar 21 13:11:14 2008
@@ -150,10 +150,29 @@
    		<reference name="cloudCollection" target="CloudCollectionComponent/LocalItemCollection"/>
     </component>
 
+    <component name="QuickStartServiceComponent">
+        <implementation.java class="org.apache.tuscany.sca.workspace.admin.impl.QuickStartServiceImpl"/>
+   		<service name="Servlet">
+   	 		<t:binding.http uri="http://localhost:9990/quickstart"/>
+   		</service>
+   		<reference name="contributionCollection" target="ContributionCollectionComponent/LocalItemCollection"/>
+        <reference name="deployableCollection" target="DeployableCompositeCollectionComponent/LocalItemCollection"/>
+   		<reference name="domainCompositeCollection" target="DomainCompositeCollectionComponent/LocalItemCollection"/>
+   		<reference name="cloudCollection" target="CloudCollectionComponent/LocalItemCollection"/>
+   		<reference name="processCollection" target="NodeProcessCollectionComponent/LocalItemCollection"/>
+    </component>
+
     <component name="NodeProcessCollectionComponent">
         <implementation.java class="org.apache.tuscany.sca.implementation.node.launcher.NodeProcessCollectionImpl"/>
    		<service name="ItemCollection">
    	 		<t:binding.atom uri="http://localhost:9990/process" title="Log"/>
+   		</service>
+    </component>
+
+    <component name="PingServiceComponent">
+        <implementation.java class="org.apache.tuscany.sca.implementation.node.launcher.PingServiceImpl"/>
+   		<service name="Servlet">
+   	 		<t:binding.http uri="http://localhost:9990/ping"/>
    		</service>
     </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=639788&r1=639787&r2=639788&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 Fri Mar 21 13:11:14 2008
@@ -83,19 +83,14 @@
 					}
 				}
 
+				var nodeName = compositeLocalName(nodeId);
+				nodeNames[i] = nodeName;
+				
 				var content = "";
 				if (entries[i].getElementsByTagName("content")[0].firstChild != null) {
 					content = entries[i].getElementsByTagName("content")[0].firstChild.nodeValue;
 				}
-				var bs = content.indexOf('<span id="components">');
-				if (bs != -1) {
-					var es = content.indexOf('</span>', bs); 
-					nodeName = content.substring(bs, es + 7);
-				}
 
-				var nodeName = compositeLocalName(nodeId);
-				nodeNames[i] = nodeName;
-				
 				composites += '<tr>'
 				if (content.indexOf('<span id="problem"') != -1) {
 					composites += '<td><input name="composites" type="checkbox" value="' + nodeId + '">' +
@@ -140,16 +135,16 @@
 		var compositeName = document.newCompositeForm.compositeName.value;
 		var contributionURI = document.newCompositeForm.contributionURI.value;
 		var id  = 'composite:' +
-			'http://tuscany.apache.org/xmlns/sca/1.0/cloud' + ';' +
-			'cloud:/' + ';' +
+			'http://tuscany.apache.org/cloud' + ';' +
+			'http://tuscany.apache.org/cloud' + ';' +
 			nodeName;
 			
 		var entry = '<entry xmlns="http://www.w3.org/2005/Atom">\n' +
               	'<id>' + id + '</id>\n' +
-              	'<content type="text/xml"\n>\n' + 
+              	'<content type="text/xml">\n' + 
   				'<composite	xmlns="http://www.osoa.org/xmlns/sca/1.0"\n' +
 				'	xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"\n' +
-				'	targetNamespace="cloud:/"\n' +
+				'	targetNamespace="http://tuscany.apache.org/cloud"\n' +
 				'	xmlns:c="' + compositeNamespace + '"\n' +
 				'	name="' + nodeName + '">\n' +
 				'\n' +
@@ -231,7 +226,7 @@
   <br>
   <span class=hd1>
   SCA Domain<br><br>
-  Cloud</b>&nbsp;<a href="/process/"><img src="icons/feed-icon.png" border="0"></a>
+  Cloud</b>&nbsp;<a href="/cloud/"><img src="icons/feed-icon.png" border="0"></a>
   </span>
   <br><br>
   Here is the list of SCA nodes configured in your SCA domain cloud.



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