tuscany-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jsdelf...@apache.org
Subject svn commit: r662164 - in /incubator/tuscany/java/sca/tools/eclipse/plugins/core: ./ org/apache/tuscany/sca/core/classpath/ org/apache/tuscany/sca/core/launch/
Date Sun, 01 Jun 2008 08:23:07 GMT
Author: jsdelfino
Date: Sun Jun  1 01:23:07 2008
New Revision: 662164

URL: http://svn.apache.org/viewvc?rev=662164&view=rev
Log:
Added an action and toolbar button to launch the domain manager app. Use the tuscany-sca-domain's
classpath to launch the domain manager app to protect it against mis-configured application
projects. Fixed handling of Eclipse launch configurations to avoid creating a new configuration
for each launch.

Added:
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
Removed:
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchShortcut.java
Modified:
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
    incubator/tuscany/java/sca/tools/eclipse/plugins/core/plugin.xml

Modified: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java?rev=662164&r1=662163&r2=662164&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
(original)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
Sun Jun  1 01:23:07 2008
@@ -39,6 +39,8 @@
  */
 public class TuscanyClasspathContainer implements IClasspathContainer {
     
+    public static final IPath TUSCANY_LIBRARY_CONTAINER = new Path("org.apache.tuscany.sca.runtime.library");
 
+    
     private static final String TUSCANY_HOME = "TUSCANY_HOME";
     private static final String TUSCANY_SRC = "TUSCANY_SRC";
     
@@ -68,7 +70,9 @@
                 runtimePath = new Path(file.getPath());
             }
         } catch (Exception e) {
+        }
 
+        if (runtimePath == null) {
             // Try to get the location of the Tuscany binary distribution from
             // the TUSCANY_HOME property or environment variable
             String home = System.getProperty(TUSCANY_HOME);
@@ -93,7 +97,10 @@
                 sourcePath = new Path(file.getPath());
             }
         } catch (Exception e) {
+        }
 
+        if (sourcePath == null) {
+            
             // Try to get the location of the Tuscany source distribution from
             // the TUSCANY_SRC property or environment variable
             String source = System.getProperty(TUSCANY_SRC);
@@ -146,7 +153,7 @@
     }
 
     public IPath getPath() {
-        return new Path("org.apache.tuscany.sca.runtime.library");
+        return TUSCANY_LIBRARY_CONTAINER;
     }
 
 }

Modified: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java?rev=662164&r1=662163&r2=662164&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
(original)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
Sun Jun  1 01:23:07 2008
@@ -19,7 +19,6 @@
 
 package org.apache.tuscany.sca.core.classpath;
 
-import org.eclipse.core.runtime.Path;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
@@ -52,7 +51,7 @@
     }
 
     public boolean finish() {
-        classpathEntry = JavaCore.newContainerEntry(new Path("org.apache.tuscany.sca.runtime.library"));
+        classpathEntry = JavaCore.newContainerEntry(TuscanyClasspathContainer.TUSCANY_LIBRARY_CONTAINER);
         return true;
     }
 

Added: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java?rev=662164&view=auto
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
(added)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
Sun Jun  1 01:23:07 2008
@@ -0,0 +1,251 @@
+/*
+ * 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.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.TuscanyLaunchConfigurationDelegate.TUSCANY_LAUNCH_CONFIGURATIONTYPE;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+
+import org.apache.tuscany.sca.core.classpath.TuscanyClasspathContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+import org.eclipse.jdt.launching.JavaRuntime;
+
+/**
+ * Provides utility methods to launch the SCA Domain Manager.
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class DomainManagerLauncherUtil {
+
+    private static final String TUSCANY_DOMAIN_LAUNCH_CONFIGURATION = "SCA Domain Manager";
+    private static final String TUSCANY_SCA_DOMAIN_PROJECT = "tuscany-sca-domain";
+
+    private static final String PING_HEADER =
+        "GET /ping HTTP/1.0\n" + "Host: localhost\n"
+            + "Content-Type: text/xml\n"
+            + "Connection: close\n"
+            + "Content-Length: ";
+    private static final String PING_CONTENT = "";
+    private static final String PING =
+        PING_HEADER + PING_CONTENT.getBytes().length + "\n\n" + PING_CONTENT;
+    
+    /**
+     * Returns the SCA domain project.
+     * 
+     * @return
+     * @throws CoreException
+     */
+    static IProject domainProject(IProgressMonitor progressMonitor) throws CoreException
{
+        
+        IProject domainProject = ResourcesPlugin.getWorkspace().getRoot().getProject(TUSCANY_SCA_DOMAIN_PROJECT);
+        if (progressMonitor.isCanceled()) {
+            return domainProject;
+        }
+        if (!domainProject.exists()) {
+            progressMonitor.subTask("Creating SCA domain resources");
+            
+            // Create SCA domain project if necessary 
+            domainProject.create(new SubProgressMonitor(progressMonitor, 5));
+            domainProject.open(new SubProgressMonitor(progressMonitor, 5));
+            
+            String html = "<html>\n" +
+                "<head>\n" +
+                "<meta http-equiv=\"refresh\" content=\"0;url=http://localhost:9990/ui/home\">\n"
+
+                "</head>\n" +
+                "<body>\n" +
+                "<a href=\"http://localhost:9990/ui/home\">SCA Domain</a>\n"
+
+                "</body>\n" +
+                "</html>"; 
+            
+            IFile file = domainProject.getFile(new Path("domain.html"));
+            file.create(new ByteArrayInputStream(html.getBytes()), true, new SubProgressMonitor(progressMonitor,
5));
+            
+            IProjectDescription description = domainProject.getDescription();
+            String[] prevNatures= description.getNatureIds();
+            String[] newNatures= new String[prevNatures.length + 1];
+            System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
+            newNatures[prevNatures.length]= JavaCore.NATURE_ID;
+            description.setNatureIds(newNatures);
+            domainProject.setDescription(description, new SubProgressMonitor(progressMonitor,
5));
+            
+            IJavaProject javaProject = JavaCore.create(domainProject);
+            javaProject.setOutputLocation(domainProject.getFullPath(), new SubProgressMonitor(progressMonitor,
5));
+            
+            IClasspathEntry classPath = JavaCore.newContainerEntry(TuscanyClasspathContainer.TUSCANY_LIBRARY_CONTAINER);
+            IClasspathEntry jrePath = JavaRuntime.getDefaultJREContainerEntry();
+            javaProject.setRawClasspath(new IClasspathEntry[] {jrePath, classPath}, new SubProgressMonitor(progressMonitor,
5));
+        
+        } else {
+            domainProject.open(new SubProgressMonitor(progressMonitor, 5));
+        }
+        
+        return domainProject;
+    }
+
+    /**
+     * Returns true if the SCA domain controller is running.
+     * 
+     * @return
+     */
+    private static boolean isDomainManagerRunning() {
+        try {
+            Socket client = new Socket("localhost", 9990);
+            OutputStream os = client.getOutputStream();
+            os.write(DomainManagerLauncherUtil.PING.getBytes());
+            os.flush();
+            String response = DomainManagerLauncherUtil.read(client);
+            if (response.indexOf("<span id=\"ping\">") != -1) {
+                return true;
+            } else {
+                return false;
+            }
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Wait for domain to be running.
+     * 
+     * @return
+     */
+    private static boolean waitForDomainManager(IProgressMonitor progressMonitor) throws
InterruptedException {
+        progressMonitor.subTask("Contacting SCA domain manager");
+        for (int i = 0; i < 40; i++) {
+            if (progressMonitor.isCanceled()) {
+                return false;
+            }
+            if (isDomainManagerRunning()) {
+                return true;
+            }
+            Thread.sleep(500);
+        }
+        return false;
+    }
+
+    static void launchDomainManager(IProgressMonitor progressMonitor) throws JavaModelException,
CoreException, InterruptedException {
+        
+        progressMonitor.beginTask("Starting SCA Domain Manager", 100);
+        
+        // If the SCA domain controller is not running yet, launch it
+        if (!isDomainManagerRunning()) {
+
+            progressMonitor.subTask("Starting SCA domain manager");
+            if (progressMonitor.isCanceled()) {
+                return;
+            }
+            
+            // Get the SCA domain project
+            IProject domainProject = domainProject(progressMonitor);
+            
+            // Get the domain manager launch configuration
+            ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+            ILaunchConfigurationType launchConfigurationType =launchManager.getLaunchConfigurationType(TUSCANY_LAUNCH_CONFIGURATIONTYPE);
+            ILaunchConfiguration configuration = null;
+            for (ILaunchConfiguration c : launchManager.getLaunchConfigurations(launchConfigurationType))
{
+                if (TUSCANY_DOMAIN_LAUNCH_CONFIGURATION.equals(c.getName())) {
+                    configuration = c;
+                    break;
+                }
+            }
+            
+            if (configuration == null) {
+                progressMonitor.worked(10);
+                if (progressMonitor.isCanceled()) {
+                    return;
+                }
+    
+                // Create a new launch configuration
+                ILaunchConfigurationWorkingCopy newConfiguration = launchConfigurationType.newInstance(null,
TUSCANY_DOMAIN_LAUNCH_CONFIGURATION);
+
+                // Set the project and type to launch
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
domainProject.getProject().getName());
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,
"org.apache.tuscany.sca.node.launcher.DomainManagerLauncher");
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY,
domainProject.getLocation().toString());
+
+                // Save the configuration
+                newConfiguration.doSave();
+
+                configuration = newConfiguration;
+            }
+
+            // Launch
+            configuration.launch(ILaunchManager.RUN_MODE, new SubProgressMonitor(progressMonitor,
20));
+            
+            if (progressMonitor.isCanceled()) {
+                return;
+            }
+            if (!waitForDomainManager(progressMonitor)) {
+                throw new RuntimeException("SCA Domain Manager could not be started.");
+            }
+        }
+        if (progressMonitor.isCanceled()) {
+            return;
+        }
+        progressMonitor.done();
+            
+    }
+
+    /**
+     * Read a String from a socket.
+     * 
+     * @param socket
+     * @return
+     * @throws IOException
+     */
+    static String read(Socket socket) throws IOException {
+        BufferedReader reader = null;
+        try {
+            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+            StringBuffer sb = new StringBuffer();
+            String str;
+            while ((str = reader.readLine()) != null) {
+                sb.append(str);
+            }
+            return sb.toString();
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+    }
+}

Added: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java?rev=662164&view=auto
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
(added)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
Sun Jun  1 01:23:07 2008
@@ -0,0 +1,241 @@
+/*
+ * 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.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.DomainManagerLauncherUtil.domainProject;
+import static org.apache.tuscany.sca.core.launch.DomainManagerLauncherUtil.launchDomainManager;
+import static org.apache.tuscany.sca.core.launch.TuscanyLaunchConfigurationDelegate.TUSCANY_LAUNCH_CONFIGURATIONTYPE;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.Socket;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.internal.core.LaunchManager;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+
+/**
+ * Provides utility methods to launch SCA nodes.
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class NodeLauncherUtil {
+
+    private static final String START_HEADER1 =
+        "GET /quickstart?";
+    private static final String START_HEADER2 =
+        " HTTP/1.0\n" + "Host: localhost\n"
+            + "Content-Type: text/xml\n"
+            + "Connection: close\n"
+            + "Content-Length: ";
+    private static final String START_CONTENT = "";
+
+    /**
+     * Launch an SCA node.
+     * 
+     * @param mode
+     * @param file
+     * @param launchManager
+     * @param launchConfigurationType
+     * @throws CoreException
+     * @throws JavaModelException
+     */
+    static void launchNode(String mode,
+                            IFile file,
+                            IProgressMonitor progressMonitor) throws CoreException, JavaModelException,
IOException, InterruptedException {
+        progressMonitor.subTask("Starting SCA node");
+        if (progressMonitor.isCanceled()) {
+            return;
+        }
+        
+        // First start the SCA domain manager
+        launchDomainManager(new SubProgressMonitor(progressMonitor, 20));
+        
+        // Get the Java project
+        IJavaProject javaProject = JavaCore.create(file.getProject());
+        
+        // Get the contribution location and URI
+        String contributionLocation = contributionLocation(javaProject);
+        String contributionURI = contributionURI(javaProject);
+    
+        // Determine the composite file URI
+        String compositeURI = compositeURI(javaProject, file);
+        
+        // Configure the node
+        String nodeName = configureNode(contributionURI, contributionLocation, compositeURI,
progressMonitor);
+    
+        // Get the node launch configuration
+        ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+        ILaunchConfigurationType launchConfigurationType =launchManager.getLaunchConfigurationType(TUSCANY_LAUNCH_CONFIGURATIONTYPE);
+        ILaunchConfiguration configuration = null;
+        for (ILaunchConfiguration c : launchManager.getLaunchConfigurations(launchConfigurationType))
{
+            if (file.getFullPath().toString().equals(c.getAttribute("COMPOSITE_PATH", "")))
{
+                configuration = c;
+                break;
+            }
+        }
+        
+        if (configuration == null) {
+            progressMonitor.worked(10);
+            if (progressMonitor.isCanceled()) {
+                return;
+            }
+
+            // Create a new launch configuration
+            ILaunchConfigurationWorkingCopy newConfiguration = launchConfigurationType.newInstance(null,
+                                        launchManager.generateUniqueLaunchConfigurationNameFrom(file.getName()));
+
+            // Set the project and type to launch
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
file.getProject().getName());
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,
"org.apache.tuscany.sca.node.launcher.NodeLauncher");
+
+            // Pass the URL of the node install image to the launcher
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
+                                       "http://localhost:9990/node-config/" + nodeName);
+            
+            // Save the composite path in the launch configuration
+            newConfiguration.setAttribute("COMPOSITE_PATH", file.getFullPath().toString());
+            
+            // Save the configuration
+            newConfiguration.doSave();
+
+            configuration = newConfiguration;
+        }
+
+        // Launch
+        configuration.launch(mode, null);
+    }
+
+    /**
+     * Returns the location of the SCA contribution representing a Java project. 
+     * @param javaProject
+     * @return
+     * @throws MalformedURLException
+     * @throws JavaModelException
+     */
+    private static String contributionLocation(IJavaProject javaProject) throws MalformedURLException,
JavaModelException {
+        IPath location = javaProject.getOutputLocation();
+        IResource resource;
+        if (location.segmentCount() == 1) {
+            resource = javaProject.getProject();
+        } else {
+            resource = javaProject.getProject().getWorkspace().getRoot().getFolder(location);
+        }
+        location = resource.getLocation();
+        String url = location.toFile().toURI().toURL().toString();
+        if (url.endsWith("/")) {
+            url = url.substring(0, url.length() - 1);
+        }
+        return url;
+    }
+
+    /**
+     * Returns the URI of the SCA contribution representing a Java project. 
+     * @param javaProject
+     * @return
+     */
+    private static String contributionURI(IJavaProject javaProject) {
+        return javaProject.getProject().getName();
+    }
+
+    /**
+     * Returns the SCA artifact URI of a composite file inside a Java project.
+     * 
+     * @param javaProject
+     * @param file
+     * @return
+     * @throws JavaModelException
+     */
+    private static String compositeURI(IJavaProject javaProject, IFile file) throws JavaModelException
{
+    
+        // Find the Java source container containing the specified file
+        IClasspathEntry[] classpathEntries = javaProject.getRawClasspath();
+        int sourceFolderSegments = 0;
+        for (IClasspathEntry entry : classpathEntries) {
+            if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+                sourceFolderSegments = entry.getPath().matchingFirstSegments(file.getFullPath());
+                if (sourceFolderSegments > 0)
+                    break;
+            }
+        }
+    
+        // Determine the composite URI
+        String compositeURI = file.getFullPath().removeFirstSegments(sourceFolderSegments).toString();
+        return compositeURI;
+    }
+
+    /**
+     * Send a request to the SCA domain manager to configure an SCA node for
+     * the specified composite.
+     *  
+     * @param contributionURI
+     * @param contributionLocation
+     * @param compositeURI
+     * @return
+     * @throws IOException
+     */
+    private static String configureNode(String contributionURI, String contributionLocation,
String compositeURI,
+                                        IProgressMonitor progressMonitor) throws IOException,
CoreException {
+        progressMonitor.subTask("Configuring node");
+        
+        // Send the request to configure the node
+        Socket client = new Socket("localhost", 9990);
+        OutputStream os = client.getOutputStream();
+        String request = START_HEADER1 +
+            "contribution=" + contributionURI + "&location=" + contributionLocation +
"&composite=" + compositeURI +
+            START_HEADER2 + START_CONTENT.getBytes().length + "\n\n" + START_CONTENT;
+        os.write(request.getBytes());
+        os.flush();
+        String response = DomainManagerLauncherUtil.read(client);
+        
+        // Refresh the domain project
+        domainProject(progressMonitor).refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+        
+        int i = response.indexOf("<span id=\"node\">");
+        if (i != -1) {
+            
+            // Extract the node name
+            response = response.substring(i + 16);
+            i = response.indexOf("</span>");
+            String nodeName = response.substring(0, i);
+            return nodeName;
+            
+        } else {
+            throw new RuntimeException("Node could not be configured: " + response);
+        }
+    }
+
+}

Modified: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java?rev=662164&r1=662163&r2=662164&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
(original)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
Sun Jun  1 01:23:07 2008
@@ -41,6 +41,8 @@
 public class TuscanyLaunchConfigurationDelegate extends AbstractJavaLaunchConfigurationDelegate
implements
     ILaunchConfigurationDelegate {
 
+    public static final String TUSCANY_LAUNCH_CONFIGURATIONTYPE = "org.apache.tuscany.sca.core.launch.configurationtype";
+
     public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor
monitor)
         throws CoreException {
 

Added: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java?rev=662164&view=auto
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
(added)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
Sun Jun  1 01:23:07 2008
@@ -0,0 +1,65 @@
+package org.apache.tuscany.sca.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.DomainManagerLauncherUtil.launchDomainManager;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+/**
+ * Launch the SCA DomainManager.
+ * 
+ * @version $Rev: $ $Date: $
+ */
+public class TuscanyLaunchDomainManagerAction implements IWorkbenchWindowActionDelegate {
+    
+    private IWorkbenchWindow window;
+
+    public TuscanyLaunchDomainManagerAction() {
+    }
+
+    public void run(IAction action) {
+
+        try {
+            
+            // Run with a progress monitor
+            window.run(true, true, new IRunnableWithProgress() {
+
+                public void run(IProgressMonitor progressMonitor) throws InvocationTargetException,
InterruptedException {
+                    try {
+                        
+                        launchDomainManager(progressMonitor);
+                            
+                    } catch (Exception e) {
+                        throw new InvocationTargetException(e);
+                    } finally {
+                        progressMonitor.done();
+                    }
+                }
+            });
+
+        } catch (Exception e) {
+            Platform.getLog(
+                Platform.getBundle("org.apache.tuscany.sca.core")).log(
+                new Status(IStatus.ERROR, "org.apache.tuscany.sca.core", IStatus.OK, "Could
not launch SCA Domain Manager", e));
+        }
+    }
+
+    public void selectionChanged(IAction action, ISelection selection) {
+    }
+
+    public void dispose() {
+    }
+
+    public void init(IWorkbenchWindow window) {
+        this.window = window;
+    }
+}

Added: incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java?rev=662164&view=auto
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
(added)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
Sun Jun  1 01:23:07 2008
@@ -0,0 +1,92 @@
+/*
+ * 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.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.NodeLauncherUtil.launchNode;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.ui.ILaunchShortcut;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A launch shortcut for SCA .composite files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLaunchNodeShortcut implements ILaunchShortcut {
+    
+    public void launch(final ISelection selection, final String mode) {
+
+        try {
+            
+            // Make sure we have a .composite file selected
+            if (!(selection instanceof IStructuredSelection)) {
+                return;
+            }
+            Object[] selections = ((IStructuredSelection)selection).toArray();
+            if (selections.length == 0) {
+                return;
+            }
+            final IFile file = (IFile)selections[0];
+            if (!file.getFileExtension().equals("composite")) {
+                return;
+            }
+            
+            // Run with a progress monitor
+            PlatformUI.getWorkbench().getActiveWorkbenchWindow().run(true, true, new IRunnableWithProgress()
{
+
+                public void run(IProgressMonitor progressMonitor) throws InvocationTargetException,
InterruptedException {
+                    try {
+                        progressMonitor.beginTask("Starting SCA Composite", 100);
+                        
+                        launchNode(mode, file, progressMonitor);
+                        
+                        progressMonitor.done();
+                            
+                    } catch (Exception e) {
+                        throw new InvocationTargetException(e);
+                    } finally {
+                        progressMonitor.done();
+                    }
+                }
+            });
+
+        } catch (Exception e) {
+            Platform.getLog(
+                Platform.getBundle("org.apache.tuscany.sca.core")).log(
+                new Status(IStatus.ERROR, "org.apache.tuscany.sca.core", IStatus.OK, "Could
not launch SCA composite", e));
+        }
+    }
+
+    public void launch(IEditorPart editor, String mode) {
+        //TODO later...
+    }
+    
+}

Modified: incubator/tuscany/java/sca/tools/eclipse/plugins/core/plugin.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/eclipse/plugins/core/plugin.xml?rev=662164&r1=662163&r2=662164&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/eclipse/plugins/core/plugin.xml (original)
+++ incubator/tuscany/java/sca/tools/eclipse/plugins/core/plugin.xml Sun Jun  1 01:23:07 2008
@@ -51,6 +51,23 @@
 		</classpathContainerPage>
 	</extension>
 
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            label="Tuscany"
+            visible="true"
+            id="org.apache.tuscany.sca.core.launch.actionSet">
+         <action
+               label="&amp;Start SCA Domain Manager"
+               icon="icons/t.gif"
+               class="org.apache.tuscany.sca.core.launch.TuscanyLaunchDomainManagerAction"
+               tooltip="Start SCA Domain Manager"
+               toolbarPath="tuscanyGroup"
+               id="org.apache.tuscany.sca.core.launch.TuscanyLaunchDomainManagerAction">
+         </action>
+      </actionSet>
+   </extension>
+
 	<extension point="org.eclipse.debug.core.launchConfigurationTypes">
 		<launchConfigurationType
        		name="Tuscany"
@@ -81,7 +98,7 @@
 	<extension point="org.eclipse.debug.ui.launchShortcuts">
 		<shortcut
 			id="org.apache.tuscany.sca.core.launchshortcut"
-			class="org.apache.tuscany.sca.core.launch.TuscanyLaunchShortcut"
+			class="org.apache.tuscany.sca.core.launch.TuscanyLaunchNodeShortcut"
 			label="Tuscany"
 			icon="icons/t.gif"
 			modes="run, debug">



Mime
View raw message