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$
+ */
[EMAIL PROTECTED]("COMPOSITE")
[EMAIL PROTECTED](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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to