/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.wizard;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
import org.eclipse.jst.servlet.ui.project.facet.WebProjectFirstPage;
import org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard;
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.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.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
import org.eclipse.wst.common.project.facet.core.IPreset;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
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.events.IFacetedProjectEvent;
import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
import org.eclipse.wst.common.project.facet.core.runtime.internal.BridgedRuntime;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.IServerLifecycleListener;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.core.internal.ChainedJob;
import org.eclipse.wst.server.ui.ServerUIUtil;
import org.jboss.ide.eclipse.as.core.server.IDeployableServer;
import org.jboss.tools.jst.web.server.RegistrationHelper;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.project.facet.SeamProjectPreferences;
import org.jboss.tools.seam.core.project.facet.SeamRuntime;
import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager;
import org.jboss.tools.seam.core.project.facet.SeamVersion;
import org.jboss.tools.seam.internal.core.project.facet.AntCopyUtils;
import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties;
import org.jboss.tools.seam.internal.core.project.facet.ResourceDeployer;
import org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate;
import org.jboss.tools.seam.internal.core.project.facet.SeamFacetInstallDelegate;
import org.jboss.tools.seam.internal.core.project.facet.SeamFacetProjectCreationDataModelProvider;
import org.jboss.tools.seam.ui.ISeamHelpContextIds;
import org.jboss.tools.seam.ui.SeamGuiPlugin;
import org.jboss.tools.seam.ui.internal.project.facet.SeamInstallWizardPage;
/**
*
* @author eskimo
*
*/
@SuppressWarnings("restriction")
public class SeamProjectWizard extends WebProjectWizard implements IExecutableExtension {
private SeamWebProjectFirstPage firstPage;
private String seamConfigTemplate;
// We need these controls there to listen to them to set seam action models.
private Combo matchedServerTargetCombo;
private Control[] dependentServerControls;
private Combo serverRuntimeTargetCombo;
private IPreset oldPreset;
public SeamProjectWizard() {
super();
setWindowTitle(SeamCoreMessages.SEAM_PROJECT_WIZARD_NEW_SEAM_PROJECT);
}
public SeamProjectWizard(IDataModel model) {
super(model);
setWindowTitle(SeamCoreMessages.SEAM_PROJECT_WIZARD_NEW_SEAM_PROJECT);
}
protected IDataModel createDataModel() {
return DataModelFactory.createDataModel(new SeamFacetProjectCreationDataModelProvider());
}
@Override
protected IWizardPage createFirstPage() {
firstPage = new SeamWebProjectFirstPage(model, "first.page"); //$NON-NLS-1$
firstPage.setImageDescriptor(ImageDescriptor.createFromFile(SeamFormWizard.class, "SeamWebProjectWizBan.png")); //$NON-NLS-1$
firstPage.setTitle(SeamCoreMessages.SEAM_PROJECT_WIZARD_SEAM_WEB_PROJECT);
firstPage.setDescription(SeamCoreMessages.SEAM_PROJECT_WIZARD_CREATE_STANDALONE_SEAM_WEB_PROJECT);
return firstPage;
}
static final String templateJstSeam1 = "template.jst.seam"; //$NON-NLS-1$
static final String templateJstSeam2 = "template.jst.seam2"; //$NON-NLS-1$
static final String templateJstSeam21 = "template.jst.seam21"; //$NON-NLS-1$
static final String templateJstSeam22 = "template.jst.seam22"; //$NON-NLS-1$
static final String templateJstSeam23 = "template.jst.seam23"; //$NON-NLS-1$
private static final Map<String, String> templates = new HashMap<String, String>();
static {
templates.put("jst.seam.preset", templateJstSeam1); //$NON-NLS-1$
templates.put("jst.seam2.preset", templateJstSeam2); //$NON-NLS-1$
templates.put("jst.seam21.preset", templateJstSeam21); //$NON-NLS-1$
templates.put("jst.seam22.preset", templateJstSeam22); //$NON-NLS-1$
templates.put("jst.seam23.preset", templateJstSeam23); //$NON-NLS-1$
}
private void setSeamConfigTemplate(String seamConfigTemplate) {
this.seamConfigTemplate = seamConfigTemplate;
}
@Override
public void createPageControls(Composite container) {
super.createPageControls(container);
synchSeamActionModels();
getFacetedProjectWorkingCopy().addListener(new IFacetedProjectListener() {
public void handleEvent(IFacetedProjectEvent event) {
synchSeamActionModels();
}
}, IFacetedProjectEvent.Type.PROJECT_FACETS_CHANGED);
getFacetedProjectWorkingCopy().addListener(new IFacetedProjectListener() {
public void handleEvent(IFacetedProjectEvent event) {
IPreset preset = getFacetedProjectWorkingCopy().getSelectedPreset();
if(preset!=null) {
Set<IProjectFacetVersion> facets = preset.getProjectFacets();
for (IProjectFacetVersion facet : facets) {
if(SeamFacetInstallDelegate.SEAM_FACET_ID.equals(facet.getProjectFacet().getId())) {
oldPreset = null;
break;
}
}
setSeamConfigTemplate(templates.get(preset.getId()));
}
}
}, IFacetedProjectEvent.Type.SELECTED_PRESET_CHANGED);
getFacetedProjectWorkingCopy().addListener(new IFacetedProjectListener() {
public void handleEvent(IFacetedProjectEvent event) {
Set<Action> actions = getFacetedProjectWorkingCopy().getProjectFacetActions();
for (Action action : actions) {
if(ISeamFacetDataModelProperties.SEAM_FACET_ID.equals(action.getProjectFacetVersion().getProjectFacet().getId())) {
IDataModel seamFacetModel = (IDataModel)action.getConfig();
seamFacetModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, model.getProperty(IFacetDataModelProperties.FACET_PROJECT_NAME));
}
}
}
}, IFacetedProjectEvent.Type.PROJECT_NAME_CHANGED);
Control control = findGroupByText(getShell(), SeamCoreMessages.SEAM_PROJECT_WIZARD_EAR_MEMBERSHIP);
if (control != null)
control.setVisible(false);
firstPage.isPageComplete();
}
/*
* (non-Javadoc)
* @see org.eclipse.wst.web.ui.internal.wizards.NewProjectDataModelFacetWizard#setRuntimeAndDefaultFacets(org.eclipse.wst.common.project.facet.core.runtime.IRuntime)
*/
@Override
protected void setRuntimeAndDefaultFacets(IRuntime runtime) {
IPreset preset = getFacetedProjectWorkingCopy().getSelectedPreset();
if(preset!=null) {
oldPreset = preset;
}
IFacetedProjectWorkingCopy dm = getFacetedProjectWorkingCopy();
dm.setTargetedRuntimes(Collections.<IRuntime> emptySet());
boolean dontUseRuntimeConfig = false;
if (runtime != null) {
if(oldPreset!=null) {
dm.setProjectFacets(oldPreset.getProjectFacets());
dontUseRuntimeConfig = true;
} else {
Set<IProjectFacetVersion> minFacets = new HashSet<IProjectFacetVersion>();
try {
for (IProjectFacet f : dm.getFixedProjectFacets()) {
minFacets.add(f.getLatestSupportedVersion(runtime));
}
} catch (CoreException e) {
throw new RuntimeException(e);
}
dm.setProjectFacets(minFacets);
}
dm.setTargetedRuntimes(Collections.singleton(runtime));
}
if(dontUseRuntimeConfig) {
if(dm.getAvailablePresets().contains(oldPreset)) {
dm.setSelectedPreset(oldPreset.getId());
}
} else if(dm.getAvailablePresets().contains(FacetedProjectFramework.DEFAULT_CONFIGURATION_PRESET_ID)) {
dm.setSelectedPreset(FacetedProjectFramework.DEFAULT_CONFIGURATION_PRESET_ID);
}
}
private void synchSeamActionModels() {
Set<Action> actions = getFacetedProjectWorkingCopy().getProjectFacetActions();
for (Action action : actions) {
if(ISeamFacetDataModelProperties.SEAM_FACET_ID.equals(action.getProjectFacetVersion().getProjectFacet().getId())) {
IDataModel model = (IDataModel)action.getConfig();
if(model!=null) {
Object targetServer = this.model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER);
if(targetServer!=null) {
model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, targetServer);
}
Object targetRuntime = this.model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME);
if(targetRuntime!=null) {
Object targetRuntimeName = targetRuntime;
if(targetRuntime instanceof IRuntime) {
targetRuntimeName = ((IRuntime)targetRuntime).getName();
}
model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME, targetRuntimeName);
}
final DataModelSynchHelper synchHelper = firstPage.initializeSynchHelper(model);
Display.getDefault().syncExec(new Runnable() {
public void run() {
synchHelper.synchCombo(matchedServerTargetCombo, ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, dependentServerControls);
synchHelper.synchCombo(serverRuntimeTargetCombo, ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME, null);
}
});
}
}
}
}
Control findControlByClass(Composite comp, Class claz) {
for (Control child : comp.getChildren()) {
if(child.getClass()==claz) {
return child;
} else if(child instanceof Composite){
Control control = findControlByClass((Composite)child, claz);
if(control!=null) return control;
}
}
return null;
}
Control findGroupByText(Composite comp, String text) {
for (Control child : comp.getChildren()) {
if(child instanceof Group && ((Group)child).getText().equals(text)) {
return child;
} else if(child instanceof Composite){
Control control = findGroupByText((Composite)child, text);
if(control!=null) return control;
}
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard#getFinalPerspectiveID()
*/
@Override
protected String getFinalPerspectiveID() {
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard#getTemplate()
*/
@Override
protected IFacetedProjectTemplate getTemplate() {
seamConfigTemplate = SeamCorePlugin.getDefault().getPluginPreferences().getString(SeamProjectPreferences.SEAM_CONFIG_TEMPLATE);
if(seamConfigTemplate==null || seamConfigTemplate.length()==0) {
SeamRuntime runtime = SeamRuntimeManager.getInstance().getLatestSeamRuntime();
if(runtime!=null) {
if(runtime.getVersion()==SeamVersion.SEAM_1_2) {
seamConfigTemplate = templateJstSeam1;
} else if(runtime.getVersion()==SeamVersion.SEAM_2_0) {
seamConfigTemplate = templateJstSeam2;
} else if(runtime.getVersion()==SeamVersion.SEAM_2_1) {
seamConfigTemplate = templateJstSeam21;
} else if(runtime.getVersion()==SeamVersion.SEAM_2_3) {
seamConfigTemplate = templateJstSeam23;
} else {
seamConfigTemplate = templateJstSeam22;
}
} else {
seamConfigTemplate = templateJstSeam22;
}
}
return ProjectFacetsManager.getTemplate(seamConfigTemplate);
}
/* (non-Javadoc)
* @see org.eclipse.wst.web.ui.internal.wizards.NewProjectDataModelFacetWizard#performFinish()
*/
@Override
public boolean performFinish() {
SeamInstallWizardPage page = (SeamInstallWizardPage)getPage(SeamCoreMessages.SEAM_INSTALL_WIZARD_PAGE_SEAM_FACET);
page.finishPressed();
IDataModel model = page.getConfig();
model.setProperty(ISeamFacetDataModelProperties.CREATE_EAR_PROJECTS, Boolean.TRUE);
boolean isEAR = ISeamFacetDataModelProperties.DEPLOY_AS_EAR.equalsIgnoreCase(model.getStringProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS));
IFacetedProjectWorkingCopy fpwc = getFacetedProjectWorkingCopy();
IProjectFacet jpaFacet = ProjectFacetsManager.getProjectFacet("jpt.jpa");
IProjectFacetVersion pfv = fpwc.getProjectFacetVersion(jpaFacet);
if (isEAR && pfv != null){
//remove jpa facet from <project>
// and add it to <project>-ejb with the same model
action = fpwc.getProjectFacetAction(jpaFacet);
IDataModel dataModel = (IDataModel) action.getConfig();
String connectionProfileName = dataModel.getStringProperty("JpaFacetDataModelProperties.CONNECTION");
if (connectionProfileName == null) throw new NullPointerException("Jpa connection profile is null");
page.setJpaConnectionProfile(connectionProfileName);
fpwc.removeProjectFacet(jpaFacet);
}
return super.performFinish();
}
Action action = null;
/*
* (non-Javadoc)
* @see org.eclipse.wst.web.ui.internal.wizards.NewProjectDataModelFacetWizard#performFinish(org.eclipse.core.runtime.IProgressMonitor)
*/
protected void performFinish(final IProgressMonitor monitor) throws CoreException {
super.performFinish(monitor);
IProject warProject = this.getFacetedProject().getProject();
SeamInstallWizardPage page = (SeamInstallWizardPage)getPage(SeamCoreMessages.SEAM_INSTALL_WIZARD_PAGE_SEAM_FACET);
IDataModel model = page.getConfig();
boolean deployAsEar = ISeamFacetDataModelProperties.DEPLOY_AS_EAR.equals(model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS));
IProject earProject = null;
IProject ejbProject = null;
List<IProject> projects = new ArrayList<IProject>();
String parentProjectName = warProject.getName() + "-parent";
IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
IProject parentProject = wsRoot.getProject(parentProjectName);
if (parentProject != null && parentProject.exists()) {
projects.add(parentProject);
}
// build projects. We need to build it before publishing on server.
projects.add(warProject);
if(deployAsEar) {
String ejbProjectName = model.getStringProperty(ISeamFacetDataModelProperties.SEAM_EJB_PROJECT);
String earProjectName = model.getStringProperty(ISeamFacetDataModelProperties.SEAM_EAR_PROJECT);
earProject = wsRoot.getProject(earProjectName);
ejbProject = wsRoot.getProject(ejbProjectName);
projects.add(ejbProject);
projects.add(earProject);
}
if(ejbProject != null) {
provideClassPath(projects, ejbProject);
if (action != null) {
IDataModel jpaModel = (IDataModel) action.getConfig();
boolean isHibernatePlatform = "hibernate".equals(
jpaModel.getStringProperty("JpaFacetDataModelProperties.PLATFORM_ID"));
if (isHibernatePlatform){
IFile hibernateLaunchFile = ejbProject.getFile(ejbProject.getName() + ".launch"); //$NON-NLS-1$
if (hibernateLaunchFile.exists()){//delete the launch configuration to prevent doubling
hibernateLaunchFile.delete(1, monitor);
}
}
IFacetedProject facetedProject = ProjectFacetsManager.create(ejbProject, true, null);
//add facet
facetedProject.installProjectFacet(action.getProjectFacetVersion(), action.getConfig(), null);
}
}
buildProjects(projects, monitor);
// copy JDBC driver to server libraries folder;
// register project on the selected server;
// deploy datasource xml file to the selected server;
IServer server = SeamFacetAbstractInstallDelegate.getServer(model);
if (server != null) {
IDeployableServer jbs = (IDeployableServer) server.loadAdapter(IDeployableServer.class, new NullProgressMonitor());
if (jbs != null) {
String[] driverJars = (String[]) model.getProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY);
if(driverJars!=null) {
String configFolder = jbs.getConfigDirectory();
if(model.getStringProperty(ISeamFacetDataModelProperties.SEAM_LIBRARY_PROVIDER).equals(SeamCoreMessages.SEAM_INSTALL_WIZARD_PAGE_COPY_LIBRARIES)){
AntCopyUtils.copyFiles(driverJars, new File(configFolder, "lib"), false);
}
}
}
IPath filePath = new Path("resources").append(warProject.getName() + "-ds.xml");
ChainedJob dsJob = null;
if (deployAsEar) {
dsJob = new ResourceDeployer(earProject, server, filePath);
} else {
dsJob = new ResourceDeployer(warProject, server, filePath);
}
dsJob.setNextJob(RegistrationHelper.getRegisterInServerJob(warProject, new IServer[]{server}, null));
dsJob.schedule();
}
}
private void provideClassPath(List<IProject> projects, IProject ejbProject) throws CoreException {
if(ejbProject == null) return;
int k = 0;
while(k < 50) {
k++;
J2EEComponentClasspathUpdater.getInstance().forceUpdate(projects, false);
try {
boolean ok = checkClassPath(ejbProject);
// System.out.println("-->" + k);
if(ok) break;
} catch(CoreException ee1) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
// System.out.println("SeamProjectWizard: Class path provided in " + k + " iterations.");
}
public static boolean checkClassPath(IProject project) throws CoreException {
if(project == null || !project.isAccessible() || !project.hasNature(JavaCore.NATURE_ID)) return false;
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] es = javaProject.getRawClasspath();
for (int i = 0; i < es.length; i++) {
if(es[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
IPath p = es[i].getPath();
//"org.eclipse.jst.j2ee.internal.module.container"
if(p.toString().startsWith("org.eclipse.jst.j2ee")) {
IClasspathContainer c = JavaCore.getClasspathContainer(p, javaProject);
if(c == null) return false;
IClasspathEntry[] cs = c.getClasspathEntries();
return cs != null && cs.length > 0;
}
}
}
return true;
}
private void buildProjects(List<IProject> projects, IProgressMonitor monitor) {
J2EEComponentClasspathUpdater.getInstance().forceUpdate(projects, false);
try {
for (IProject project : projects) {
project.build(IncrementalProjectBuilder.CLEAN_BUILD, monitor);
project.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
}
} catch (CoreException e) {
SeamGuiPlugin.getPluginLog().logError(e);
}
}
class SeamWebProjectFirstPage extends WebProjectFirstPage {
@Override
protected String getInfopopID() {
return ISeamHelpContextIds.NEW_SEAM_PROJECT;
}
public SeamWebProjectFirstPage(IDataModel model, String pageName ) {
super(model, pageName);
}
protected Composite createTopLevelComposite(Composite parent) {
Composite top = new Composite(parent, SWT.NONE);
top.setLayout(new GridLayout());
top.setLayoutData(new GridData(GridData.FILL_BOTH));
createProjectGroup(top);
createServerTargetComposite(top);
serverRuntimeTargetCombo = serverTargetCombo;
createPrimaryFacetComposite(top);
createSeamServerTargetComposite(top);
createPresetPanel(top);
return top;
}
@Override
protected void updatePrimaryVersions() {
IFacetedProjectWorkingCopy fpjwc = (IFacetedProjectWorkingCopy) this.model.getProperty( FACETED_PROJECT_WORKING_COPY );
IProjectFacetVersion selectedVersion = fpjwc.getProjectFacetVersion(primaryProjectFacet);
SortedSet<IProjectFacetVersion> initialVersions = fpjwc.getAvailableVersions(primaryProjectFacet);
String [] items = new String[initialVersions.size()];
int i=0;
int selectedVersionIndex = -1;
for(Iterator <IProjectFacetVersion> iterator = initialVersions.iterator(); iterator.hasNext(); i++){
items[i] = iterator.next().getVersionString();
if(selectedVersionIndex == -1 && items[i].equals(selectedVersion.getVersionString())){
selectedVersionIndex = i;
}
}
primaryVersionCombo.clearSelection();
primaryVersionCombo.setItems(items);
if(!setWebModuleVersion()) {
primaryVersionCombo.select(selectedVersionIndex);
}
}
protected void createSeamServerTargetComposite(Composite parent) {
Group group = new Group(parent, SWT.NONE);
group.setText(SeamCoreMessages.SEAM_TARGET_SERVER);
group.setLayoutData(gdhfill());
group.setLayout(new GridLayout(2, false));
matchedServerTargetCombo = new Combo(group, SWT.BORDER | SWT.READ_ONLY);
matchedServerTargetCombo.setLayoutData(gdhfill());
Button newMatchedServerTargetButton = new Button(group, SWT.NONE);
newMatchedServerTargetButton.setText(SeamCoreMessages.SEAM_INSTALL_WIZARD_PAGE_NEW);
newMatchedServerTargetButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (!SeamWebProjectFirstPage.this.internalLaunchNewServerWizard(getShell(), model)) {
//Bugzilla 135288
//setErrorMessage(ResourceHandler.InvalidServerTarget);
}
}
});
dependentServerControls = new Control[]{serverTargetCombo, newMatchedServerTargetButton};
synchHelper.synchCombo(matchedServerTargetCombo, ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, dependentServerControls);
if (matchedServerTargetCombo.getSelectionIndex() == -1 && matchedServerTargetCombo.getVisibleItemCount() != 0)
matchedServerTargetCombo.select(0);
setWebModuleVersion();
}
protected String[] getValidationPropertyNames() {
String[] superProperties = super.getValidationPropertyNames();
List<String> list = Arrays.asList(superProperties);
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.addAll( list );
arrayList.add( ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME);
arrayList.add( ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER);
arrayList.add( ISeamFacetDataModelProperties.SEAM_PROJECT_NAME);
return arrayList.toArray( new String[0] );
}
public boolean launchNewServerWizard(Shell shell, IDataModel model) {
return launchNewServerWizard(shell, model, null);
}
private final String eapRuntimeId = "org.jboss.ide.eclipse.as.runtime.eap.";
public boolean isAs7orHigherSelected() {
String runtimeName = serverRuntimeTargetCombo.getText();
if(RuntimeManager.isRuntimeDefined(runtimeName)) {
IRuntime targetRuntime = RuntimeManager.getRuntime(runtimeName);
if(targetRuntime instanceof BridgedRuntime) {
List<IRuntimeComponent> components = ((BridgedRuntime)targetRuntime).getRuntimeComponents();
for (IRuntimeComponent component : components) {
String typeId = component.getProperty("type-id");
if(typeId!=null) {
if(typeId.startsWith("org.jboss.ide.eclipse.as.runtime.7") || typeId.startsWith("org.jboss.ide.eclipse.as.runtime.wildfly")) {
return true;
} else if(typeId.startsWith(eapRuntimeId) && typeId.length() > eapRuntimeId.length()) {
String v = typeId.substring(eapRuntimeId.length());
int number = 0;
try {
number = Integer.parseInt(v);
} catch(NumberFormatException e) {
number = v.compareTo("6")>=0?6:0;
}
if(number>=6) {
return true;
}
}
}
}
}
}
return false;
}
private String lastWeb25Template;
private int lastWeb25ComboIndex;
public boolean setWebModuleVersion() {
if(seamConfigTemplate!=templateJstSeam23 && seamConfigTemplate!=null && !seamConfigTemplate.isEmpty()) {
lastWeb25Template = seamConfigTemplate;
} else {
lastWeb25Template = templateJstSeam22;
}
lastWeb25ComboIndex = primaryVersionCombo.getSelectionIndex();
String [] items = primaryVersionCombo.getItems();
for (int i = 0; i < items.length; i++) {
if("2.5".equals(items[0])) {
lastWeb25ComboIndex = i;
break;
}
}
if(isAs7orHigherSelected() && primaryVersionCombo.getItemCount()>0) {
setTemplate(templateJstSeam23, primaryVersionCombo.getItemCount()-1);
return true;
} else if(lastWeb25Template!=null && !lastWeb25Template.equals(seamConfigTemplate)) {
setTemplate(lastWeb25Template, lastWeb25ComboIndex);
return true;
}
return false;
}
private void setTemplate(String newTemplate, int primaryVersionComboIndex) {
primaryVersionCombo.select(primaryVersionComboIndex);
seamConfigTemplate = newTemplate;
SeamProjectWizard.this.template = ProjectFacetsManager.getTemplate(seamConfigTemplate);
getFacetedProjectWorkingCopy().setFixedProjectFacets(SeamProjectWizard.this.template.getFixedProjectFacets());
final IPreset preset = SeamProjectWizard.this.template.getInitialPreset();
getFacetedProjectWorkingCopy().setSelectedPreset(preset.getId());
}
@Override
public IProjectFacetVersion getPrimaryFacetVersion() {
return super.getPrimaryFacetVersion();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
*/
@Override
public boolean isPageComplete() {
boolean pageComplete = super.isPageComplete();
IProjectFacet pFacet = ProjectFacetsManager.getProjectFacet(ISeamFacetDataModelProperties.SEAM_FACET_ID);
IFacetedProjectWorkingCopy fProject = getFacetedProjectWorkingCopy();
if(fProject!=null) {
IProjectFacetVersion seamFacet = fProject.getProjectFacetVersion(pFacet);
if(seamFacet==null) {
if(pageComplete) {
this.setErrorMessage(SeamCoreMessages.SEAM_PROJECT_WIZARD_PAGE1_SEAM_FACET_MUST_BE_SPECIFIED);
return false;
}
} else {
if(pageComplete) {
this.setErrorMessage(null);
} else if(SeamCoreMessages.SEAM_PROJECT_WIZARD_PAGE1_SEAM_FACET_MUST_BE_SPECIFIED.equals(getErrorMessage())) {
this.setErrorMessage(null);
}
}
}
return pageComplete;
}
public boolean launchNewServerWizard(Shell shell, final IDataModel model, String serverTypeID) {
DataModelPropertyDescriptor[] preAdditionDescriptors = model.getValidPropertyDescriptors(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER);
IRuntime rt = (IRuntime)model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME);
IServerLifecycleListener serverListener = new IServerLifecycleListener() {
public void serverAdded(IServer server) {
DataModelPropertyDescriptor[] descriptors = model.getValidPropertyDescriptors(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
for (int i = 0; i < descriptors.length; i++) {
if(server.getRuntime().getName().equals(descriptors[i].getPropertyDescription())) {
model.setProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME, descriptors[i].getPropertyValue());
model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_RUNTIME, descriptors[i].getPropertyValue());
}
}
model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, server);
}
public void serverChanged(IServer server) {
}
public void serverRemoved(IServer server) {
}
};
ServerCore.addServerLifecycleListener(serverListener);
boolean isOK = false;
try {
isOK = ServerUIUtil.showNewServerWizard(shell, serverTypeID, null, (rt == null ? null : null));
} finally {
ServerCore.removeServerLifecycleListener(serverListener);
}
if (isOK && model != null) {
DataModelPropertyDescriptor[] postAdditionDescriptors = model.getValidPropertyDescriptors(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER);
Object[] preAddition = new Object[preAdditionDescriptors.length];
for (int i = 0; i < preAddition.length; i++) {
preAddition[i] = preAdditionDescriptors[i].getPropertyValue();
}
Object[] postAddition = new Object[postAdditionDescriptors.length];
for (int i = 0; i < postAddition.length; i++) {
postAddition[i] = postAdditionDescriptors[i].getPropertyValue();
}
Object newAddition = null;
if (preAddition != null && postAddition != null && preAddition.length < postAddition.length) {
for (int i = 0; i < postAddition.length; i++) {
boolean found = false;
Object object = postAddition[i];
for (int j = 0; j < preAddition.length; j++) {
if (preAddition[j] == object) {
found = true;
break;
}
}
if (!found) {
newAddition = object;
}
}
}
if (preAddition == null && postAddition != null && postAddition.length == 1)
newAddition = postAddition[0];
model.notifyPropertyChange(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, IDataModel.VALID_VALUES_CHG);
isPageComplete();
if (newAddition != null)
model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER, newAddition);
else
return false;
}
return isOK;
}
public boolean internalLaunchNewServerWizard(Shell shell, IDataModel model) {
return launchNewServerWizard(shell, model, getModuleTypeID());
}
public void restoreDefaultSettings() {
super.restoreDefaultSettings();
String lastServerName = SeamProjectPreferences
.getStringPreference(SeamProjectPreferences.SEAM_LAST_SERVER_NAME);
if (lastServerName != null && lastServerName.length() > 0) {
SeamFacetProjectCreationDataModelProvider.setServerName(model,lastServerName);
}
}
public void storeDefaultSettings() {
super.storeDefaultSettings();
Preferences preferences = SeamCorePlugin.getDefault().getPluginPreferences();
String serverName = SeamFacetProjectCreationDataModelProvider.getServerName(model);
if (serverName != null && serverName.length() > 0) {
preferences.setValue(
SeamProjectPreferences.SEAM_LAST_SERVER_NAME,
serverName);
}
if(seamConfigTemplate!=null) {
preferences.setValue(
SeamProjectPreferences.SEAM_CONFIG_TEMPLATE,
seamConfigTemplate);
}
}
}
}