You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by st...@apache.org on 2013/08/28 17:08:07 UTC

svn commit: r1518249 - in /sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np: ./ AbstractNewSlingApplicationWizard.java ArchetypeParametersWizardPage.java ChooseArchetypeWizardPage.java SetupServerWizardPage.java

Author: stefanegli
Date: Wed Aug 28 15:08:06 2013
New Revision: 1518249

URL: http://svn.apache.org/r1518249
Log:
SLING-3032 : adding a 'new' application wizard which creates a set of application-projects based on a maven-archetype. This feature is whitelabel-ready - see SLING-3031

Added:
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java   (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java   (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java   (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java   (with props)

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java?rev=1518249&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java (added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java Wed Aug 28 15:08:06 2013
@@ -0,0 +1,363 @@
+/*
+ * 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.sling.ide.eclipse.ui.wizards.np;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.maven.archetype.catalog.Archetype;
+import org.apache.maven.model.Model;
+import org.apache.sling.ide.eclipse.core.MavenLaunchHelper;
+import org.apache.sling.ide.eclipse.core.ProjectUtil;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.project.ProjectImportConfiguration;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.IServerWorkingCopy;
+import org.eclipse.wst.server.core.ServerUtil;
+
+public abstract class AbstractNewSlingApplicationWizard extends Wizard implements INewWizard {
+	private ChooseArchetypeWizardPage chooseArchetypePage;
+	private ArchetypeParametersWizardPage archetypeParametersPage;
+	private SetupServerWizardPage setupServerWizardPage;
+
+	// branding
+	public abstract ImageDescriptor getLogo();
+	public abstract String doGetWindowTitle();
+	public abstract boolean acceptsArchetype(Archetype archetype2);
+
+	/**
+	 * Constructor for AbstractNewSlingApplicationWizard.
+	 */
+	public AbstractNewSlingApplicationWizard() {
+		super();
+		setWindowTitle(doGetWindowTitle());
+		setNeedsProgressMonitor(true);
+	}
+	
+	
+	/**
+	 * Adding the page to the wizard.
+	 */
+
+	public void addPages() {
+		chooseArchetypePage = new ChooseArchetypeWizardPage(this);
+		addPage(chooseArchetypePage);
+		archetypeParametersPage = new ArchetypeParametersWizardPage(this);
+		addPage(archetypeParametersPage);
+		setupServerWizardPage = new SetupServerWizardPage(this);
+		addPage(setupServerWizardPage);
+	}
+	
+	public ChooseArchetypeWizardPage getChooseArchetypePage() {
+		return chooseArchetypePage;
+	}
+
+	/**
+	 * This method is called when 'Finish' button is pressed in
+	 * the wizard. We will create an operation and run it
+	 * using wizard as execution context.
+	 */
+	public boolean performFinish() {
+        try {
+			getContainer().run(false, true, new IRunnableWithProgress() {
+
+				@Override
+				public void run(IProgressMonitor monitor)
+						throws InvocationTargetException, InterruptedException {
+					try {
+						performFinish(monitor);
+					} catch (Exception e) {
+						// TODO proper logging
+						e.printStackTrace();
+						MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), 
+			                    SWT.OK | SWT.ICON_ERROR);
+			            messageBox.setText("Creating application failed");
+			            StringBuffer sb = new StringBuffer();
+			            Throwable t = e;
+			            while(t!=null) {
+			            	if (sb.length()!=0) {
+			            		sb.append(System.getProperty("line.separator"));
+			            	}
+			            	sb.append(t.getMessage());
+			            	t = t.getCause();
+			            }
+			            messageBox.setMessage(sb.toString());
+			            messageBox.open();
+					}
+				}
+				
+			});
+			return true;
+        } catch (InterruptedException e) {
+        	// that's fine, the user interrupted - dont complain
+        	return false;
+		} catch (InvocationTargetException e) {
+			// TODO proper logging
+			e.printStackTrace();
+			MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), 
+                    SWT.OK | SWT.ICON_ERROR);
+            messageBox.setText("Creating application failed");
+            StringBuffer sb = new StringBuffer();
+            Throwable t = e;
+            while(t!=null) {
+            	if (sb.length()!=0) {
+            		sb.append(System.getProperty("line.separator"));
+            	}
+            	sb.append(t.getMessage());
+            	t = t.getCause();
+            }
+            messageBox.setMessage(sb.toString());
+            messageBox.open();
+			return false;
+		}
+	}
+        
+	private boolean performFinish(IProgressMonitor monitor) throws Exception {
+
+		IPath location = chooseArchetypePage.getLocation();
+		Archetype archetype = chooseArchetypePage.getSelectedArchetype();
+		String groupId = archetypeParametersPage.getGroupId();
+		String artifactId = archetypeParametersPage.getArtifactId();
+		String version = archetypeParametersPage.getVersion();
+		String javaPackage = archetypeParametersPage.getJavaPackage();
+		Properties properties = archetypeParametersPage.getProperties();
+		ProjectImportConfiguration configuration = new ProjectImportConfiguration();
+
+		monitor.worked(1);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		List<IProject> projects = MavenPlugin.getProjectConfigurationManager().createArchetypeProjects(
+				location, archetype, groupId, artifactId, version, javaPackage, properties, configuration, monitor);
+		
+		monitor.worked(3);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		List<IProject> contentProjects = new LinkedList<IProject>();
+		List<IProject> bundleProjects = new LinkedList<IProject>();
+		IProject reactorProject = null;
+		for (Iterator<IProject> it = projects.iterator(); it.hasNext();) {
+			IProject project = it.next();
+			IFile pomFile = project.getFile("pom.xml");
+			if (!pomFile.exists()) {
+				// then ignore this project - we only deal with maven projects
+				continue;
+			}
+			final Model model = MavenPlugin.getMavenModelManager().readMavenModel(pomFile);
+			final String packaging = model.getPackaging();
+
+			if ("content-package".equals(packaging)) {
+				contentProjects.add(project);
+			} else if ("bundle".equals(packaging)) {
+				bundleProjects.add(project);
+			} else if ("pom".equals(packaging)) {
+				if (reactorProject==null) {
+					reactorProject = project;
+				} else {
+					IPath currLocation = project.getFullPath();
+					IPath prevLocation = reactorProject.getFullPath();
+					if (currLocation.isPrefixOf(prevLocation)) {
+						// assume reactor is up in the folder structure
+						reactorProject = project;
+					}
+				}
+			}
+		}
+		
+		IServer server = setupServerWizardPage.getOrCreateServer();
+		monitor.worked(1);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		for (Iterator<IProject> it = contentProjects.iterator(); it.hasNext();) {
+			IProject aContentProject = it.next();
+			configureContentProject(aContentProject, projects, monitor);
+		}
+		for (Iterator<IProject> it = bundleProjects.iterator(); it.hasNext();) {
+			IProject aBundleProject = it.next();
+			configureBundleProject(aBundleProject, projects, monitor);
+		}
+		
+		configureReactorProject(reactorProject, monitor);
+		monitor.worked(1);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		finishConfiguration(projects, server, monitor);
+		monitor.worked(1);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		updateProjectConfigurations(projects, monitor);
+		monitor.worked(1);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		monitor.worked(2);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+
+		IServerWorkingCopy wc = server.createWorkingCopy();
+		// add the bundle and content projects, ie modules, to the server
+		List<IModule> modules = new LinkedList<IModule>();
+		for (Iterator<IProject> it = bundleProjects.iterator(); it.hasNext();) {
+			IProject project = it.next();
+			IModule module = ServerUtil.getModule(project);
+			modules.add(module);
+		}
+		for (Iterator<IProject> it = contentProjects.iterator(); it.hasNext();) {
+			IProject project = it.next();
+			IModule module = ServerUtil.getModule(project);
+			modules.add(module);
+		}
+		wc.modifyModules(modules.toArray(new IModule[modules.size()]), new IModule[0], monitor);
+		IServer newServer = wc.save(true, monitor);
+		newServer.start(ILaunchManager.RUN_MODE, monitor);
+		
+		monitor.worked(2);
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		
+		ILaunchConfiguration launchConfig = 
+				DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(reactorProject.getFolder(".settings").getFolder(".launches").getFile("initial_install.launch"));
+		if (launchConfig!=null) {
+			ILaunch theLaunch = launchConfig.launch(ILaunchManager.RUN_MODE, monitor, true);
+			monitor.setTaskName("mvn install");
+			while(!theLaunch.isTerminated()) {
+				Thread.sleep(500);
+				monitor.worked(1);
+			}
+		}
+		
+		wc.getOriginal().publish(IServer.PUBLISH_FULL, monitor);
+		
+		// also add 'java 1.6' and 'jst.ejb 3.1'
+//		IFacetedProject fp2 = ProjectFacetsManager.create(uiProject, true, null);
+//		IProjectFacet java = ProjectFacetsManager.getProjectFacet("java");
+//		fp2.installProjectFacet(java.getVersion("1.6"), null, null);
+//		IProjectFacet dynamicWebModule = ProjectFacetsManager.getProjectFacet("jst.web");
+//		fp2.installProjectFacet(dynamicWebModule.getLatestVersion(), null, null);
+
+		monitor.worked(2);
+		monitor.done();
+		return true;
+	}
+	
+	protected void finishConfiguration(List<IProject> projects,
+			IServer server, IProgressMonitor monitor) throws CoreException {
+		// nothing to be done by default - hook for subclasses
+	}
+	
+	protected void updateProjectConfigurations(List<IProject> projects, IProgressMonitor monitor) throws CoreException {
+		for (Iterator<IProject> it = projects.iterator(); it.hasNext();) {
+			IProject project = it.next();
+			MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
+		}
+	}
+
+	protected void configureBundleProject(IProject aBundleProject,
+			List<IProject> projects, IProgressMonitor monitor) throws CoreException {
+		IProjectFacet slingContentFacet = ProjectFacetsManager.getProjectFacet("sling.bundle");
+		IFacetedProject fp2 = ProjectFacetsManager.create(aBundleProject, true, null);
+		fp2.installProjectFacet(slingContentFacet.getLatestVersion(), null, null);
+	}
+	
+	protected Model getMavenModel(IProject project) {
+		IFile pomFile = project.getFile("pom.xml");
+		if (!pomFile.exists()) {
+			return null;
+		}
+		try {
+			Model model = MavenPlugin.getMavenModelManager().readMavenModel(pomFile);
+			return model;
+		} catch (CoreException e) {
+			// TODO proper logging
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	protected void configureContentProject(IProject aContentProject,
+			List<IProject> projects, IProgressMonitor monitor) throws CoreException {
+		IProjectFacet slingContentFacet = ProjectFacetsManager.getProjectFacet("sling.content");
+		IFacetedProject fp2 = ProjectFacetsManager.create(aContentProject, true, null);
+		fp2.installProjectFacet(slingContentFacet.getLatestVersion(), null, null);
+		
+		
+		ProjectUtil.setSyncDirectoryPath(aContentProject, "src/main/content/jcr_root");
+		
+		// temp hack: install the launch file
+		IFolder dotLaunches = aContentProject.getFolder(".settings").getFolder(".launches");
+		dotLaunches.create(true, true, monitor);
+		IFile launchFile = dotLaunches.getFile("clean_package_content_package_install.launch");
+		String l = MavenLaunchHelper.createMavenLaunchConfigMemento(aContentProject.getLocation().toOSString(), 
+				"clean package content-package:install", null, false, null);
+		InputStream in = new ByteArrayInputStream(l.getBytes());
+		launchFile.create(in, true, monitor);
+	}
+
+	protected void configureReactorProject(IProject reactorProject, IProgressMonitor monitor) throws CoreException {
+		// temp hack: install the launch file
+		IFolder dotLaunches = reactorProject.getFolder(".settings").getFolder(".launches");
+		dotLaunches.create(true, true, monitor);
+		IFile launchFile = dotLaunches.getFile("initial_install.launch");
+		String l = MavenLaunchHelper.createMavenLaunchConfigMemento(reactorProject.getLocation().toOSString(), 
+				"install", null, false, null);
+		InputStream in = new ByteArrayInputStream(l.getBytes());
+		launchFile.create(in, true, monitor);
+	}
+	
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+	}
+}
\ No newline at end of file

Propchange: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java?rev=1518249&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java (added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java Wed Aug 28 15:08:06 2013
@@ -0,0 +1,299 @@
+/*
+ * 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.sling.ide.eclipse.ui.wizards.np;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.maven.archetype.catalog.Archetype;
+import org.apache.maven.archetype.metadata.RequiredProperty;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.eclipse.jface.dialogs.IDialogPage;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
+import org.eclipse.m2e.core.internal.archetype.ArchetypeManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+@SuppressWarnings("restriction")
+public class ArchetypeParametersWizardPage extends WizardPage {
+	
+	private static final String KEY_PROPERTY = "key";
+
+	private static final String VALUE_PROPERTY = "value";
+
+	private Text groupId;
+	
+	private Text artifactId;
+	
+	private Text javaPackage;
+
+	private final AbstractNewSlingApplicationWizard parent;
+
+	private TableViewer propertiesViewer;
+
+	private Table propertiesTable;
+
+	private List<RequiredProperty> properties;
+
+	private Text version;
+	
+	public ArchetypeParametersWizardPage(AbstractNewSlingApplicationWizard parent) {
+		super("archetypeParametersPage");
+		this.parent = parent;
+		setTitle("Configure Archetype Properties");
+		setDescription("This step configured the archetype properties");
+		setImageDescriptor(parent.getLogo());
+	}
+
+	/**
+	 * @see IDialogPage#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		container.setLayout(layout);
+		layout.numColumns = 2;
+		layout.verticalSpacing = 9;
+		
+		Label label = new Label(container, SWT.NULL);
+		label.setText("&Group Id:");
+		groupId = new Text(container, SWT.BORDER | SWT.SINGLE);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		groupId.setLayoutData(gd);
+		groupId.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+
+		label = new Label(container, SWT.NULL);
+		label.setText("&Artifact Id:");
+
+		artifactId = new Text(container, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		artifactId.setLayoutData(gd);
+		artifactId.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+
+		label = new Label(container, SWT.NULL);
+		label.setText("&Version:");
+
+		version = new Text(container, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		version.setLayoutData(gd);
+		version.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+
+		label = new Label(container, SWT.NULL);
+		label.setText("&Package:");
+
+		javaPackage = new Text(container, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		javaPackage.setLayoutData(gd);
+		javaPackage.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+		
+		label = new Label(container, SWT.NULL);
+		gd = new GridData(SWT.LEFT, SWT.TOP, false, false);
+		label.setLayoutData(gd);
+		label.setText("&Parameters:");
+
+
+	    propertiesViewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
+	    propertiesTable = propertiesViewer.getTable();
+	    propertiesTable.setLinesVisible(true);
+	    propertiesTable.setHeaderVisible(true);
+	    propertiesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2));
+
+	    TableColumn propertiesTableNameColumn = new TableColumn(propertiesTable, SWT.NONE);
+	    propertiesTableNameColumn.setWidth(130);
+	    propertiesTableNameColumn.setText("Name");
+
+	    TableColumn propertiesTableValueColumn = new TableColumn(propertiesTable, SWT.NONE);
+	    propertiesTableValueColumn.setWidth(230);
+	    propertiesTableValueColumn.setText("Value");
+
+	    propertiesViewer.setColumnProperties(new String[] {KEY_PROPERTY, VALUE_PROPERTY});
+
+	    propertiesViewer.setCellEditors(new CellEditor[] {new TextCellEditor(propertiesTable, SWT.NONE),
+	        new TextCellEditor(propertiesTable, SWT.NONE)});
+	    propertiesViewer.setCellModifier(new ICellModifier() {
+	      public boolean canModify(Object element, String property) {
+	        return true;
+	      }
+
+	      public void modify(Object element, String property, Object value) {
+	        if(element instanceof TableItem) {
+	          ((TableItem) element).setText(getTextIndex(property), String.valueOf(value));
+	          dialogChanged();
+	        }
+	      }
+
+	      public Object getValue(Object element, String property) {
+	        if(element instanceof TableItem) {
+	          return ((TableItem) element).getText(getTextIndex(property));
+	        }
+	        return null;
+	      }
+	    });		
+		
+		initialize();
+		setPageComplete(false);
+		setControl(container);
+	}
+	
+	protected int getTextIndex(String property) {
+		if (KEY_PROPERTY.equals(property)) {
+			return 0;
+		} else {
+			return 1;
+		}
+	}
+
+	@Override
+	public void setVisible(boolean visible) {
+		super.setVisible(visible);
+		if (visible) {
+			initialize();
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private void initialize() {
+		if (propertiesTable==null) {
+			return;
+		}
+		
+		Archetype archetype = parent.getChooseArchetypePage().getSelectedArchetype();
+		if (archetype==null) {
+			return;
+		}
+		
+        try {
+        	ArchetypeManager archetypeManager = MavenPluginActivator.getDefault().getArchetypeManager();
+        	ArtifactRepository remoteArchetypeRepository = archetypeManager.getArchetypeRepository(archetype);
+			properties = (List<RequiredProperty>) archetypeManager.getRequiredProperties(archetype, remoteArchetypeRepository, null);
+			
+			Table table = propertiesViewer.getTable();
+			table.setItemCount(properties.size());
+			int i = 0;
+			for (Iterator<RequiredProperty> it = properties.iterator(); it.hasNext();) {
+				RequiredProperty rp = it.next();
+				TableItem item = table.getItem(i++);
+				if (!rp.getKey().equals(item.getText())) {
+					// then create it - otherwise, reuse it
+					item.setText(0, rp.getKey());
+					item.setText(1, "");
+					item.setData(item);
+				}
+			}
+		} catch (Exception e) {
+			throw new RuntimeException("Could not process archetype: "+e.getMessage(), e);
+		}
+
+	}
+
+
+	/**
+	 * Ensures that both text fields are set.
+	 */
+
+	private void dialogChanged() {
+		if (groupId.getText().length()==0) {
+			updateStatus("group Id must be specified");
+			return;
+		}
+		if (artifactId.getText().length()==0) {
+			updateStatus("artifact Id must be specified");
+			return;
+		}
+		if (version.getText().length()==0) {
+			updateStatus("version must be specified");
+			return;
+		}
+		if (javaPackage.getText().length()==0) {
+			updateStatus("package must be specified");
+			return;
+		}
+		int cnt = propertiesTable.getItemCount();
+		for(int i=0; i<cnt; i++) {
+			TableItem item = propertiesTable.getItem(i);
+			if (item.getText(1).length()==0) {
+				updateStatus(item.getText(0)+" must be specified");
+				return;
+			}
+		}
+
+		updateStatus(null);
+	}
+
+	private void updateStatus(String message) {
+		setErrorMessage(message);
+		setPageComplete(message == null);
+	}
+
+	public String getGroupId() {
+		return groupId.getText();
+	}
+
+	public String getArtifactId() {
+		return groupId.getText();
+	}
+
+	public String getVersion() {
+		return version.getText();
+	}
+
+	public String getJavaPackage() {
+		return javaPackage.getText();
+	}
+
+	public Properties getProperties() {
+		int cnt = propertiesTable.getItemCount();
+		Properties p = new Properties();
+		for(int i=0; i<cnt; i++) {
+			TableItem item = propertiesTable.getItem(i);
+			p.put(item.getText(0), item.getText(1));
+		}
+		return p;
+	}
+
+}
\ No newline at end of file

Propchange: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java?rev=1518249&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java (added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java Wed Aug 28 15:08:06 2013
@@ -0,0 +1,266 @@
+/*
+ * 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.sling.ide.eclipse.ui.wizards.np;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.maven.archetype.catalog.Archetype;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
+import org.eclipse.m2e.core.internal.archetype.ArchetypeCatalogFactory;
+import org.eclipse.m2e.core.internal.archetype.ArchetypeManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.progress.IProgressService;
+
+@SuppressWarnings("restriction")
+public class ChooseArchetypeWizardPage extends WizardPage {
+	
+	private static final String LOADING_PLEASE_WAIT = "loading, please wait...";
+	private List knownArchetypesList;
+	private Map<String, Archetype> archetypesMap = new HashMap<String, Archetype>();
+	private Button useDefaultWorkspaceLocationButton;
+	private Label locationLabel;
+	private Combo locationCombo;
+	private final AbstractNewSlingApplicationWizard parent;
+
+	public ChooseArchetypeWizardPage(AbstractNewSlingApplicationWizard parent) {
+		super("chooseArchetypePage");
+		this.parent = parent;
+		setTitle("Choose Project Location and Archetype");
+		setDescription("This step defines the project location and archetype");
+		setImageDescriptor(parent.getLogo());
+	}
+
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		container.setLayout(layout);
+		layout.numColumns = 3;
+		layout.verticalSpacing = 9;
+
+	    useDefaultWorkspaceLocationButton = new Button(container, SWT.CHECK);
+	    GridData useDefaultWorkspaceLocationButtonData = new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1);
+	    useDefaultWorkspaceLocationButton.setLayoutData(useDefaultWorkspaceLocationButtonData);
+	    useDefaultWorkspaceLocationButton
+	        .setText("Use default Workspace location");
+	    useDefaultWorkspaceLocationButton.addSelectionListener(new SelectionAdapter() {
+	      public void widgetSelected(SelectionEvent e) {
+	        boolean inWorkspace = useDefaultWorkspaceLocationButton.getSelection();
+	        locationLabel.setEnabled(!inWorkspace);
+	        locationCombo.setEnabled(!inWorkspace);
+	        dialogChanged();
+	      }
+	    });
+	    useDefaultWorkspaceLocationButton.setSelection(true);
+
+	    locationLabel = new Label(container, SWT.NONE);
+	    GridData locationLabelData = new GridData();
+	    locationLabelData.horizontalIndent = 10;
+	    locationLabel.setLayoutData(locationLabelData);
+	    locationLabel.setText("Location:");
+	    locationLabel.setEnabled(false);
+
+	    locationCombo = new Combo(container, SWT.NONE);
+	    GridData locationComboData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+	    locationCombo.setLayoutData(locationComboData);
+	    locationCombo.addModifyListener(new ModifyListener() {
+	      public void modifyText(ModifyEvent e) {
+	    	  dialogChanged();
+	      }
+	    });
+	    locationCombo.setEnabled(false);
+
+	    Button locationBrowseButton = new Button(container, SWT.NONE);
+	    GridData locationBrowseButtonData = new GridData(SWT.FILL, SWT.CENTER, false, false);
+	    locationBrowseButton.setLayoutData(locationBrowseButtonData);
+	    locationBrowseButton.setText("Browse...");
+	    locationBrowseButton.addSelectionListener(new SelectionAdapter() {
+	      public void widgetSelected(SelectionEvent e) {
+	        DirectoryDialog dialog = new DirectoryDialog(getShell());
+	        dialog.setText("Select Location");
+
+	        String path = locationCombo.getText();
+	        if(path.length() == 0) {
+	          path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
+	        }
+	        dialog.setFilterPath(path);
+
+	        String selectedDir = dialog.open();
+	        if(selectedDir != null) {
+	          locationCombo.setText(selectedDir);
+	          useDefaultWorkspaceLocationButton.setSelection(false);
+	          dialogChanged();
+	        }
+	      }
+	    });
+		
+		
+		Label label = new Label(container, SWT.NULL);
+		label.setText("&Archetype:");
+
+		knownArchetypesList = new List(container, SWT.BORDER);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		knownArchetypesList.setLayoutData(gd);
+		knownArchetypesList.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				dialogChanged();
+			}
+		});
+		
+		initialize();
+		setPageComplete(false);
+		setControl(container);
+	}
+
+	public Archetype getSelectedArchetype() {
+		String[] sel = knownArchetypesList.getSelection();
+		if (sel==null || sel.length!=1) {
+			return null;
+		}
+		String s = sel[0];
+		Archetype a = archetypesMap.get(s);
+		return a;
+	}
+	
+	private void initialize() {
+		knownArchetypesList.add(LOADING_PLEASE_WAIT);
+		IWorkbench workbench = DebugUIPlugin.getDefault().getWorkbench();
+		IProgressService progressService = workbench.getProgressService();
+		try {
+			progressService.run(true, false, new IRunnableWithProgress() {
+					
+				@Override
+				public void run(IProgressMonitor monitor) throws InvocationTargetException,
+						InterruptedException {
+					monitor.beginTask("discoverying archetypes...", 5);
+				    ArchetypeManager manager = MavenPluginActivator.getDefault().getArchetypeManager();
+				    monitor.worked(1);
+				    Collection<ArchetypeCatalogFactory> archetypeCatalogs = manager.getArchetypeCatalogs();
+				    monitor.worked(2);
+				    ArrayList<Archetype> list = new ArrayList<Archetype>();
+				    for(ArchetypeCatalogFactory catalog : archetypeCatalogs) {
+				        try {
+						  @SuppressWarnings("unchecked")
+						  java.util.List<Archetype> arcs = catalog.getArchetypeCatalog().getArchetypes();
+				          if(arcs != null) {
+				            list.addAll(arcs);
+				          }
+				        } catch(Exception ce) {
+				        	ce.printStackTrace();
+				        }
+				      }
+				    monitor.worked(1);
+				    for (Iterator<Archetype> it = list
+							.iterator(); it.hasNext();) {
+						Archetype archetype2 = it.next();
+						if (parent.acceptsArchetype(archetype2)) {
+							String key = keyFor(archetype2);
+							archetypesMap.put(key, archetype2);
+						}
+						
+					}
+				    monitor.worked(1);
+			        Display.getDefault().asyncExec(new Runnable() {
+			            public void run() {
+			            	Set<String> keys = archetypesMap.keySet();
+			            	knownArchetypesList.removeAll();
+			            	for (Iterator<String> it = keys.iterator(); it
+									.hasNext();) {
+								String aKey = it.next();
+								knownArchetypesList.add(aKey);
+							}
+			            	knownArchetypesList.pack();
+			            }
+			          });
+			        monitor.done();
+
+				}
+			});
+		} catch (InvocationTargetException e) {
+			// TODO proper logging
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			// TODO proper logging
+			e.printStackTrace();
+		}
+	}
+
+	private String keyFor(Archetype archetype2) {
+		return archetype2.getGroupId() + " : "+archetype2.getArtifactId() + " : "+archetype2.getVersion();
+	}
+
+	private void dialogChanged() {
+		if (knownArchetypesList.getItemCount()==1 &&
+				knownArchetypesList.getItem(0).equals(LOADING_PLEASE_WAIT)) {
+			setErrorMessage(null);
+			setPageComplete(false);
+			return;
+		}
+		if (knownArchetypesList.getSelectionCount()!=1) {
+			updateStatus("archetype must be selected");
+			return;
+		}
+		if (!useDefaultWorkspaceLocationButton.getSelection() &&
+				locationCombo.getText().length()==0) {
+			updateStatus("location must be specified");
+			return;
+		}
+		updateStatus(null);
+	}
+
+	private void updateStatus(String message) {
+		setErrorMessage(message);
+		setPageComplete(message == null);
+	}
+
+	public IPath getLocation() {
+		if (!useDefaultWorkspaceLocationButton.getSelection() && 
+				locationCombo.getText().length()>0) {
+			return new Path(locationCombo.getText());
+		} else {
+			return null;
+		}
+	}
+
+}
\ No newline at end of file

Propchange: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java?rev=1518249&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java (added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java Wed Aug 28 15:08:06 2013
@@ -0,0 +1,288 @@
+/*
+ * 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.sling.ide.eclipse.ui.wizards.np;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.IServerType;
+import org.eclipse.wst.server.core.IServerWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+
+public class SetupServerWizardPage extends WizardPage {
+	
+	private Button useExistingServer;
+	private Combo existingServerCombo;
+	private Button setupNewServer;
+	private Text newServerName;
+	private Text newServerHostnameName;
+	private Text newServerPort;
+	private Text newServerDebugPort;
+	
+	private Map<String, IServer> serversMap = new HashMap<String, IServer>();
+
+	public SetupServerWizardPage(AbstractNewSlingApplicationWizard parent) {
+		super("chooseArchetypePage");
+		setTitle("Select or Setup Launchpad Server");
+		setDescription("This step defines which server to use with the new Sling application.");
+		setImageDescriptor(parent.getLogo());
+	}
+
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		container.setLayout(layout);
+		layout.numColumns = 3;
+		layout.verticalSpacing = 9;
+
+		useExistingServer = new Button(container, SWT.RADIO);
+	    GridData useExistingServerButtonData = new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1);
+	    useExistingServer.setLayoutData(useExistingServerButtonData);
+	    useExistingServer.setText("Add to existing server");
+
+	    Label existingServerLabel = new Label(container, SWT.NONE);
+	    GridData locationLabelData = new GridData();
+	    locationLabelData.horizontalIndent = 10;
+	    existingServerLabel.setLayoutData(locationLabelData);
+	    existingServerLabel.setText("Location:");
+	    existingServerLabel.setEnabled(true);
+
+	    existingServerCombo = new Combo(container, SWT.DROP_DOWN | SWT.READ_ONLY);
+	    GridData locationComboData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+	    existingServerCombo.setLayoutData(locationComboData);
+	    existingServerCombo.addModifyListener(new ModifyListener() {
+	      public void modifyText(ModifyEvent e) {
+	    	  dialogChanged();
+	      }
+	    });
+	    existingServerCombo.setEnabled(true);
+
+	    {
+		    setupNewServer = new Button(container, SWT.RADIO);
+		    GridData setupNewServerButtonData = new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1);
+		    setupNewServer.setLayoutData(setupNewServerButtonData);
+		    setupNewServer.setText("Setup new server");
+	    }
+	    
+		{
+			Label newServerLabel;
+		    newServerLabel = new Label(container, SWT.NONE);
+		    GridData newServerLabelData = new GridData();
+		    newServerLabelData.horizontalIndent = 10;
+		    newServerLabel.setLayoutData(newServerLabelData);
+		    newServerLabel.setText("Server name:");
+		    newServerLabel.setEnabled(true);
+	    }
+
+	    {
+		    newServerName = new Text(container, SWT.BORDER);
+		    GridData newServerNameData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		    newServerName.setLayoutData(newServerNameData);
+	    }
+	    
+		{
+			Label newServerHostnameLabel;
+		    newServerHostnameLabel = new Label(container, SWT.NONE);
+		    GridData newServerHostnameLabelData = new GridData();
+		    newServerHostnameLabelData.horizontalIndent = 10;
+		    newServerHostnameLabel.setLayoutData(newServerHostnameLabelData);
+		    newServerHostnameLabel.setText("Host name:");
+		    newServerHostnameLabel.setEnabled(true);
+	    }
+
+	    {
+		    newServerHostnameName = new Text(container, SWT.BORDER);
+		    GridData newServerHostnameNameData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		    newServerHostnameName.setLayoutData(newServerHostnameNameData);
+	    }
+	    
+		{
+			Label newServerPortLabel;
+			newServerPortLabel = new Label(container, SWT.NONE);
+		    GridData newServerPortLabelData = new GridData();
+		    newServerPortLabelData.horizontalIndent = 10;
+		    newServerPortLabel.setLayoutData(newServerPortLabelData);
+		    newServerPortLabel.setText("Port:");
+		    newServerPortLabel.setEnabled(true);
+	    }
+
+	    {
+		    newServerPort = new Text(container, SWT.BORDER);
+		    GridData newServerPortData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		    newServerPort.setLayoutData(newServerPortData);
+	    }
+	    
+		{
+			Label newServerDebugPortLabel;
+			newServerDebugPortLabel = new Label(container, SWT.NONE);
+		    GridData newServerDebugPortLabelData = new GridData();
+		    newServerDebugPortLabelData.horizontalIndent = 10;
+		    newServerDebugPortLabel.setLayoutData(newServerDebugPortLabelData);
+		    newServerDebugPortLabel.setText("Debug Port:");
+		    newServerDebugPortLabel.setEnabled(true);
+	    }
+
+	    {
+		    newServerDebugPort = new Text(container, SWT.BORDER);
+		    GridData newServerDebugPortData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		    newServerDebugPort.setLayoutData(newServerDebugPortData);
+	    }
+	    
+	    
+	    SelectionAdapter radioListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				existingServerCombo.setEnabled(useExistingServer.getSelection());
+				newServerName.setEnabled(setupNewServer.getSelection());
+				newServerHostnameName.setEnabled(setupNewServer.getSelection());
+				newServerPort.setEnabled(setupNewServer.getSelection());
+				newServerDebugPort.setEnabled(setupNewServer.getSelection());
+				dialogChanged();
+			}
+		};
+		useExistingServer.addSelectionListener(radioListener);
+		setupNewServer.addSelectionListener(radioListener);
+	    useExistingServer.setSelection(true);
+	    setupNewServer.setSelection(false);
+	    
+	    ModifyListener ml = new ModifyListener() {
+			
+			@Override
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		};
+	    KeyListener kl = new KeyListener() {
+			
+			@Override
+			public void keyReleased(KeyEvent e) {
+				dialogChanged();
+			}
+			
+			@Override
+			public void keyPressed(KeyEvent e) {
+				dialogChanged();
+			}
+		};
+		newServerName.addModifyListener(ml);
+		newServerName.addKeyListener(kl);
+		newServerHostnameName.addModifyListener(ml);
+		newServerHostnameName.addKeyListener(kl);
+		newServerPort.addModifyListener(ml);
+		newServerPort.addKeyListener(kl);
+		newServerDebugPort.addModifyListener(ml);
+		newServerDebugPort.addKeyListener(kl);
+		
+		initialize();
+		setPageComplete(false);
+		setControl(container);
+	}
+
+	private void initialize() {
+		IServer[] servers = ServerCore.getServers();
+		for (int i = 0; i < servers.length; i++) {
+			IServer server = servers[i];
+			String key = keyFor(server);
+			serversMap.put(key, server);
+			existingServerCombo.add(key);
+		}
+	}
+
+	private String keyFor(IServer server) {
+		return server.getName();
+	}
+
+	private void dialogChanged() {
+		if (useExistingServer.getSelection()) {
+			if (existingServerCombo.getSelectionIndex()==-1) {
+				updateStatus("Choose existing server from the list");
+				return;
+			}
+		} else if (setupNewServer.getSelection()) {
+			if (newServerName.getText().length()==0 ||
+					newServerHostnameName.getText().length()==0 ||
+					newServerPort.getText().length()==0 ||
+					newServerDebugPort.getText().length()==0) {
+				updateStatus("Enter values for new server");
+				return;
+			}
+		}
+		updateStatus(null);
+	}
+
+	private void updateStatus(String message) {
+		setErrorMessage(message);
+		setPageComplete(message == null);
+	}
+	
+	IServer getOrCreateServer() {
+		if (useExistingServer.getSelection()) {
+			String key = existingServerCombo.getItem(existingServerCombo.getSelectionIndex());
+			return serversMap.get(key);
+		} else {
+			IServerType serverType = ServerCore.findServerType("org.apache.sling.ide.launchpadServer");
+			@SuppressWarnings("unused")
+			IRuntime existingRuntime = null;//ServerCore.findRuntime("org.apache.sling.ide.launchpadRuntimeType");
+			IRuntime[] existingRuntimes = ServerCore.getRuntimes();
+			for (int i = 0; i < existingRuntimes.length; i++) {
+				IRuntime aRuntime = existingRuntimes[i];
+				if (aRuntime.getRuntimeType().getId().equals("org.apache.sling.ide.launchpadRuntimeType")) {
+					existingRuntime = aRuntime;
+				}
+			}
+			IRuntimeType serverRuntime = ServerCore.findRuntimeType("org.apache.sling.ide.launchpadRuntimeType");
+			try {
+				IRuntime runtime = serverRuntime.createRuntime(null, new NullProgressMonitor());
+				runtime = runtime.createWorkingCopy().save(true, new NullProgressMonitor());
+				IServerWorkingCopy wc = serverType.createServer(null, null, runtime, new NullProgressMonitor());
+				wc.setHost(newServerHostnameName.getText());
+				wc.setName(newServerName.getText() + " (external)");
+				wc.setAttribute(ISlingLaunchpadServer.PROP_PORT, Integer.parseInt(newServerPort.getText()));
+				wc.setAttribute(ISlingLaunchpadServer.PROP_DEBUG_PORT, Integer.parseInt(newServerDebugPort.getText()));
+				wc.setAttribute("auto-publish-setting", 2); // 2: automatically publish when resources change
+				wc.setAttribute("auto-publish-time", 0);    // 0: zero delay after a resource change (and the builder was kicked, I guess)
+				wc.setRuntime(runtime);
+				return wc.save(true, new NullProgressMonitor());
+			} catch (CoreException e) {
+				// TODO proper logging
+				e.printStackTrace();
+			}
+			return null;
+		}
+	}
+
+}
\ No newline at end of file

Propchange: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain