Author: fbricon
Date: 2011-11-28 10:04:18 -0500 (Mon, 28 Nov 2011)
New Revision: 36698
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/Messages.java
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/messages.properties
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardFirstPage.java
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MavenArtifactHelper.java
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MissingRepositoryWarningComponent.java
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/xpl/
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/xpl/MavenProjectWizardArchetypeParametersPage.java
Modified:
trunk/central/plugins/org.jboss.tools.central/src/org/jboss/tools/central/JBossCentralActivator.java
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Category.java
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Project.java
trunk/maven/plugins/org.jboss.tools.maven.project.examples/META-INF/MANIFEST.MF
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizard.java
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardPage.java
Log:
JBIDE-9776 : New UI for Maven Archetype Wizard
Modified:
trunk/central/plugins/org.jboss.tools.central/src/org/jboss/tools/central/JBossCentralActivator.java
===================================================================
---
trunk/central/plugins/org.jboss.tools.central/src/org/jboss/tools/central/JBossCentralActivator.java 2011-11-28
13:49:05 UTC (rev 36697)
+++
trunk/central/plugins/org.jboss.tools.central/src/org/jboss/tools/central/JBossCentralActivator.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -484,15 +484,15 @@
try {
shell = new Shell(PlatformUI.getWorkbench().getDisplay());
new Browser(shell, SWT.NONE);
- isInternalWebBrowserAvailable = new Boolean(true);
+ isInternalWebBrowserAvailable = Boolean.TRUE.booleanValue();
return true;
} catch (Throwable t) {
try {
new Browser(shell, SWT.WEBKIT);
- isInternalWebBrowserAvailable = new Boolean(true);
+ isInternalWebBrowserAvailable = Boolean.TRUE.booleanValue();
return true;
} catch (Throwable e) {
- isInternalWebBrowserAvailable = new Boolean(false);
+ isInternalWebBrowserAvailable = Boolean.FALSE.booleanValue();
return false;
}
} finally {
Modified:
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Category.java
===================================================================
---
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Category.java 2011-11-28
13:49:05 UTC (rev 36697)
+++
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Category.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -95,4 +95,8 @@
return true;
}
+ @Override
+ public String toString() {
+ return getName();
+ }
}
Modified:
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Project.java
===================================================================
---
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Project.java 2011-11-28
13:49:05 UTC (rev 36697)
+++
trunk/examples/plugins/org.jboss.tools.project.examples/src/org/jboss/tools/project/examples/model/Project.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -261,4 +261,8 @@
this.defaultProfiles = defaultProfiles;
}
+ @Override
+ public String toString() {
+ return getName();
+ }
}
Modified: trunk/maven/plugins/org.jboss.tools.maven.project.examples/META-INF/MANIFEST.MF
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/META-INF/MANIFEST.MF 2011-11-28
13:49:05 UTC (rev 36697)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/META-INF/MANIFEST.MF 2011-11-28
15:04:18 UTC (rev 36698)
@@ -11,7 +11,11 @@
org.jboss.tools.project.examples,
org.eclipse.ui.ide,
org.eclipse.m2e.archetype.common;bundle-version="[1.0,1.2)",
- org.eclipse.m2e.core.ui;bundle-version="[1.0,1.2)"
+ org.eclipse.m2e.core.ui;bundle-version="[1.0,1.2)",
+ org.eclipse.wst.web.ui;bundle-version="1.1.400",
+ org.eclipse.ui.forms,
+ org.jboss.ide.eclipse.as.core;bundle-version="2.3.0",
+ org.eclipse.wst.server.core
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Vendor: %Bundle-Vendor
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/Messages.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/Messages.java
(rev 0)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/Messages.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -0,0 +1,22 @@
+package org.jboss.tools.maven.project.examples;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME =
"org.jboss.tools.maven.project.examples.messages"; //$NON-NLS-1$
+ public static String ArchetypeExamplesWizardFirstPage_Existing_Project;
+ public static String ArchetypeExamplesWizardFirstPage_No_TargetRuntime;
+ public static String ArchetypeExamplesWizardFirstPage_Package_Label;
+ public static String ArchetypeExamplesWizardFirstPage_ProjectName_Cant_Be_Empty;
+ public static String ArchetypeExamplesWizardFirstPage_ProjectName_Label;
+ public static String ArchetypeExamplesWizardFirstPage_Target_Runtime_Label;
+ public static String ArchetypeExamplesWizardFirstPage_Title;
+ public static String ArchetypeExamplesWizardFirstPage_Unresolved_Enterprise_Repo;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/messages.properties
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/messages.properties
(rev 0)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/messages.properties 2011-11-28
15:04:18 UTC (rev 36698)
@@ -0,0 +1,8 @@
+ArchetypeExamplesWizardFirstPage_Existing_Project=Project already exists
+ArchetypeExamplesWizardFirstPage_No_TargetRuntime=<none>
+ArchetypeExamplesWizardFirstPage_Package_Label=Package
+ArchetypeExamplesWizardFirstPage_ProjectName_Cant_Be_Empty=The project name can not be
empty
+ArchetypeExamplesWizardFirstPage_ProjectName_Label=Project name
+ArchetypeExamplesWizardFirstPage_Target_Runtime_Label=Target Runtime
+ArchetypeExamplesWizardFirstPage_Title=Create a new Java EE project
+ArchetypeExamplesWizardFirstPage_Unresolved_Enterprise_Repo=Artifacts needed from JBoss
Enterprise Maven repository do not seem to be available.\nThis might cause build problems.
Follow this <a
href=\"http://community.jboss.org/wiki/SettingUpTheJBossEnterpriseRe...
for more details.
Modified:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizard.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizard.java 2011-11-28
13:49:05 UTC (rev 36697)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizard.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -12,26 +12,40 @@
import java.io.File;
import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
import org.apache.maven.archetype.catalog.Archetype;
import org.apache.maven.model.Model;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;
import org.eclipse.m2e.core.ui.internal.MavenImages;
+import org.eclipse.m2e.core.ui.internal.Messages;
+import org.eclipse.m2e.core.ui.internal.actions.SelectionUtil;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkingSet;
import org.jboss.tools.maven.project.examples.MavenProjectExamplesActivator;
import org.jboss.tools.project.examples.ProjectExamplesActivator;
import org.jboss.tools.project.examples.model.Project;
@@ -44,23 +58,30 @@
public class ArchetypeExamplesWizard extends Wizard implements INewWizard {
private Project projectDescription;
- private File location;
+ //private File location;
private ProjectImportConfiguration configuration;
+ private ArchetypeExamplesWizardFirstPage simplePage;
private ArchetypeExamplesWizardPage wizardPage;
+ protected List<IWorkingSet> workingSets = new ArrayList<IWorkingSet>();
private String projectName;
private String artifactId;
+
public ArchetypeExamplesWizard(File location, Project projectDescription) {
super();
- setWindowTitle("Project Examples Archetype");
+ setWindowTitle("New JBoss project");
setDefaultPageImageDescriptor(MavenImages.WIZ_NEW_PROJECT);
setNeedsProgressMonitor(true);
- this.location = location;
+ //this.location = location;
this.projectDescription = projectDescription;
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
+ IWorkingSet workingSet = SelectionUtil.getSelectedWorkingSet(selection);
+ if(workingSet != null) {
+ this.workingSets.add(workingSet);
+ }
}
@Override
@@ -74,12 +95,24 @@
final Archetype archetype = wizardPage.getArchetype();
projectName = configuration.getProjectName(model);
final IProject project =
ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+ final IPath location = simplePage.getLocationPath();
+
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+
+ boolean pomExists =
location.append(projectName).append(IMavenConstants.POM_FILE_NAME).toFile().exists();
+ if ( pomExists ) {
+ MessageDialog.openError(getShell(), NLS.bind(Messages.wizardProjectJobFailed,
projectName), Messages.wizardProjectErrorPomAlreadyExists);
+ return false;
+ }
+
final IWorkspaceRunnable wr = new IWorkspaceRunnable() {
+
public void run(final IProgressMonitor monitor)
throws CoreException {
+
MavenPlugin.getProjectConfigurationManager().createArchetypeProject(
- project, new Path(location.getAbsolutePath()), archetype,
+ project, location, archetype,
groupId, artifactId, version, javaPackage, properties,
configuration, monitor);
}
@@ -92,7 +125,6 @@
final IWorkspace ws = ResourcesPlugin.getWorkspace();
ws.run(wr, ws.getRoot(), IWorkspace.AVOID_UPDATE, monitor);
} catch (CoreException e) {
- MavenProjectExamplesActivator.log(e);
throw new InvocationTargetException(e);
}
}
@@ -106,7 +138,12 @@
} catch (InvocationTargetException e) {
ProjectExamplesActivator.log(e);
Throwable ex = e.getTargetException();
- MessageDialog.openError(getShell(), "Error", ex.getMessage());
+ String message = ex.getMessage();
+ Throwable rootCause = getRootCause(ex);
+ if (rootCause != null) {
+ message += "\nRoot cause : " + rootCause.getMessage();
+ }
+ MessageDialog.openError(getShell(), "Error", message);
return true;
}
@@ -114,17 +151,58 @@
}
-
+ private Throwable getRootCause(Throwable ex) {
+ if (ex == null) return null;
+ Throwable rootCause = getRootCause(ex.getCause());
+ if (rootCause == null) {
+ rootCause = ex;
+ }
+ return rootCause;
+ }
+
public void addPages() {
configuration = new ProjectImportConfiguration();
String profiles = projectDescription.getDefaultProfiles();
if (profiles != null && profiles.trim().length() > 0) {
configuration.getResolverConfiguration().setActiveProfiles(profiles);
}
+ simplePage = new ArchetypeExamplesWizardFirstPage(configuration, projectDescription,
workingSets);
+ addPage(simplePage);
wizardPage = new ArchetypeExamplesWizardPage(configuration, projectDescription);
+ wizardPage.setPageComplete(true);//We want to enable the finish button early
addPage(wizardPage);
+
+ simplePage.setProjectNameModifyListener(new ModifyListener() {
+
+ @Override
+ public void modifyText(ModifyEvent e) {
+ wizardPage.setArtifactId(simplePage.getProjectName());
+ }
+ });
+
+ simplePage.setPackageNameModifyListener(new ModifyListener() {
+
+ @Override
+ public void modifyText(ModifyEvent e) {
+ String packageName = ((Combo)e.getSource()).getText();
+ wizardPage.setPackageName(packageName);
+ }
+ });
+
+
+ simplePage.setPropertyModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ wizardPage.updateArchetypeProperty("enterprise",
Boolean.toString(simplePage.isEnterpriseTargetRuntime()));
+ }
+ });
+
}
-
+ @Override
+ public boolean canFinish() {
+ // TODO Auto-generated method stub
+ return super.canFinish();
+ }
public String getProjectName() {
return projectName;
}
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardFirstPage.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardFirstPage.java
(rev 0)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardFirstPage.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -0,0 +1,329 @@
+/*************************************************************************************
+ * Copyright (c) 2008-2011 Red Hat, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ *
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * JBoss by Red Hat - Initial implementation.
+ ************************************************************************************/
+package org.jboss.tools.maven.project.examples.wizard;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.m2e.core.project.ProjectImportConfiguration;
+import org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizardLocationPage;
+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.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.internal.facets.FacetUtil;
+import org.jboss.ide.eclipse.as.core.util.RuntimeUtils;
+import org.jboss.tools.maven.project.examples.Messages;
+import org.jboss.tools.project.examples.model.Project;
+
+/**
+ * Simplified UI for the Maven Archetype Wizard, based off the original m2e
MavenProjectWizardLocationPage.
+ *
+ * @author Fred Bricon
+ *
+ */
+public class ArchetypeExamplesWizardFirstPage extends MavenProjectWizardLocationPage {
+
+ private Label projectNameLabel;
+ private Combo projectNameCombo;
+ private Label packageLabel;
+ private Combo packageCombo;
+ private Combo serverTargetCombo;
+ private Map<String, IRuntime> serverRuntimes;
+ private Composite warningLink;
+ private boolean initialized;
+ private Boolean isEnterpriseRepoAvailable;
+ private ModifyListener projectNameModifyListener;
+ private ModifyListener packageNameModifyListener;
+ private ModifyListener propertyModifyListener;
+
+ public ArchetypeExamplesWizardFirstPage(
+ ProjectImportConfiguration configuration,
+ Project projectDescription, List<IWorkingSet> workingSet) {
+ super(configuration,
projectDescription.getShortDescription(),Messages.ArchetypeExamplesWizardFirstPage_Title,
workingSet);
+ setPageComplete(false);
+ }
+
+ @Override
+ protected void createAdditionalControls(Composite container) {
+
+ GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1);
+ projectNameLabel = new Label(container, SWT.NONE);
+ projectNameLabel.setText(Messages.ArchetypeExamplesWizardFirstPage_ProjectName_Label);
+ projectNameCombo = new Combo(container, SWT.BORDER);
+ projectNameCombo.setLayoutData(gridData);
+ projectNameCombo.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validate();
+ }
+ });
+ if (projectNameModifyListener != null) {
+ projectNameCombo.addModifyListener(projectNameModifyListener);
+ }
+
+ packageLabel = new Label(container, SWT.NONE);
+ packageLabel.setText(Messages.ArchetypeExamplesWizardFirstPage_Package_Label);
+ packageCombo = new Combo(container, SWT.BORDER);
+ packageCombo.setLayoutData(gridData);
+ packageCombo.setData("name", "packageCombo"); //$NON-NLS-1$
//$NON-NLS-2$
+ addFieldWithHistory("packageCombo", packageCombo);//$NON-NLS-1$
+ packageCombo.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validate();
+ }
+ });
+ if (packageNameModifyListener != null) {
+ packageCombo.addModifyListener(packageNameModifyListener);
+ }
+
+ //TODO read facet version from project example metadata
+ IProjectFacetVersion facetVersion;
+ try {
+ facetVersion = ProjectFacetsManager.getProjectFacet(
+ IJ2EEFacetConstants.DYNAMIC_WEB).getLatestVersion();
+ createServerTargetComposite(container, facetVersion);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ if (propertyModifyListener != null) {
+ serverTargetCombo.addModifyListener(propertyModifyListener);
+ }
+
+
+ Label emptyLabel = new Label(container, SWT.NONE);
+ emptyLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,
+ 3, 1));
+
+ }
+
+ @Override
+ protected void createAdvancedSettings(Composite composite, GridData gridData) {
+ createMissingRepositoriesWarning(composite, gridData);
+ }
+
+ protected void createServerTargetComposite(Composite parent,
+ IProjectFacetVersion facetVersion) {
+ Label serverTargetLabel = new Label(parent, SWT.NONE);
+ serverTargetLabel.setText(Messages.ArchetypeExamplesWizardFirstPage_Target_Runtime_Label);
+
+ GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1);
+ serverTargetCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+ serverTargetCombo.setLayoutData(gridData);
+ serverRuntimes = getServerRuntimes(facetVersion);
+ for (String runtimeName : serverRuntimes.keySet()) {
+ serverTargetCombo.add(runtimeName);
+ }
+ serverTargetCombo.add(Messages.ArchetypeExamplesWizardFirstPage_No_TargetRuntime);
+ serverTargetCombo.select(0);
+ serverTargetCombo.addModifyListener(new ModifyListener() {
+
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validateEnterpriseRepo();
+ }
+ });
+ }
+
+ protected void validate() {
+ if (!initialized) {
+ return;
+ }
+ //Need to be called first, or error message would be overwritten
+ super.validate();
+
+ String errorMessage = validateInputs();
+ setErrorMessage(errorMessage);
+ setMessage(null);
+ setPageComplete(errorMessage == null);
+
+ validateEnterpriseRepo();
+ }
+
+ private String validateInputs() {
+
+ final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+
+ final String name = getProjectName();
+
+ // check whether the project name field is empty
+ if(name.trim().length() == 0) {
+ return Messages.ArchetypeExamplesWizardFirstPage_ProjectName_Cant_Be_Empty;
+ }
+
+ // check whether the project name is valid
+ final IStatus nameStatus = workspace.validateName(name, IResource.PROJECT);
+ if(!nameStatus.isOK()) {
+ return nameStatus.getMessage();
+ }
+
+ // check whether project already exists
+ final IProject handle = workspace.getRoot().getProject(name);
+ if(handle.exists()) {
+ return Messages.ArchetypeExamplesWizardFirstPage_Existing_Project;
+ }
+
+ //check if the package is valid
+ String packageName = packageCombo.getText();
+ if(packageName.trim().length() != 0) {
+
if(!Pattern.matches("[A-Za-z_$][A-Za-z_$\\d]*(?:\\.[A-Za-z_$][A-Za-z_$\\d]*)*",
packageName)) { //$NON-NLS-1$
+ return "";
+ }
+ }
+
+ return null;
+ }
+
+ public String getProjectName() {
+ return (projectNameCombo == null) ? null : projectNameCombo.getText();
+ }
+
+ protected void validateEnterpriseRepo() {
+ boolean isWarningLinkVisible = (isEnterpriseTargetRuntime() &&
!assertEnterpriseRepoAccessible());
+ warningLink.setVisible(isWarningLinkVisible);
+ }
+
+
+ public boolean isEnterpriseTargetRuntime() {
+ if (serverTargetCombo == null)
+ return false;
+ String serverId = serverTargetCombo.getText();
+ IRuntime runtime = serverRuntimes.get(serverId);
+ return (runtime != null && RuntimeUtils.isEAP(runtime));
+ }
+
+
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+
+ if (visible) {
+ initialized = true;
+ // validate();
+ }
+ }
+
+ private void createMissingRepositoriesWarning(Composite parent,
+ GridData gridData) {
+ //TODO make that damn component align correctly
+ //warningLink = new MissingRepositoryWarningComponent(parent);
+
+ //TODO delete that code
+ warningLink = new Composite(parent, SWT.NONE);
+
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).span(3, 1)
+ .applyTo(warningLink);
+ GridLayoutFactory.fillDefaults().numColumns(2).applyTo(warningLink);
+
+ Label warningImg = new Label(warningLink, SWT.CENTER | SWT.TOP);
+ warningImg.setImage(JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
+
+ Link link = new Link(warningLink, SWT.NONE);
+ link.setText(Messages.ArchetypeExamplesWizardFirstPage_Unresolved_Enterprise_Repo);
+ link.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ // Open default external browser
+ PlatformUI.getWorkbench().getBrowserSupport()
+ .getExternalBrowser().openURL(new URL(e.text));
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ });
+
+ warningLink.setVisible(false);
+ }
+
+
+
+ private boolean assertEnterpriseRepoAccessible() {
+ if (isEnterpriseRepoAvailable != null) {
+ return isEnterpriseRepoAvailable.booleanValue();
+ }
+
+ isEnterpriseRepoAvailable = MavenArtifactHelper.isEnterpriseRepositoryAvailable();
+ return isEnterpriseRepoAvailable.booleanValue();
+ }
+
+ protected Map<String, IRuntime> getServerRuntimes(
+ IProjectFacetVersion facetVersion) {
+ Set<org.eclipse.wst.common.project.facet.core.runtime.IRuntime> runtimesSet;
+ if (facetVersion == null) {
+ runtimesSet =RuntimeManager.getRuntimes();
+ } else {
+ runtimesSet = RuntimeManager.getRuntimes(Collections.singleton(facetVersion));
+ }
+
+ Map<String, IRuntime> runtimesMap = new LinkedHashMap<String, IRuntime>();
+ for (org.eclipse.wst.common.project.facet.core.runtime.IRuntime r : runtimesSet) {
+ IRuntime serverRuntime = FacetUtil.getRuntime(r);
+ if (serverRuntime != null) {
+ runtimesMap.put(r.getLocalizedName(), serverRuntime);
+ }
+ }
+ return runtimesMap;
+ }
+
+ public ModifyListener getProjectNameModifyListener() {
+ return projectNameModifyListener;
+ }
+
+ public void setProjectNameModifyListener(ModifyListener projectNameModifyListener) {
+ this.projectNameModifyListener = projectNameModifyListener;
+ }
+
+ public ModifyListener getPackageNameModifyListener() {
+ return packageNameModifyListener;
+ }
+
+ public void setPackageNameModifyListener(ModifyListener packageNameModifyListener) {
+ this.packageNameModifyListener = packageNameModifyListener;
+ }
+
+ public ModifyListener getPropertyModifyListener() {
+ return propertyModifyListener;
+ }
+
+ public void setPropertyModifyListener(ModifyListener propertyModifyListener) {
+ this.propertyModifyListener = propertyModifyListener;
+ }
+
+}
Modified:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardPage.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardPage.java 2011-11-28
13:49:05 UTC (rev 36697)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/ArchetypeExamplesWizardPage.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -11,6 +11,7 @@
package org.jboss.tools.maven.project.examples.wizard;
import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@@ -27,21 +28,28 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.IMaven;
-import org.eclipse.m2e.core.embedder.IMavenConfiguration;
-import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
-import org.eclipse.m2e.core.internal.Messages;
-import org.eclipse.m2e.core.internal.archetype.ArchetypeManager;
-import
org.eclipse.m2e.core.internal.archetype.ArchetypeCatalogFactory.RemoteCatalogFactory;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;
-import
org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizardArchetypeParametersPage;
import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.PlatformUI;
import org.jboss.tools.maven.project.examples.MavenProjectExamplesActivator;
+import
org.jboss.tools.maven.project.examples.wizard.xpl.MavenProjectWizardArchetypeParametersPage;
import org.jboss.tools.project.examples.model.ArchetypeModel;
import org.jboss.tools.project.examples.model.Project;
@@ -54,16 +62,18 @@
MavenProjectWizardArchetypeParametersPage {
private Project projectDescription;
+ private Composite warningLink;
+ private Boolean isEnterpriseRepoAvailable;
public ArchetypeExamplesWizardPage(
ProjectImportConfiguration configuration, Project projectDescription) {
super(configuration);
+ setTitle(projectDescription.getShortDescription());
this.projectDescription = projectDescription;
}
@Override
public void createControl(Composite parent) {
- long start = System.currentTimeMillis();
super.createControl(parent);
Archetype archetype = new Archetype();
ArchetypeModel archetypeModel = projectDescription.getArchetypeModel();
@@ -101,12 +111,11 @@
// It needs to be called AFTER setArchetype(archetype) !!!
archetypeChanged = false;
- //Use archetype/example name by default
- artifactIdCombo.setText(artifactId);
-
//Check if project already exists
IStatus nameStatus = getImportConfiguration().validateProjectName(getModel());
- if(!nameStatus.isOK()) {
+ if(nameStatus.isOK()) {
+ artifactIdCombo.setText(artifactId);
+ } else {
//Force the user to change the name if the project exists
artifactIdCombo.setText("");//$NON-NLS-1$
}
@@ -114,11 +123,56 @@
groupIdCombo.setText(groupId);
versionCombo.setText(version);
packageCombo.setText(javaPackage);
+ }
+
+ @Override
+ protected void createAdvancedSettings(Composite composite, GridData gridData) {
+ // TODO Auto-generated method stub
+ super.createAdvancedSettings(composite, gridData);
+ createMissingRepositoriesWarning(composite, gridData);
+ }
+
+ private void createMissingRepositoriesWarning(Composite parent,
+ GridData gridData) {
+ //TODO make that damn component align correctly
+ //warningLink = new MissingRepositoryWarningComponent(parent);
- long stop = System.currentTimeMillis();
- System.err.println("Create controls took " + (stop-start) + "
ms");
+ //TODO delete that code
+ warningLink = new Composite(parent, SWT.NONE);
+
+// Display display = Display.getCurrent();
+// Color color = display.getSystemColor(SWT.COLOR_BLUE);
+// warningLink.setBackground(color);
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).span(3, 1)
+ .applyTo(warningLink);
+ GridLayoutFactory.fillDefaults().numColumns(2).applyTo(warningLink);
+
+ Label warningImg = new Label(warningLink, SWT.CENTER | SWT.TOP);
+ warningImg.setImage(JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
+
+ Link link = new Link(warningLink, SWT.NONE);
+ String message = "Artifacts needed from JBoss Enterprise Maven repository do not
seem to be available.\nThis might cause build problems. "
+ + "Follow this <a
href=\"http://community.jboss.org/wiki/SettingUpTheJBossEnterpriseRe...
for more details.";
+ link.setText(message);
+ link.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ // Open default external browser
+ PlatformUI.getWorkbench().getBrowserSupport()
+ .getExternalBrowser().openURL(new URL(e.text));
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ });
+ //link.setBackground(display.getSystemColor(SWT.COLOR_RED));
+
+ warningLink.setVisible(false);
}
+
+
public Archetype getArchetype() {
return archetype;
}
@@ -164,12 +218,10 @@
}
} catch(UnknownArchetype e) {
MavenProjectExamplesActivator.log(e);
- e.printStackTrace();
//TODO don't swallow exceptions
} catch(CoreException ex) {
//TODO don't swallow exceptions
MavenProjectExamplesActivator.log(ex);
- ex.printStackTrace();
} finally {
monitor.done();
}
@@ -196,7 +248,6 @@
private Artifact downloadArchetype(String groupId, String artifactId,
String version, ArtifactRepository archetypeRepository,
List<ArtifactRepository> repositories) throws CoreException {
- //long start = System.currentTimeMillis();
IMaven maven = MavenPlugin.getMaven();
ArrayList<ArtifactRepository> repos = new
ArrayList<ArtifactRepository>();
if (archetypeRepository != null) {
@@ -206,9 +257,73 @@
IProgressMonitor nullProgressMonitor = new NullProgressMonitor();
maven.resolve(groupId, artifactId, version, "pom", null, repos,
nullProgressMonitor); //$NON-NLS-1$
Artifact a = maven.resolve(groupId, artifactId, version, "jar", null,
repos, nullProgressMonitor); //$NON-NLS-1$
- //long stop = System.currentTimeMillis();
- //System.err.println("download took " + (stop-start) + " ms");
return a;
}
+
+ public void updateArchetypeProperty(String key, String value){
+ if (propertiesTable == null) return;
+
+ for(int i = 0; i < propertiesTable.getItemCount(); i++ ) {
+ TableItem item = propertiesTable.getItem(i);
+ if (item.getText(KEY_INDEX).equals(key) &&
!item.getText(VALUE_INDEX).equals(value)) {
+ item.setText(VALUE_INDEX, value);
+ //don't break, just to be sure
+ }
+ }
+ }
+
+ public void setArtifactId(String projectName) {
+ if (artifactIdCombo != null) {
+ artifactIdCombo.setText(projectName);
+ }
+ }
+
+ public void setPackageName(String packageName) {
+ if (packageCombo != null) {
+ if (!packageCombo.getText().equals(packageName)){
+ packageCombo.setText(packageName);
+ }
+ if (groupIdCombo.getText().equals(packageName)){
+ groupIdCombo.setText(packageName);
+ }
+ }
+ }
+
+ @Override
+ protected void validate() {
+ checkEnterpriseProperty();
+ super.validate();
+ }
+
+ private void checkEnterpriseProperty() {
+ if (warningLink == null) {
+ //Not initialized yet
+ return;
+ }
+ // TODO Auto-generated method stub
+ for(int i = 0; i < propertiesTable.getItemCount(); i++ ) {
+ TableItem item = propertiesTable.getItem(i);
+ String value = item.getText(VALUE_INDEX);
+ if (item.getText(KEY_INDEX).equals("enterprise")
+ && (Boolean.TRUE.toString().equalsIgnoreCase(value)
+ || "y".equalsIgnoreCase(value)
+ || "yes".equalsIgnoreCase(value))
+ && !assertEnterpriseRepoAccessible()) {
+ warningLink.setVisible(true);
+ return;
+ }
+ }
+ warningLink.setVisible(false);
+ }
+
+ private boolean assertEnterpriseRepoAccessible() {
+ if (isEnterpriseRepoAvailable != null) {
+ return isEnterpriseRepoAvailable.booleanValue();
+ }
+
+ isEnterpriseRepoAvailable = MavenArtifactHelper.isEnterpriseRepositoryAvailable();
+ return isEnterpriseRepoAvailable.booleanValue();
+ }
+
}
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MavenArtifactHelper.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MavenArtifactHelper.java
(rev 0)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MavenArtifactHelper.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -0,0 +1,60 @@
+/*************************************************************************************
+ * Copyright (c) 2008-2011 Red Hat, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ *
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * JBoss by Red Hat - Initial implementation.
+ ************************************************************************************/
+package org.jboss.tools.maven.project.examples.wizard;
+
+import java.util.ArrayList;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.embedder.ArtifactKey;
+import org.eclipse.m2e.core.embedder.IMaven;
+
+public class MavenArtifactHelper {
+
+ /**
+ * Checks if the EAP repository is available
+ *
+ * @return true if org.jboss.spec:jboss-javaee-web-6.0:3.0.0.Beta1-redhat-1 can be
resolved
+ */
+ public static boolean isEnterpriseRepositoryAvailable() {
+ String keyString =
"org.jboss.spec:jboss-javaee-web-6.0:4.0.0.Beta1-redhat-1::"; //$NON-NLS-1$
+ boolean isRepoAvailable = isArtifactAvailable(keyString, "pom");
+ return isRepoAvailable;
+ }
+
+ /**
+ * Checks is an artifact can be resolved
+ * @param artifactKey
+ * @return true is the artifactKey can be resolved to an artifact.
+ */
+ public static boolean isArtifactAvailable(String artifactKey, String type) {
+ boolean isRepoAvailable = false;
+ try {
+ IMaven maven = MavenPlugin.getMaven();
+ ArrayList<ArtifactRepository> repos = new
ArrayList<ArtifactRepository>();
+ repos.addAll(maven.getArtifactRepositories());
+ IProgressMonitor nullProgressMonitor = new NullProgressMonitor();
+ ArtifactKey key = ArtifactKey.fromPortableString(artifactKey);
+ Artifact a = MavenPlugin.getMaven().resolve(
+ key.getGroupId(), key.getArtifactId(), key.getVersion(),
+ type, key.getClassifier(), repos, nullProgressMonitor); //$NON-NLS-1$
+ isRepoAvailable = a != null && a.isResolved();
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return isRepoAvailable;
+ }
+
+}
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MissingRepositoryWarningComponent.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MissingRepositoryWarningComponent.java
(rev 0)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/MissingRepositoryWarningComponent.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -0,0 +1,80 @@
+/*************************************************************************************
+ * Copyright (c) 2008-2011 Red Hat, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ *
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * JBoss by Red Hat - Initial implementation.
+ ************************************************************************************/
+package org.jboss.tools.maven.project.examples.wizard;
+
+import java.net.URL;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.PlatformUI;
+
+public class MissingRepositoryWarningComponent extends Composite {
+
+ private Composite warningLink;
+
+ public MissingRepositoryWarningComponent(Composite parent) {
+ super(parent, SWT.NORMAL);
+
+ warningLink = new Composite(parent, SWT.NONE);
+
+ Display display = Display.getCurrent();
+ Color color = display.getSystemColor(SWT.COLOR_BLUE);
+
+ warningLink.setBackground(color);
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).span(3, 1)
+ .applyTo(warningLink);
+ GridLayoutFactory.fillDefaults().numColumns(2).applyTo(warningLink);
+
+ Label warningImg = new Label(warningLink, SWT.CENTER | SWT.TOP);
+ warningImg.setImage(JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
+
+ Link link = new Link(warningLink, SWT.NONE);
+ String message = "Artifacts needed from JBoss Enterprise Maven repository do not
seem to be available.\nThis might cause build problems. "
+ + "Follow this <a
href=\"http://community.jboss.org/wiki/SettingUpTheJBossEnterpriseRe...
for more details.";
+ link.setText(message);
+ link.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ // Open default external browser
+ PlatformUI.getWorkbench().getBrowserSupport()
+ .getExternalBrowser().openURL(new URL(e.text));
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ });
+ link.setBackground(display.getSystemColor(SWT.COLOR_RED));
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ warningLink.setVisible(visible);
+ super.setVisible(visible);
+ }
+
+ @Override
+ public void dispose() {
+ warningLink.dispose();
+ super.dispose();
+ }
+
+}
Added:
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/xpl/MavenProjectWizardArchetypeParametersPage.java
===================================================================
---
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/xpl/MavenProjectWizardArchetypeParametersPage.java
(rev 0)
+++
trunk/maven/plugins/org.jboss.tools.maven.project.examples/src/org/jboss/tools/maven/project/examples/wizard/xpl/MavenProjectWizardArchetypeParametersPage.java 2011-11-28
15:04:18 UTC (rev 36698)
@@ -0,0 +1,588 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2010 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ *
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.jboss.tools.maven.project.examples.wizard.xpl;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.apache.maven.archetype.catalog.Archetype;
+import org.apache.maven.archetype.common.ArchetypeArtifactManager;
+import org.apache.maven.archetype.exception.UnknownArchetype;
+import org.apache.maven.archetype.metadata.ArchetypeDescriptor;
+import org.apache.maven.archetype.metadata.RequiredProperty;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.Model;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.embedder.IMaven;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
+import org.eclipse.m2e.core.project.ProjectImportConfiguration;
+import org.eclipse.m2e.core.ui.internal.Messages;
+import org.eclipse.m2e.core.ui.internal.components.TextComboBoxCellEditor;
+import org.eclipse.m2e.core.ui.internal.wizards.AbstractMavenWizardPage;
+import org.eclipse.osgi.util.NLS;
+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.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.jboss.tools.maven.project.examples.MavenProjectExamplesActivator;
+
+
+/**
+ * Wizard page responsible for gathering information about the Maven2 artifact when an
archetype is being used to create
+ * a project (thus the class name pun).
+ *
+ * This is a copy of
org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizardArchetypeParametersPage
+ * as we need to access the Properties list. Changed :
+ * <ul>
+ * <li>Replaced slf4j loggers with MavenProjectExamplesActivator.log</li>
+ * <li>Changed visibility of propertiesTable and propertiesViewer to
protected</li>
+ * <li>Changed visibility of validate() to protected</li>
+ * </ul>
+ */
+public class MavenProjectWizardArchetypeParametersPage extends AbstractMavenWizardPage {
+
+ public static final String DEFAULT_VERSION = "0.0.1-SNAPSHOT"; //$NON-NLS-1$
+
+ public static final String DEFAULT_PACKAGE = "foo"; //$NON-NLS-1$
+
+ protected Table propertiesTable;
+
+ protected TableViewer propertiesViewer;
+
+ protected TableViewerColumn valueColumn;
+
+ final public static String KEY_PROPERTY = "key"; //$NON-NLS-1$
+
+ final public static int KEY_INDEX = 0;
+
+ final public static String VALUE_PROPERTY = "value"; //$NON-NLS-1$
+
+ final public static int VALUE_INDEX = 1;
+
+ /** group id text field */
+ protected Combo groupIdCombo;
+
+ /** artifact id text field */
+ protected Combo artifactIdCombo;
+
+ /** version text field */
+ protected Combo versionCombo;
+
+ /** package text field */
+ protected Combo packageCombo;
+
+ protected Button removeButton;
+
+ private boolean isUsed = true;
+
+ protected Set<String> requiredProperties;
+
+ protected Set<String> optionalProperties;
+
+ protected Archetype archetype;
+
+ protected boolean archetypeChanged = false;
+
+ /** shows if the package has been customized by the user */
+ protected boolean packageCustomized = false;
+
+ /** Creates a new page. */
+ public MavenProjectWizardArchetypeParametersPage(ProjectImportConfiguration
projectImportConfiguration) {
+ super("Maven2ProjectWizardArchifactPage", projectImportConfiguration);
//$NON-NLS-1$
+
+ setTitle(Messages.wizardProjectPageMaven2Title);
+ setDescription(Messages.wizardProjectPageMaven2ArchetypeParametersDescription);
+ setPageComplete(false);
+
+ requiredProperties = new HashSet<String>();
+ optionalProperties = new HashSet<String>();
+ }
+
+ /** Creates page controls. */
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(3, false));
+
+ createArtifactGroup(composite);
+ createPropertiesGroup(composite);
+
+ validate();
+
+ createAdvancedSettings(composite, new GridData(SWT.FILL, SWT.TOP, false, false, 3,
1));
+ resolverConfigurationComponent.setModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ validate();
+ }
+ });
+
+ setControl(composite);
+
+ }
+
+ private void createArtifactGroup(Composite parent) {
+// Composite artifactGroup = new Composite(parent, SWT.NONE);
+// GridData gd_artifactGroup = new GridData( SWT.FILL, SWT.FILL, true, false );
+// artifactGroup.setLayoutData(gd_artifactGroup);
+// artifactGroup.setLayout(new GridLayout(2, false));
+
+ Label groupIdlabel = new Label(parent, SWT.NONE);
+ groupIdlabel.setText(Messages.artifactComponentGroupId);
+
+ groupIdCombo = new Combo(parent, SWT.BORDER);
+ groupIdCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+ addFieldWithHistory("groupId", groupIdCombo); //$NON-NLS-1$
+ groupIdCombo.setData("name", "groupId"); //$NON-NLS-1$
//$NON-NLS-2$
+ groupIdCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateJavaPackage();
+ validate();
+ }
+ });
+
+ Label artifactIdLabel = new Label(parent, SWT.NONE);
+ artifactIdLabel.setText(Messages.artifactComponentArtifactId);
+
+ artifactIdCombo = new Combo(parent, SWT.BORDER);
+ artifactIdCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2,
1));
+ addFieldWithHistory("artifactId", artifactIdCombo); //$NON-NLS-1$
+ artifactIdCombo.setData("name", "artifactId"); //$NON-NLS-1$
//$NON-NLS-2$
+ artifactIdCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateJavaPackage();
+ validate();
+ }
+ });
+
+ Label versionLabel = new Label(parent, SWT.NONE);
+ versionLabel.setText(Messages.artifactComponentVersion);
+
+ versionCombo = new Combo(parent, SWT.BORDER);
+ GridData gd_versionCombo = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1);
+ gd_versionCombo.widthHint = 150;
+ versionCombo.setLayoutData(gd_versionCombo);
+ versionCombo.setText(DEFAULT_VERSION);
+ addFieldWithHistory("version", versionCombo); //$NON-NLS-1$
+ versionCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ validate();
+ }
+ });
+
+ Label packageLabel = new Label(parent, SWT.NONE);
+ packageLabel.setText(Messages.artifactComponentPackage);
+
+ packageCombo = new Combo(parent, SWT.BORDER);
+ packageCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
+ packageCombo.setData("name", "package"); //$NON-NLS-1$
//$NON-NLS-2$
+ addFieldWithHistory("package", packageCombo); //$NON-NLS-1$
+ packageCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ if(!packageCustomized &&
!packageCombo.getText().equals(getDefaultJavaPackage())) {
+ packageCustomized = true;
+ }
+ validate();
+ }
+ });
+ }
+
+ private void createPropertiesGroup(Composite composite) {
+ Label propertiesLabel = new Label(composite, SWT.NONE);
+ propertiesLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3,
1));
+
propertiesLabel.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_lblProps);
+
+ propertiesViewer = new TableViewer(composite, 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(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_columnName);
+
+ TableColumn propertiesTableValueColumn = new TableColumn(propertiesTable, SWT.NONE);
+ propertiesTableValueColumn.setWidth(230);
+
propertiesTableValueColumn.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_columnValue);
+
+ 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));
+ validate();
+ }
+ }
+
+ public Object getValue(Object element, String property) {
+ if(element instanceof TableItem) {
+ return ((TableItem) element).getText(getTextIndex(property));
+ }
+ return null;
+ }
+ });
+
+ Button addButton = new Button(composite, SWT.NONE);
+ addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+
addButton.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_btnAdd);
+ addButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ propertiesViewer.editElement(addTableItem("?", "?"),
KEY_INDEX); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+
+ removeButton = new Button(composite, SWT.NONE);
+ removeButton.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
+
removeButton.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_btnRemove);
+ removeButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if(propertiesTable.getSelectionCount() > 0) {
+ propertiesTable.remove(propertiesTable.getSelectionIndices());
+ removeButton.setEnabled(propertiesTable.getItemCount() > 0);
+ validate();
+ }
+ }
+ });
+ }
+
+ /**
+ * Validates the contents of this wizard page.
+ * <p>
+ * Feedback about the validation is given to the user by displaying error messages or
informative messages on the
+ * wizard page. Depending on the provided user input, the wizard page is marked as
being complete or not.
+ * <p>
+ * If some error or missing input is detected in the user input, an error message or
informative message,
+ * respectively, is displayed to the user. If the user input is complete and correct,
the wizard page is marked as
+ * begin complete to allow the wizard to proceed. To that end, the following conditions
must be met:
+ * <ul>
+ * <li>The user must have provided a valid group ID.</li>
+ * <li>The user must have provided a valid artifact ID.</li>
+ * <li>The user must have provided a version for the artifact.</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.jface.dialogs.DialogPage#setMessage(java.lang.String)
+ * @see org.eclipse.jface.wizard.WizardPage#setErrorMessage(java.lang.String)
+ * @see org.eclipse.jface.wizard.WizardPage#setPageComplete(boolean)
+ */
+ protected void validate() {
+ String error = validateInput();
+ setErrorMessage(error);
+ setPageComplete(error == null);
+ }
+
+ private String validateInput() {
+ String error = validateGroupIdInput(groupIdCombo.getText().trim());
+ if(error != null) {
+ return error;
+ }
+
+ error = validateArtifactIdInput(artifactIdCombo.getText().trim());
+ if(error != null) {
+ return error;
+ }
+
+ String versionValue = versionCombo.getText().trim();
+ if(versionValue.length() == 0) {
+ return Messages.wizardProjectPageMaven2ValidatorVersion;
+ }
+ //TODO: check validity of version?
+
+ String packageName = packageCombo.getText();
+ if(packageName.trim().length() != 0) {
+
if(!Pattern.matches("[A-Za-z_$][A-Za-z_$\\d]*(?:\\.[A-Za-z_$][A-Za-z_$\\d]*)*",
packageName)) { //$NON-NLS-1$
+ return
org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_error_package;
+ }
+ }
+
+ // validate project name
+ IStatus nameStatus = getImportConfiguration().validateProjectName(getModel());
+ if(!nameStatus.isOK()) {
+ return NLS.bind(Messages.wizardProjectPageMaven2ValidatorProjectNameInvalid,
nameStatus.getMessage());
+ }
+
+ if(requiredProperties.size() > 0) {
+ Properties properties = getProperties();
+ for(String key : requiredProperties) {
+ String value = properties.getProperty(key);
+ if(value == null || value.length() == 0) {
+ return NLS.bind(Messages.wizardProjectPageMaven2ValidatorRequiredProperty,
key);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /** Ends the wizard flow chain. */
+ public IWizardPage getNextPage() {
+ return null;
+ }
+
+ public void setArchetype(Archetype archetype) {
+ if(archetype == null) {
+ propertiesTable.removeAll();
+ archetypeChanged = false;
+ } else if(!archetype.equals(this.archetype)) {
+ this.archetype = archetype;
+ propertiesTable.removeAll();
+ requiredProperties.clear();
+ optionalProperties.clear();
+ archetypeChanged = true;
+
+ Properties properties = archetype.getProperties();
+ if(properties != null) {
+ for(Iterator<Map.Entry<Object, Object>> it =
properties.entrySet().iterator(); it.hasNext();) {
+ Map.Entry<?, ?> e = it.next();
+ String key = (String) e.getKey();
+ addTableItem(key, (String) e.getValue());
+ optionalProperties.add(key);
+ }
+ }
+ }
+ }
+
+ void loadArchetypeDescriptor() {
+ final String groupId = archetype.getGroupId();
+ final String artifactId = archetype.getArtifactId();
+ final String version = archetype.getVersion();
+ final String archetypeName = groupId + ":" + artifactId + ":" +
version; //$NON-NLS-1$ //$NON-NLS-2$
+
+ try {
+ getContainer().run(false, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) {
+
monitor.beginTask(NLS.bind(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_task,
archetypeName), IProgressMonitor.UNKNOWN);
+ try {
+ IMaven maven = MavenPlugin.getMaven();
+
+ ArtifactRepository localRepository = maven.getLocalRepository();
+
+ List<ArtifactRepository> repositories =
maven.getArtifactRepositories();
+
+ ArchetypeArtifactManager aaMgr =
MavenPluginActivator.getDefault().getArchetypeArtifactManager();
+ if(aaMgr.isFileSetArchetype(groupId, artifactId, version, null,
localRepository, repositories)) {
+ ArchetypeDescriptor descriptor =
aaMgr.getFileSetArchetypeDescriptor(groupId, artifactId, version, null,
+ localRepository, repositories);
+ List<?> properties = descriptor.getRequiredProperties();
+ if(properties != null) {
+ for(Object o : properties) {
+ if(o instanceof RequiredProperty) {
+ RequiredProperty rp = (RequiredProperty) o;
+ requiredProperties.add(rp.getKey());
+ addTableItem(rp.getKey(), rp.getDefaultValue());
+ }
+ }
+ }
+ }
+ } catch(UnknownArchetype e) {
+ MavenProjectExamplesActivator.log(e, NLS.bind("Error downloading
archetype {0}",archetypeName));
+ } catch(CoreException ex) {
+ MavenProjectExamplesActivator.log(ex, ex.getMessage());
+ } finally {
+ monitor.done();
+ }
+ }
+ });
+ } catch(InterruptedException ex) {
+ // ignore
+ } catch(InvocationTargetException ex) {
+ String msg =
NLS.bind(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_error_download,
archetypeName);
+ setErrorMessage(msg + "\n" + ex.toString()); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @param key
+ * @param value
+ */
+ TableItem addTableItem(String key, String value) {
+ TableItem item = new TableItem(propertiesTable, SWT.NONE);
+ item.setData(item);
+ item.setText(KEY_INDEX, key);
+ item.setText(VALUE_INDEX, value == null ? "" : value); //$NON-NLS-1$
+ return item;
+ }
+
+ /**
+ * Updates the properties when a project name is set on the first page of the wizard.
+ */
+ public void setProjectName(String projectName) {
+ if(artifactIdCombo.getText().equals(groupIdCombo.getText())) {
+ groupIdCombo.setText(projectName);
+ }
+ artifactIdCombo.setText(projectName);
+ packageCombo.setText("org." + projectName.replace('-',
'.')); //$NON-NLS-1$
+ validate();
+ }
+
+ /**
+ * Updates the properties when a project name is set on the first page of the wizard.
+ */
+ public void setParentProject(String groupId, String artifactId, String version) {
+ groupIdCombo.setText(groupId);
+ versionCombo.setText(version);
+ validate();
+ }
+
+ /** Enables or disables the artifact id text field. */
+ public void setArtifactIdEnabled(boolean b) {
+ artifactIdCombo.setEnabled(b);
+ }
+
+ /** Returns the package name. */
+ public String getJavaPackage() {
+ if(packageCombo.getText().length() > 0) {
+ return packageCombo.getText();
+ }
+ return getDefaultJavaPackage();
+ }
+
+ /** Updates the package name if the related fields changed. */
+ protected void updateJavaPackage() {
+ if(packageCustomized) {
+ return;
+ }
+
+ String defaultPackageName = getDefaultJavaPackage();
+ packageCombo.setText(defaultPackageName);
+ }
+
+ /** Returns the default package name. */
+ protected String getDefaultJavaPackage() {
+ return
MavenProjectWizardArchetypeParametersPage.getDefaultJavaPackage(groupIdCombo.getText().trim(),
+ artifactIdCombo.getText().trim());
+ }
+
+ /** Creates the Model object. */
+ public Model getModel() {
+ Model model = new Model();
+
+ model.setModelVersion("4.0.0"); //$NON-NLS-1$
+ model.setGroupId(groupIdCombo.getText());
+ model.setArtifactId(artifactIdCombo.getText());
+ model.setVersion(versionCombo.getText());
+
+ return model;
+ }
+
+ public void setUsed(boolean isUsed) {
+ this.isUsed = isUsed;
+ }
+
+ public boolean isPageComplete() {
+ return !isUsed || super.isPageComplete();
+ }
+
+ /** Loads the group value when the page is displayed. */
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+
+ if(visible) {
+ if(groupIdCombo.getText().length() == 0 && groupIdCombo.getItemCount() >
0) {
+ groupIdCombo.setText(groupIdCombo.getItem(0));
+ packageCombo.setText(getDefaultJavaPackage());
+ packageCustomized = false;
+ }
+
+ if(archetypeChanged && archetype != null) {
+ archetypeChanged = false;
+ loadArchetypeDescriptor();
+ validate();
+ }
+
+ updatePropertyEditors();
+ }
+ }
+
+ public Properties getProperties() {
+ if(propertiesViewer.isCellEditorActive()) {
+ propertiesTable.setFocus();
+ }
+ Properties properties = new Properties();
+ for(int i = 0; i < propertiesTable.getItemCount(); i++ ) {
+ TableItem item = propertiesTable.getItem(i);
+ properties.put(item.getText(KEY_INDEX), item.getText(VALUE_INDEX));
+ }
+ return properties;
+ }
+
+ public int getTextIndex(String property) {
+ return KEY_PROPERTY.equals(property) ? KEY_INDEX : VALUE_INDEX;
+ }
+
+ public void updatePropertyEditors() {
+ CellEditor[] ce = propertiesViewer.getCellEditors();
+
+ int n = requiredProperties.size() + optionalProperties.size();
+ if(n == 0) {
+ if(ce[KEY_INDEX] instanceof TextComboBoxCellEditor) {
+ // if there was a combo editor previously defined, and the current
+ // archetype has no properties, replace it with a plain text editor
+ ce[KEY_INDEX].dispose();
+ ce[KEY_INDEX] = new TextCellEditor(propertiesTable, SWT.FLAT);
+ }
+ } else {
+ TextComboBoxCellEditor comboEditor = null;
+ // if there was a plain text editor previously defined, and the current
+ // archetype has properties, replace it with a combo editor
+ if(ce[KEY_INDEX] instanceof TextComboBoxCellEditor) {
+ comboEditor = (TextComboBoxCellEditor) ce[KEY_INDEX];
+ } else {
+ ce[KEY_INDEX].dispose();
+ comboEditor = new TextComboBoxCellEditor(propertiesTable, SWT.FLAT);
+ ce[KEY_INDEX] = comboEditor;
+ }
+
+ // populate the property name selection
+ List<String> propertyKeys = new ArrayList<String>(n);
+ propertyKeys.addAll(requiredProperties);
+ propertyKeys.addAll(optionalProperties);
+ comboEditor.setItems(propertyKeys.toArray(new String[n]));
+ }
+ }
+
+ public static String getDefaultJavaPackage(String groupId, String artifactId) {
+ return
org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizardArchetypeParametersPage.getDefaultJavaPackage(groupId,
artifactId);
+ }
+}