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/23 19:05:37 UTC

svn commit: r640235 - in /incubator/tuscany/java/sca/modules: contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/ contribution-resource/...

Author: jsdelfino
Date: Sun Mar 23 11:05:34 2008
New Revision: 640235

URL: http://svn.apache.org/viewvc?rev=640235&view=rev
Log:
Fix for TUSCANY-2120, make the start admin Start/Stop/Log buttons work for other hosts than localhost. Also added some logging of contribution dependency resolution errors.

Added:
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/NodeProcessCollectionFacadeImpl.java   (with props)
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/
      - copied from r640047, incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/dependency/impl/
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java   (with props)
    incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/
    incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/
      - copied from r640047, incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/dependency/impl/
    incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java   (with props)
    incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/
    incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java   (with props)
    incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilderMonitor.java   (with props)
Removed:
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyAnalyzer.java
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/dependency/
    incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyAnalyzerTestCase.java
    incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/dependency/
Modified:
    incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaImportImpl.java
    incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceImportImpl.java
    incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceImportImpl.java
    incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/resources/NodeDaemon.composite
    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/DomainAdminUtil.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.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
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html

Modified: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaImportImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaImportImpl.java?rev=640235&r1=640234&r2=640235&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaImportImpl.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaImportImpl.java Sun Mar 23 11:05:34 2008
@@ -102,4 +102,9 @@
         
         return false;
     }
+    
+    @Override
+    public String toString() {
+        return String.valueOf(packageName);
+    }
 }

Modified: incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceImportImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceImportImpl.java?rev=640235&r1=640234&r2=640235&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceImportImpl.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceImportImpl.java Sun Mar 23 11:05:34 2008
@@ -84,4 +84,9 @@
         }
         return false;
     }
+    
+    @Override
+    public String toString() {
+        return String.valueOf(namespace);
+    }
 }

Modified: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceImportImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceImportImpl.java?rev=640235&r1=640234&r2=640235&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceImportImpl.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceImportImpl.java Sun Mar 23 11:05:34 2008
@@ -99,4 +99,9 @@
         }
         return false;
     }
+    
+    @Override
+    public String toString() {
+        return String.valueOf(uri);
+    }
 }

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=640235&r1=640234&r2=640235&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 Sun Mar 23 11:05:34 2008
@@ -25,7 +25,7 @@
     <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"/>
+   	 		<t:binding.atom uri="http://localhost:9990/node/processes" title="Log"/>
    		</service>
     </component>
 

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=640235&r1=640234&r2=640235&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 Sun Mar 23 11:05:34 2008
@@ -30,6 +30,7 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLDecoder;
@@ -53,6 +54,7 @@
 
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.builder.Problem;
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
 import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
@@ -77,7 +79,9 @@
 import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
 import org.apache.tuscany.sca.workspace.Workspace;
 import org.apache.tuscany.sca.workspace.WorkspaceFactory;
-import org.apache.tuscany.sca.workspace.dependency.impl.ContributionDependencyAnalyzer;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilder;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilderMonitor;
+import org.apache.tuscany.sca.workspace.builder.impl.ContributionDependencyBuilderImpl;
 import org.apache.tuscany.sca.workspace.processor.impl.ContributionInfoProcessor;
 import org.apache.tuscany.sca.workspace.xml.WorkspaceProcessor;
 import org.apache.xml.serialize.OutputFormat;
@@ -212,7 +216,11 @@
         Workspace workspace = readWorkspace();
         Contribution contribution = contributionFactory.createContribution();
         contribution.setURI(key);
-        contribution.setLocation(item.getLink());
+        try {
+            contribution.setLocation(locationURL(item.getLink()).toString());
+        } catch (MalformedURLException e) {
+            throw new ServiceRuntimeException(e);
+        }
         workspace.getContributions().add(contribution);
         
         // Write the workspace
@@ -227,7 +235,11 @@
         Workspace workspace = readWorkspace();
         Contribution newContribution = contributionFactory.createContribution();
         newContribution.setURI(key);
-        newContribution.setLocation(item.getLink());
+        try {
+            newContribution.setLocation(locationURL(item.getLink()).toString());
+        } catch (MalformedURLException e) {
+            throw new ServiceRuntimeException(e);
+        }
         List<Contribution> contributions = workspace.getContributions();
         for (int i = 0, n = contributions.size(); i < n; i++) {
             if (contributions.get(i).getURI().equals(key)) {
@@ -279,8 +291,8 @@
                 if (key.equals(contribution.getURI())) {
 
                     // Compute the contribution dependencies
-                    ContributionDependencyAnalyzer analyzer = new ContributionDependencyAnalyzer();
-                    List<Contribution> dependencies = analyzer.calculateContributionDependencies(workspace, contribution);
+                    ContributionDependencyBuilder analyzer = new ContributionDependencyBuilderImpl(null);
+                    List<Contribution> dependencies = analyzer.buildContributionDependencies(workspace, contribution);
                     
                     // Returns entries for the dependencies
                     // optionally skip the specified contribution
@@ -329,9 +341,16 @@
         item.setAlternate(contribution.getLocation());
         
         // List the contribution dependencies in the item contents
+        final List<String> problems = new ArrayList<String>();
+        ContributionDependencyBuilderMonitor monitor = new ContributionDependencyBuilderMonitor() {
+            public void problem(Problem problem) {
+                problems.add(problem.getMessage() + " " + problem.getModel());
+            }
+        };
+        
         StringBuffer sb = new StringBuffer();
-        ContributionDependencyAnalyzer analyzer = new ContributionDependencyAnalyzer();
-        List<Contribution> dependencies = analyzer.calculateContributionDependencies(workspace, contribution);
+        ContributionDependencyBuilderImpl analyzer = new ContributionDependencyBuilderImpl(monitor);
+        List<Contribution> dependencies = analyzer.buildContributionDependencies(workspace, contribution);
         if (dependencies.size() > 1) {
             sb.append("Dependencies: <span id=\"dependencies\">");
             for (int i = 0, n = dependencies.size(); i < n ; i++) {
@@ -362,7 +381,16 @@
             sb.append("</span><br>");
         }
         
-        // Store the two lists in the item contents
+        // List the dependency problems
+        if (problems.size() > 1) {
+            sb.append("<span id=\"problems\" style=\"color: red\">");
+            for (int i = 0, n = problems.size(); i < n ; i++) {
+                sb.append("Problem: "+ problems.get(i) + "<br>");
+            }
+            sb.append("</span>");
+        }
+        
+        // Store in the item contents
         item.setContents(sb.toString());
         
         return item;

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=640235&r1=640234&r2=640235&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 Sun Mar 23 11:05:34 2008
@@ -154,4 +154,23 @@
         }
     }
 
+    /**
+     * Extract a node URI from an ATOM entry content.
+     * 
+     * @param content
+     * @return
+     */
+    static String nodeURI(String content) {
+        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) {
+                    return content.substring(0, es);
+                }
+            }
+        }
+        return null;
+    }
 }

Added: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/NodeProcessCollectionFacadeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/NodeProcessCollectionFacadeImpl.java?rev=640235&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/NodeProcessCollectionFacadeImpl.java (added)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/NodeProcessCollectionFacadeImpl.java Sun Mar 23 11:05:34 2008
@@ -0,0 +1,211 @@
+/*
+ * 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.compositeQName;
+import static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.nodeURI;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.implementation.data.collection.Entry;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+import org.apache.tuscany.sca.implementation.data.collection.ItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.osoa.sca.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 node process collection service. 
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(interfaces={ItemCollection.class, LocalItemCollection.class})
+public class NodeProcessCollectionFacadeImpl implements ItemCollection, LocalItemCollection {
+
+    private final static Logger logger = Logger.getLogger(NodeProcessCollectionFacadeImpl.class.getName());    
+
+    @Reference
+    public LocalItemCollection cloudCollection;
+    
+    @Reference
+    public ItemCollection processCollection;
+
+    /**
+     * Initialize the component.
+     */
+    @Init
+    public void initialize() {
+    }
+    
+    public Entry<String, Item>[] getAll() {
+        logger.info("getAll");
+        
+        // Get the collection of nodes
+        Entry<String, Item>[] nodeEntries = cloudCollection.getAll();
+
+        // Dispatch to the hosts hosting these nodes
+        List<Entry<String, Item>> entries = new ArrayList<Entry<String,Item>>();
+        for (String host: hosts(nodeEntries)) {
+            for (Entry<String, Item> remoteEntry: processCollection.getAll()) {
+                entries.add(remoteEntry);
+            }
+            break;
+        }
+        
+        return entries.toArray(new Entry[entries.size()]);
+    }
+
+    public Item get(String key) throws NotFoundException {
+        logger.info("get " + key);
+        
+        // Get the host hosting the given node
+        String host = host(key);
+        
+        // Dispatch the request to that host
+        String uri = "http://" + host + ":9990/node/processes/" + key;
+        return processCollection.get(key);
+    }
+
+    public String post(String key, Item item) {
+        logger.info("post " + key);
+
+        // Get the host hosting the given node
+        String host;
+        try {
+            host = host(key);
+        } catch (NotFoundException e) {
+            throw new ServiceRuntimeException(e);
+        }
+        
+        // Dispatch the request to that host
+        String uri = "http://" + host + ":9990/node/processes/" + key;
+        return processCollection.post(key, item);
+    }
+
+    public void put(String key, Item item) throws NotFoundException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void delete(String key) throws NotFoundException {
+        logger.info("delete " + key);
+        
+        // Get the host hosting the given node
+        String host = host(key);
+        
+        // Dispatch the request to that host
+        String uri = "http://" + host + ":9990/node/processes/" + key;
+        processCollection.delete(key);
+    }
+    
+    public Entry<String, Item>[] query(String queryString) {
+        logger.info("query " + queryString);
+        
+        if (queryString.startsWith("node=")) {
+            String key = queryString.substring(queryString.indexOf('=') + 1);
+            
+            // Get the host hosting the given node
+            String host;
+            try {
+                host = host(key);
+            } catch (NotFoundException e) {
+                return new Entry[0];
+            }
+            
+            // Dispatch the request to that host
+            String uri = "http://" + host + ":9990/node/processes/" + key;
+            return processCollection.query(queryString);
+            
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+    
+    private String host(String nodeName) throws NotFoundException {
+
+        // Get the entry representing the given node
+        Entry<String, Item> nodeEntry = nodeEntry(cloudCollection.getAll(), nodeName);
+        if (nodeEntry == null) {
+            throw new NotFoundException(nodeName);
+        }
+        
+        // Get the host hosting it
+        return host(nodeEntry.getData());
+    }
+
+    /**
+     * Returns the entry representing the given node.
+     *  
+     * @param entries
+     * @param name
+     * @return
+     */
+    private static Entry<String, Item> nodeEntry(Entry<String, Item>[] entries, String name) {
+        for (Entry<String, Item> entry: entries) {
+            QName qname = compositeQName(entry.getKey());
+            if (qname.getLocalPart().equals(name)) {
+                return entry;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the lists of hosts hosting the nodes in the given entries.
+     *  
+     * @param entries
+     * @return
+     */
+    private static List<String> hosts(Entry<String, Item>[] entries) {
+        List<String> hosts = new ArrayList<String>();
+        for (Entry<String, Item> entry: entries) {
+            String host = host(entry.getData());
+            if (!hosts.contains(host)) {
+                hosts.add(host);
+            }
+        }
+        return hosts;
+    }
+
+    /**
+     * Returns the host of the node represented by the given item.
+     * 
+     * @param item
+     * @return
+     */
+    private static String host(Item item) {
+        String uri = nodeURI(item.getContents());
+        if (uri != null) {
+            return URI.create(uri).getHost();
+        } else {
+            return null;
+        }
+    }
+
+}

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

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

Modified: 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=640235&r1=640234&r2=640235&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/QuickStartServiceImpl.java Sun Mar 23 11:05:34 2008
@@ -22,6 +22,7 @@
 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 static org.apache.tuscany.sca.workspace.admin.impl.DomainAdminUtil.nodeURI;
 
 import java.io.IOException;
 import java.net.URI;
@@ -174,20 +175,12 @@
                 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 uri = nodeURI(item.getContents());
+                    if (uri != null) {
+                        URI u = URI.create(uri);
+                        int port = u.getPort();
+                        if (port != -1) {
+                            nodePorts.add(port);
                         }
                     }
                 }

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=640235&r1=640234&r2=640235&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 Sun Mar 23 11:05:34 2008
@@ -67,7 +67,7 @@
 		 <reference name="cloudComposite" target="CloudCollectionComponent/ItemCollection">
 		 	<t:binding.atom/>
 		 </reference>
-		 <reference name="processCollection" target="NodeProcessCollectionComponent/ItemCollection">
+		 <reference name="processCollection" target="NodeProcessCollectionFacadeComponent/ItemCollection">
 		 	<t:binding.atom/>
 		 </reference>
     </component>
@@ -162,10 +162,21 @@
    		<reference name="processCollection" target="NodeProcessCollectionComponent/LocalItemCollection"/>
     </component>
 
+    <component name="NodeProcessCollectionFacadeComponent">
+        <implementation.java class="org.apache.tuscany.sca.workspace.admin.impl.NodeProcessCollectionFacadeImpl"/>
+   		<service name="ItemCollection">
+   	 		<t:binding.atom uri="http://localhost:9990/processes" title="Log"/>
+   		</service>
+   		<reference name="cloudCollection" target="CloudCollectionComponent/LocalItemCollection"/>
+   		<reference name="processCollection" target="NodeProcessCollectionComponent/ItemCollection">
+   	 		<t:binding.atom/>
+   		</reference>
+    </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"/>
+   	 		<t:binding.atom uri="http://localhost:9990/node/processes" title="Log"/>
    		</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=640235&r1=640234&r2=640235&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 Sun Mar 23 11:05:34 2008
@@ -104,7 +104,7 @@
 					composites += '<td><a href="/contribution/' + uri + '">' + uri + '</a></td>';
 				}
 				composites += '<td><a href="/node-image/' + nodeName + '"><img src="icons/feed-icon.png" border="0"></a></td>';
-				composites += '<td><a href="/process/?node=' + nodeName + '"><img src="icons/feed-icon.png" border="0"></a></td>';
+				composites += '<td><a href="/processes/?node=' + nodeName + '"><img src="icons/feed-icon.png" border="0"></a></td>';
 				composites += '</tr>';
 			}
 			composites += '</table>';

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=640235&r1=640234&r2=640235&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 Sun Mar 23 11:05:34 2008
@@ -63,8 +63,18 @@
 					var es = content.indexOf('</span>', bs); 
 					deployables = content.substring(bs, es + 7);
 				}
+				
+				var problems = "";
+				var bs = content.indexOf('<span id="problems" ');
+				if (bs != -1) {
+					var es = content.indexOf('</span>', bs);
+					if (dependencies.length != 0) {
+					  problems = '<br>';
+					} 
+					problems += content.substring(bs, es + 7);
+				}
 											
-				contributions += '<td class=tdw>' + dependencies +' </td>';
+				contributions += '<td class=tdw>' + dependencies + ' </td>';
 				contributions += '<td class=tdw>' + deployables + '</td>';
 				contributions += '</tr>';
 			}
@@ -138,7 +148,7 @@
     <br>
     <table>
     <tr><td>Contribution URI:</td><td><input type="text" name="contributionID" size="50"/></td></td><td>e.g. mycontrib, http://mycontrib</td></tr> 
-    <tr><td>Address:</td><td><input type="text" name="contributionLocation" size="50"/></td></td><td>e.g. http://host/myjar.jar, file:/mydir, file:/myjar.jar</td></tr>
+    <tr><td>Location:</td><td><input type="text" name="contributionLocation" size="50"/></td></td><td>e.g. http://host/myjar.jar, file:/mydir, file:/myjar.jar</td></tr>
     </table>
     <input type="button" onClick="addContribution()" value="Add" />
   </form>

Added: incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java?rev=640235&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java (added)
+++ incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java Sun Mar 23 11:05:34 2008
@@ -0,0 +1,135 @@
+/*
+ * 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.builder.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.tuscany.sca.assembly.builder.Problem;
+import org.apache.tuscany.sca.assembly.builder.Problem.Severity;
+import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.Export;
+import org.apache.tuscany.sca.contribution.Import;
+import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilder;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilderMonitor;
+
+/**
+ * A contribution dependency builder.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ContributionDependencyBuilderImpl implements ContributionDependencyBuilder {
+    private final static Logger logger = Logger.getLogger(ContributionDependencyBuilderImpl.class.getName());
+    
+    private ContributionDependencyBuilderMonitor monitor;
+    
+    /**
+     * Constructs a new ContributionDependencyBuilder.
+     */
+    public ContributionDependencyBuilderImpl(ContributionDependencyBuilderMonitor monitor) {
+        
+        if (monitor == null) {
+            // Create a default monitor that logs using the JDK logger.
+            monitor = new ContributionDependencyBuilderMonitor() {
+                public void problem(Problem problem) {
+                    if (problem.getSeverity() == Severity.INFO) {
+                        logger.info(problem.toString());
+                    } else if (problem.getSeverity() == Severity.WARNING) {
+                        logger.warning(problem.toString());
+                    } else if (problem.getSeverity() == Severity.ERROR) {
+                        if (problem.getCause() != null) {
+                            logger.log(Level.SEVERE, problem.toString(), problem.getCause());
+                        } else {
+                            logger.severe(problem.toString());
+                        }
+                    }
+                }
+            };
+        }
+        
+        this.monitor = monitor;
+    }
+    
+    /**
+     * Calculate the set of contributions that a contribution depends on.
+     * @param workspace
+     * @param contribution
+     * @return
+     */
+    public List<Contribution> buildContributionDependencies(Workspace workspace, Contribution contribution) {
+        List<Contribution> dependencies = new ArrayList<Contribution>();
+        Set<Contribution> set = new HashSet<Contribution>();
+
+        dependencies.add(contribution);
+        set.add(contribution);
+        addContributionDependencies(workspace, contribution, dependencies, set);
+        
+        Collections.reverse(dependencies);
+        return dependencies;
+    }
+    
+    /**
+     * Analyze a contribution and add its dependencies to the given dependency set.
+     * @param workspace
+     * @param contribution
+     * @param dependencies
+     * @param set
+     */
+    private void addContributionDependencies(Workspace workspace, Contribution contribution, List<Contribution> dependencies, Set<Contribution> set) {
+        
+        // Go through the contribution imports
+        for (Import import_: contribution.getImports()) {
+            boolean resolved = false;
+            
+            // Go through all contribution candidates and their exports
+            for (Contribution dependency: workspace.getContributions()) {
+                for (Export export: dependency.getExports()) {
+                    
+                    // If an export from a contribution matches the import in hand
+                    // add that contribution to the dependency set
+                    if (import_.match(export)) {
+                        resolved = true;
+
+                        if (!set.contains(dependency)) {
+                            set.add(dependency);
+                            dependencies.add(dependency);
+                            
+                            // Now add the dependencies of that contribution
+                            addContributionDependencies(workspace, dependency, dependencies, set);
+                        }
+                    }
+                }
+            }
+            
+            if (!resolved) {
+                // Record import resolution issue
+                monitor.problem(new ProblemImpl(Severity.WARNING, "Unresolved import", import_));
+            }
+        }
+    }
+
+}

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

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

Added: incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java?rev=640235&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java Sun Mar 23 11:05:34 2008
@@ -0,0 +1,101 @@
+/*
+ * 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.builder.impl;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.DefaultContributionFactory;
+import org.apache.tuscany.sca.contribution.namespace.NamespaceExport;
+import org.apache.tuscany.sca.contribution.namespace.NamespaceImport;
+import org.apache.tuscany.sca.contribution.namespace.NamespaceImportExportFactory;
+import org.apache.tuscany.sca.contribution.namespace.impl.NamespaceImportExportFactoryImpl;
+import org.apache.tuscany.sca.workspace.DefaultWorkspaceFactory;
+import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.workspace.WorkspaceFactory;
+import org.apache.tuscany.sca.workspace.builder.impl.ContributionDependencyBuilderImpl;
+
+/**
+ * Test the contribution dependency analyzer.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class ContributionDependencyBuilderTestCase extends TestCase {
+
+    private ContributionFactory contributionFactory;
+    private WorkspaceFactory workspaceFactory;
+    private NamespaceImportExportFactory importExportFactory;
+
+    @Override
+    public void setUp() throws Exception {
+        contributionFactory = new DefaultContributionFactory();
+        workspaceFactory = new DefaultWorkspaceFactory();
+        importExportFactory = new NamespaceImportExportFactoryImpl();
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+    }
+
+    public void testAnalyze() {
+        Workspace workspace = workspaceFactory.createWorkspace();
+        Contribution importer = contributionFactory.createContribution();
+        importer.setURI("importer");
+        workspace.getContributions().add(importer);
+        NamespaceImport import_ = importExportFactory.createNamespaceImport();
+        import_.setNamespace("http://foo");
+        importer.getImports().add(import_);
+
+        Contribution imported = contributionFactory.createContribution();
+        imported.setURI("imported");
+        workspace.getContributions().add(imported);
+        NamespaceExport export = importExportFactory.createNamespaceExport();
+        export.setNamespace("http://foo");
+        imported.getExports().add(export);
+        import_ = importExportFactory.createNamespaceImport();
+        import_.setNamespace("http://bar");
+        imported.getImports().add(import_);
+        
+        Contribution imported2 = contributionFactory.createContribution();
+        imported2.setURI("imported2");
+        workspace.getContributions().add(imported2);
+        export = importExportFactory.createNamespaceExport();
+        export.setNamespace("http://bar");
+        imported2.getExports().add(export);
+        
+        Contribution another = contributionFactory.createContribution();
+        another.setURI("another");
+        workspace.getContributions().add(another);
+        export = importExportFactory.createNamespaceExport();
+        export.setNamespace("http://another");
+        another.getExports().add(export);
+        
+        ContributionDependencyBuilderImpl analyzer = new ContributionDependencyBuilderImpl(null);
+        List<Contribution> dependencies = analyzer.buildContributionDependencies(workspace, importer);
+        assertTrue(dependencies.size() == 3);
+        assertTrue(dependencies.contains(importer));
+        assertTrue(dependencies.contains(imported));
+        assertTrue(dependencies.contains(imported2));
+    }
+    
+}

Propchange: incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/workspace-impl/src/test/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java?rev=640235&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java (added)
+++ incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java Sun Mar 23 11:05:34 2008
@@ -0,0 +1,42 @@
+/*
+ * 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.builder;
+
+import java.util.List;
+
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.workspace.Workspace;
+
+/**
+ * A contribution dependency analyzer.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface ContributionDependencyBuilder {
+    
+    /**
+     * Build the set of contributions that a contribution depends on.
+     * @param workspace
+     * @param contribution
+     * @return
+     */
+    public List<Contribution> buildContributionDependencies(Workspace workspace, Contribution contribution);
+
+}

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

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

Added: incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilderMonitor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilderMonitor.java?rev=640235&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilderMonitor.java (added)
+++ incubator/tuscany/java/sca/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilderMonitor.java Sun Mar 23 11:05:34 2008
@@ -0,0 +1,38 @@
+/*
+ * 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.builder;
+
+import org.apache.tuscany.sca.assembly.builder.Problem;
+
+/**
+ * A monitor for the contribution dependency builder.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface ContributionDependencyBuilderMonitor {
+
+    /**
+     * Reports a build problem.
+     * 
+     * @param problem
+     */
+    void problem(Problem problem);
+    
+}

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

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



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