Fix problem running mvn eclipse:eclipse caused by changes for r1030068 (part 2)

git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-java-1.x/trunk@1034328 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/ClasspathUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/ClasspathUtil.java
new file mode 100644
index 0000000..8dbe0c2
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/ClasspathUtil.java
@@ -0,0 +1,187 @@
+/*

+ * 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.classpath;

+

+import static org.apache.tuscany.sca.core.log.LogUtil.error;

+

+import java.io.BufferedReader;

+import java.io.File;

+import java.io.FileNotFoundException;

+import java.io.InputStream;

+import java.io.InputStreamReader;

+import java.net.URL;

+import java.util.ArrayList;

+import java.util.Arrays;

+import java.util.List;

+

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IConfigurationElement;

+import org.eclipse.core.runtime.IExtension;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.jdt.core.IClasspathContainer;

+import org.eclipse.jdt.core.IClasspathEntry;

+

+/**

+ * Utility functions to help determine the runtime classpath.

+ *

+ * @version $Rev: $ $Date: $

+ */

+public class ClasspathUtil {

+

+    private static final String TUSCANY_RUNTIME_LIBRARIES = "org.apache.tuscany.sca.core.runtimeLibraries";

+

+    private static final String VERSION_RESOURCE = "/org/apache/tuscany/sca/core/feature.version";

+    private static final String TUSCANY_FEATURE = "org.apache.tuscany.sca.feature.core";

+    

+    /**

+     * Return the installed runtime classpath entries.

+     * 

+     * @return

+     * @throws CoreException

+     */

+    public static String installedRuntimeClasspath() throws CoreException {

+        

+        List<IClasspathEntry> classpathEntries = new ArrayList<IClasspathEntry>(); 

+        for (IExtension extension: Platform.getExtensionRegistry().getExtensionPoint(TUSCANY_RUNTIME_LIBRARIES).getExtensions()) {

+            for (IConfigurationElement configuration: extension.getConfigurationElements()) {

+                IClasspathContainer container = (IClasspathContainer)configuration.createExecutableExtension("class");

+                classpathEntries.addAll(Arrays.asList(container.getClasspathEntries()));

+            }

+        }

+        

+        String separator = System.getProperty("path.separator");

+        StringBuffer classpath = new StringBuffer();

+        for (int i = 0, n = classpathEntries.size(); i < n; i++) {

+            IClasspathEntry entry = classpathEntries.get(i);

+            if (i >0) {

+                classpath.append(separator);

+            }

+            classpath.append(entry.getPath().toFile().toURI().getPath());

+        }

+        

+        return classpath.toString();

+    }

+

+    /**

+     * Returns the Tuscany feature location.

+     *  

+     * @return

+     */

+    static IPath feature() {

+        Path featurePath = null;

+        Exception ex = null;

+        try {

+            InputStream resourceStream = ClasspathUtil.class.getResourceAsStream(VERSION_RESOURCE);

+            if (resourceStream != null) {

+                BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, "UTF-8"));

+                String featureVersion = reader.readLine().trim();

+                reader.close();

+                URL location = Platform.getInstallLocation().getURL();

+                File feature = new File(location.getPath() + "/features/" + TUSCANY_FEATURE + "_" + featureVersion);

+                featurePath = new Path(feature.getPath());

+            }

+        } catch (Exception e) {

+            ex = e;

+        }

+

+        if (featurePath != null) {

+            return featurePath;

+        } else {

+            error("Tuscany runtime feature not found", ex);

+            return null;

+        }

+    }

+

+    /**

+     * Returns the location of the runtime distribution under the Tuscany feature.

+     * 

+     * @param feature

+     * @return

+     */

+    static IPath runtime(IPath feature) {

+        IPath runtimePath = null;

+        try {

+            

+            // Find the Tuscany distribution under the feature's runtime directory

+            // Typically runtime/distro-archive-name/un-archived-distro-dir

+            File file = new File(feature.toFile(), "runtime");

+            if (file.exists()) {

+                File distro = null;

+                for (File f: file.listFiles()) {

+                    if (f.getName().contains("tuscany-sca")) {

+                        distro = f;

+                        break;

+                    }

+                }

+                if (distro != null) {

+                    for (File f: distro.listFiles()) {

+                        if (f.getName().contains("tuscany-sca")) {

+                            runtimePath = new Path(f.getPath());

+                            break;

+                        }

+                    }

+                    if (runtimePath == null) {

+                        error("Tuscany runtime distribution directory not found", new FileNotFoundException(distro.getAbsolutePath()));

+                    }

+                } else {

+                    error("Tuscany runtime distribution archive not found", new FileNotFoundException(file.getAbsolutePath()));

+                }

+            } else {

+                error("Tuscany runtime feature not found", new FileNotFoundException(file.getAbsolutePath()));

+            }

+        } catch (Exception e) {

+            error("Tuscany runtime feature not found", e);

+        }

+        return runtimePath;

+    }

+

+    /**

+     * Returns the location of the src distribution under the Tuscany feature.

+     * 

+     * @param feature

+     * @return

+     */

+    static IPath src(IPath feature) {

+        IPath sourcePath = null;

+        try {

+

+            // Find the Tuscany source distribution under the feature's src directory

+            // Typically src/distro-archive-src.zip

+            File file = new File(feature.toFile(), "src");

+            if (file.exists()) {

+                File distro = null;

+                for (File f: file.listFiles()) {

+                    if (f.getName().contains("tuscany-sca") && f.getName().endsWith("-src.zip")) {

+                        distro = f;

+                        break;

+                    }

+                }

+                if (distro != null) {

+                    sourcePath = new Path(distro.getPath());

+                }

+            }

+        } catch (Exception e) {

+        }

+        return sourcePath;

+    }

+    

+}

diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
new file mode 100644
index 0000000..c1a674a
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
@@ -0,0 +1,154 @@
+/*
+ * 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.classpath;
+
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.feature;
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.runtime;
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.src;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+
+/**
+ * A classpath container for the Tuscany runtime.
+ * 
+ * @version $Rev$ $Date$
+ */
+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";
+    
+    public TuscanyClasspathContainer() {
+    }
+
+    public IClasspathEntry[] getClasspathEntries() {
+        List<IClasspathEntry> list = new ArrayList<IClasspathEntry>();
+        
+        // Find the Tuscany feature
+        IPath feature = feature();
+        
+        // Get the runtime location from the installed Tuscany feature
+        IPath runtimePath = runtime(feature);
+
+        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);
+            if (home == null || home.length() == 0) {
+                home = System.getenv(TUSCANY_HOME);
+            }
+            if (home != null && home.length() != 0) {
+                if (new File(home).exists()) {
+                    runtimePath = new Path(home);
+                }
+            }
+        }
+        
+        // Get the source location from the installed Tuscany feature
+        IPath sourcePath = src(feature);
+
+        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);
+            if (source == null || source.length() == 0) {
+                source = System.getenv(TUSCANY_SRC);
+            }
+            if (source != null && source.length() != 0) {
+                if (new File(source).exists()) {
+                    sourcePath = new Path(source);
+                }
+            }
+        }
+        
+        // Add the JARs from runtime/lib and runtime/modules as classpath entries
+        if (runtimePath != null) {
+            
+            // Add a selection of the jars from runtime/modules
+            File modulesDirectory = runtimePath.append("modules").toFile();
+            if (modulesDirectory != null && modulesDirectory.exists()) {
+                for (File file : modulesDirectory.listFiles()) {
+                    IPath path = new Path(file.getPath());
+                    String name = path.lastSegment();
+                    String extension = path.getFileExtension();
+                    
+                    // Only include API and launcher JARs
+                    if (!"jar".equals(extension)) {
+                        continue;
+                    }
+                    if (name.indexOf("-api-") == -1 && name.indexOf("-launcher-") == -1) {
+                        continue;
+                    }
+                    if (name.startsWith("tuscany-node-api-") || name.startsWith("tuscany-domain-api-")) {
+                        continue;
+                    }
+
+                    list.add(JavaCore.newLibraryEntry(path, sourcePath, null));
+                }
+            }
+
+            File libDirectory = runtimePath.append("lib").toFile();
+            if (libDirectory != null && libDirectory.exists()) {
+                for (File file : libDirectory.listFiles()) {
+                    IPath path = new Path(file.getPath());
+                    String name = path.lastSegment();
+                    String extension = path.getFileExtension();
+                    
+                    // Only include jaxb, jaxws and jsr API JARs
+                    if (!"jar".equals(extension)) {
+                        continue;
+                    }
+                    if (name.indexOf("-api-") != -1) {
+                        if (name.startsWith("jaxb") || name.startsWith("jaxws") || name.startsWith("jsr")) {
+                            list.add(JavaCore.newLibraryEntry(path, sourcePath, null));
+                        }
+                    }
+                }
+            }
+        }
+        
+        return (IClasspathEntry[])list.toArray(new IClasspathEntry[list.size()]);
+    }
+
+    public String getDescription() {
+        return "Tuscany Library";
+    }
+
+    public int getKind() {
+        return IClasspathContainer.K_APPLICATION;
+    }
+
+    public IPath getPath() {
+        return TUSCANY_LIBRARY_CONTAINER;
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainerInitializer.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainerInitializer.java
new file mode 100644
index 0000000..c82281b
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainerInitializer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.classpath;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+/**
+ * A classpath container initializer for the Tuscany runtime.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyClasspathContainerInitializer extends ClasspathContainerInitializer {
+
+    @Override
+    public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+
+        TuscanyClasspathContainer classpathContainer = new TuscanyClasspathContainer();
+        JavaCore.setClasspathContainer(containerPath,
+                                       new IJavaProject[] {project},
+                                       new IClasspathContainer[] {classpathContainer},
+                                       null);
+    }
+
+    @Override
+    public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project) {
+        return true;
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
new file mode 100644
index 0000000..21f6f27
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
@@ -0,0 +1,69 @@
+/*
+ * 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.classpath;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * A classpath container page for the Tuscany runtime library.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLibraryEntryPage extends WizardPage implements IClasspathContainerPage {
+
+    private IClasspathEntry classpathEntry;
+
+    public TuscanyLibraryEntryPage() {
+        super("Tuscany");
+    }
+
+    public void createControl(Composite parent) {
+        setTitle("Tuscany Library");
+
+        Label label = new Label(parent, SWT.NONE);
+        label.setText("Press Finish to add the Tuscany Library");
+        label.setFont(parent.getFont());
+
+        setControl(label);
+    }
+
+    public boolean finish() {
+        classpathEntry = JavaCore.newContainerEntry(TuscanyClasspathContainer.TUSCANY_LIBRARY_CONTAINER);
+        return true;
+    }
+
+    public boolean isPageComplete() {
+        return true;
+    }
+
+    public IClasspathEntry getSelection() {
+        return classpathEntry;
+    }
+
+    public void setSelection(IClasspathEntry containerEntry) {
+        this.classpathEntry = containerEntry;
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyRuntimeClasspathContainer.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyRuntimeClasspathContainer.java
new file mode 100644
index 0000000..df73402
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyRuntimeClasspathContainer.java
@@ -0,0 +1,89 @@
+/*
+ * 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.classpath;
+
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.feature;
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.runtime;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+
+/**
+ * A classpath container for the Tuscany runtime.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TuscanyRuntimeClasspathContainer 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";
+    
+    public TuscanyRuntimeClasspathContainer() {
+    }
+
+    public IClasspathEntry[] getClasspathEntries() {
+        
+        // Find the Tuscany feature
+        IPath feature = feature();
+        
+        // Get the runtime location from the installed Tuscany feature
+        IPath runtimePath = runtime(feature);
+
+        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);
+            if (home == null || home.length() == 0) {
+                home = System.getenv(TUSCANY_HOME);
+            }
+            if (home != null && home.length() != 0) {
+                if (new File(home).exists()) {
+                    runtimePath = new Path(home);
+                }
+            }
+        }
+        
+        if (runtimePath != null) {
+            return new IClasspathEntry[] {JavaCore.newLibraryEntry(runtimePath, null, null)};
+        } else {
+            return new IClasspathEntry[0];
+        }
+    }
+
+    public String getDescription() {
+        return "Tuscany Library";
+    }
+
+    public int getKind() {
+        return IClasspathContainer.K_APPLICATION;
+    }
+
+    public IPath getPath() {
+        return TUSCANY_LIBRARY_CONTAINER;
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
new file mode 100644
index 0000000..bd255f4
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
@@ -0,0 +1,255 @@
+/*
+ * 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.ClasspathUtil;
+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());
+                
+                // Pass the runtime classpath as a system property
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "\"-DTUSCANY_PATH=" + ClasspathUtil.installedRuntimeClasspath() + "\"");
+
+                // 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();
+            }
+        }
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
new file mode 100644
index 0000000..c9b96c7
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
@@ -0,0 +1,244 @@
+/*
+ * 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.apache.tuscany.sca.core.classpath.ClasspathUtil;
+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.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());
+
+            // Pass the runtime classpath as a system property
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "\"-DTUSCANY_PATH=" + ClasspathUtil.installedRuntimeClasspath() + "\"");
+
+            // 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);
+        }
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
new file mode 100644
index 0000000..ddcfb66
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
@@ -0,0 +1,75 @@
+/*
+ * 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 java.io.File;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
+import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate;
+import org.eclipse.jdt.launching.ExecutionArguments;
+import org.eclipse.jdt.launching.IVMInstall;
+import org.eclipse.jdt.launching.IVMRunner;
+import org.eclipse.jdt.launching.VMRunnerConfiguration;
+
+/**
+ * Launch configuration delegate for the Tuscany launch configuration.
+ *
+ * @version $Rev$ $Date$
+ */
+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 {
+
+        // Verify the configuration
+        String mainTypeName = verifyMainTypeName(configuration);
+        IVMInstall vm = verifyVMInstall(configuration);
+        IVMRunner runner = vm.getVMRunner(mode);
+
+        ExecutionArguments execArgs =
+            new ExecutionArguments(getVMArguments(configuration), getProgramArguments(configuration));
+        Map vmAttributesMap = getVMSpecificAttributesMap(configuration);
+        String[] classpath = getClasspath(configuration);
+
+        File workingDir = verifyWorkingDirectory(configuration);
+        String workingDirName = null;
+        if (workingDir != null)
+            workingDirName = workingDir.getAbsolutePath();
+
+        // Create a VM runner configuration
+        VMRunnerConfiguration runConfig = new VMRunnerConfiguration(mainTypeName, classpath);
+        runConfig.setProgramArguments(execArgs.getProgramArgumentsArray());
+        runConfig.setVMArguments(execArgs.getVMArgumentsArray());
+        runConfig.setVMSpecificAttributesMap(vmAttributesMap);
+        runConfig.setWorkingDirectory(workingDirName);
+        runConfig.setBootClassPath(getBootpath(configuration));
+
+        // Run!!
+        runner.run(runConfig, launch, monitor);
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationTabGroup.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationTabGroup.java
new file mode 100644
index 0000000..738fe26
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationTabGroup.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.EnvironmentTab;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;
+
+/**
+ * Tab groups from the Tuscany launch configuration.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup implements
+    ILaunchConfigurationTabGroup {
+
+    public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+        ILaunchConfigurationTab[] tabs =
+            new ILaunchConfigurationTab[] {new JavaArgumentsTab(), new JavaJRETab(), new JavaClasspathTab(),
+                                           new SourceLookupTab(), new EnvironmentTab(), new CommonTab()};
+
+        setTabs(tabs);
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
new file mode 100644
index 0000000..895cde6
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
@@ -0,0 +1,79 @@
+/*
+ * 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.launchDomainManager;
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+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) {
+            error("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;
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeFilter.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeFilter.java
new file mode 100644
index 0000000..c5aeefb
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeFilter.java
@@ -0,0 +1,29 @@
+/*
+ * 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;
+
+/**
+ * TuscanyLaunchNodeFilter
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class TuscanyLaunchNodeFilter {
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
new file mode 100644
index 0000000..94ab29c
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
@@ -0,0 +1,88 @@
+/*
+ * 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 static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+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) {
+            error("Could not launch SCA composite", e);
+        }
+    }
+
+    public void launch(IEditorPart editor, String mode) {
+        //TODO later...
+    }
+    
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/log/LogUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/log/LogUtil.java
new file mode 100644
index 0000000..3bbdc81
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/log/LogUtil.java
@@ -0,0 +1,39 @@
+/*
+ * 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.log;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
+/**
+ * A log utility
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class LogUtil {
+    
+    public static void error(String msg, Exception e) {
+        Platform.getLog(
+                        Platform.getBundle("org.apache.tuscany.sca.core")).log(
+                        new Status(IStatus.ERROR, "org.apache.tuscany.sca.core", IStatus.OK, msg, e));
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizard.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizard.java
new file mode 100644
index 0000000..09b800f
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizard.java
@@ -0,0 +1,53 @@
+/*
+ * 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.newwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWizard;
+
+/**
+ * A wizard to create new .componentType files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewComponentTypeWizard extends Wizard implements IWorkbenchWizard {
+
+	private IWorkbench workbench;
+	private IStructuredSelection selection;
+	private NewComponentTypeWizardPage mainPage;
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+	      this.workbench = workbench;
+	      this.selection = selection;
+	      setWindowTitle("New SCA ComponentType");
+	}
+	
+	public void addPages() {
+		mainPage = new NewComponentTypeWizardPage(workbench, selection);
+		addPage(mainPage);
+	}	
+	
+	@Override
+	public boolean performFinish() {
+		return mainPage.finish();
+	}
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizardPage.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizardPage.java
new file mode 100644
index 0000000..53b9607
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizardPage.java
@@ -0,0 +1,98 @@
+/*
+ * 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.newwizards;
+
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintWriter;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Wizard page for the new .componentType file wizard.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewComponentTypeWizardPage extends WizardNewFileCreationPage {
+        
+        private IWorkbench workbench;
+
+        public NewComponentTypeWizardPage(IWorkbench workbench, IStructuredSelection selection)  {
+                super("New SCA ComponentType Page", selection);
+                
+                this.workbench = workbench;
+                
+                setTitle("SCA ComponentType");
+                setDescription("Create a new SCA ComponentType.");
+                
+                try {
+                        String location = FileLocator.toFileURL(Platform.getBundle("org.apache.tuscany.sca.core").getEntry("/")).getFile().toString();
+                        setImageDescriptor(ImageDescriptor.createFromImageData((new ImageLoader()).load(location + "/icons/tuscany.gif")[0]));
+                } catch (Exception e) {
+                    error("Could not create wizard", e);
+                }
+                
+                setFileName("sample.componentType");
+                
+        }
+        
+        public boolean finish() {
+                try {
+                        IFile file = createNewFile();
+                        
+            IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+                IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+                IDE.openEditor(workbenchPage, file, true);
+                } catch (Exception e) {
+                    error("Could not open editor", e);
+                    return false;
+                }
+                return true;
+        }
+
+        @Override
+        protected InputStream getInitialContents() {
+                
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                PrintWriter printWriter = new PrintWriter(outputStream);
+                printWriter.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+                printWriter.println("<componentType xmlns=\"http://www.osoa.org/xmlns/sca/1.0\"");
+                printWriter.println("    xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.0\">");        
+                printWriter.println();
+                printWriter.println();
+                printWriter.println("</componentType>");
+                printWriter.close();
+                
+                return new ByteArrayInputStream(outputStream.toByteArray());
+        }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizard.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizard.java
new file mode 100644
index 0000000..f07f0b6
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizard.java
@@ -0,0 +1,53 @@
+/*
+ * 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.newwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWizard;
+
+/**
+ * A wizard to create new .composite files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewCompositeWizard extends Wizard implements IWorkbenchWizard {
+	
+	private IWorkbench workbench;
+	private IStructuredSelection selection;
+	private NewCompositeWizardPage mainPage;
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+	      this.workbench = workbench;
+	      this.selection = selection;
+	      setWindowTitle("New SCA Composite");
+	}
+	
+	public void addPages() {
+		mainPage = new NewCompositeWizardPage(workbench, selection);
+		addPage(mainPage);
+	}	
+	
+	@Override
+	public boolean performFinish() {
+		return mainPage.finish();
+	}
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizardPage.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizardPage.java
new file mode 100644
index 0000000..bbca961
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizardPage.java
@@ -0,0 +1,105 @@
+/*
+ * 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.newwizards;
+
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintWriter;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Wizard page for the new .composite file wizard.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewCompositeWizardPage extends WizardNewFileCreationPage {
+        
+        private IWorkbench workbench;
+
+        public NewCompositeWizardPage(IWorkbench workbench, IStructuredSelection selection)  {
+                super("New SCA Composite Page", selection);
+                
+                this.workbench = workbench;
+                
+                setTitle("SCA Composite");
+                setDescription("Create a new SCA Composite.");
+                
+                try {
+                        String location = FileLocator.toFileURL(Platform.getBundle("org.apache.tuscany.sca.core").getEntry("/")).getFile().toString();
+                        setImageDescriptor(ImageDescriptor.createFromImageData((new ImageLoader()).load(location + "/icons/tuscany.gif")[0]));
+                } catch (Exception e) {
+                    error("Could not create wizard", e);
+                }
+                
+                setFileName("sample.composite");
+                
+        }
+        
+        public boolean finish() {
+                try {
+                        IFile file = createNewFile();
+                        
+            IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+                IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+                IDE.openEditor(workbenchPage, file, true);
+                } catch (Exception e) {
+                    error("Could not open editor", e);
+                        return false;
+                }
+                return true;
+        }
+
+        @Override
+        protected InputStream getInitialContents() {
+
+                IPath path = new Path(getFileName());
+                String name = path.removeFileExtension().toString();
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                PrintWriter printWriter = new PrintWriter(outputStream);
+                printWriter.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");              
+                printWriter.println("<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\"");
+                printWriter.println("    xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.0\"");
+                printWriter.println("    xmlns:c=\"http://" + name + "\"");     
+                printWriter.println("    targetNamespace=\"http://" + name + "\"");      
+                printWriter.println("    name=\"" + name + "\">");
+                printWriter.println();
+                printWriter.println();
+                printWriter.println("</composite>");
+                printWriter.close();
+                
+                return new ByteArrayInputStream(outputStream.toByteArray());
+        }
+}