blob: 4626aafb8dd5c86fb9703ad50dc51df80704aac8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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
*******************************************************************************/
package org.eclipse.m2e.wtp.internal.preferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.IMavenProjectRegistry;
import org.eclipse.m2e.core.project.IProjectConfigurationManager;
import org.eclipse.m2e.wtp.JEEPackaging;
import org.eclipse.m2e.wtp.MavenWtpPlugin;
import org.eclipse.m2e.wtp.internal.Messages;
import org.eclipse.m2e.wtp.preferences.ConfiguratorEnabler;
import org.eclipse.m2e.wtp.preferences.IMavenWtpPreferences;
import org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager;
import org.eclipse.m2e.wtp.preferences.MavenWtpPreferencesConstants;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.PropertyPage;
public class MavenWtpPreferencePage extends PropertyPage implements IWorkbenchPreferencePage {
//Override elements
private Composite overrideComp;
private Button overrideButton;
private Link fChangeWorkspaceSettings;
//EAR elements
private Group earPrefGroup;
private Button genApplicationXmlButton;
//WAR elements
private Group warPrefGroup;
private Button warMavenArchiverButton;
private Group configuratorEnablerGroup;
private List<ConfiguratorEnablerComposite> enablersComposites;
public MavenWtpPreferencePage() {
setTitle(Messages.MavenWtpPreferencePage_JavaEE_Integration_Settings);
}
@Override
protected Control createContents(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
GridLayout gl = new GridLayout(1, false);
main.setLayout(gl);
IProject project = getProject();
createOverridePrefs(main, project);
if (project == null || JavaEEProjectUtilities.isEARProject(project)) {
createEarPrefs(main);
}
if (project == null || JavaEEProjectUtilities.isDynamicWebProject(project)) {
createWarPrefs(main);
}
IMavenWtpPreferencesManager prefManager = MavenWtpPlugin.getDefault().getMavenWtpPreferencesManager();
fillValues(prefManager.getPreferences(project));
if (project == null) {
createJavaeeConfiguratorActivation(main, prefManager.getConfiguratorEnablers());
}
return main;
}
private void createJavaeeConfiguratorActivation(Composite main, ConfiguratorEnabler[] configuratorEnablers) {
if (configuratorEnablers == null || configuratorEnablers.length == 0) {
return;
}
configuratorEnablerGroup = new Group(main, SWT.NONE);
configuratorEnablerGroup.setText(Messages.MavenWtpPreferencePage_Select_Active_JavaEE_Configurators);
GridDataFactory.fillDefaults().applyTo(configuratorEnablerGroup);
GridLayoutFactory.fillDefaults().margins(5, 0).applyTo(configuratorEnablerGroup);
enablersComposites = new ArrayList<ConfiguratorEnablerComposite>(configuratorEnablers.length);
for (ConfiguratorEnabler configuratorEnabler : configuratorEnablers) {
ConfiguratorEnablerComposite enablerComposite = new ConfiguratorEnablerComposite(configuratorEnablerGroup,
configuratorEnabler, SWT.NONE);
GridLayoutFactory.fillDefaults().margins(20, 0).applyTo(enablerComposite);
enablersComposites.add(enablerComposite);
}
}
/**
* @param main
*/
private void createEarPrefs(Composite main) {
earPrefGroup = new Group(main, SWT.NONE);
earPrefGroup.setText(Messages.MavenWtpPreferencePage_EAR_Project_Preferences);
earPrefGroup.setLayout(new GridLayout(1, false));
earPrefGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
genApplicationXmlButton = new Button(earPrefGroup, SWT.CHECK);
genApplicationXmlButton.setText(Messages.MavenWtpPreferencePage_Generate_ApplicationXml_Under_Build_Dir);
}
private void createOverridePrefs(Composite main, IProject project) {
if(project != null) {
overrideComp = new Composite(main, SWT.NONE);
overrideComp.setLayout(new FormLayout());
overrideComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
overrideButton = new Button(overrideComp, SWT.CHECK);
overrideButton.setText(Messages.MavenWtpPreferencePage_Enable_Project_Specific_Settings);
overrideButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
@Override
public void widgetSelected(SelectionEvent e) {
setWidgetsEnabled(overrideButton.getSelection());
}
});
FormData fd = new FormData();
fd.top = new FormAttachment(0, 5);
fd.left = new FormAttachment(0, 5);
overrideButton.setLayoutData(fd);
fd = new FormData();
fd.top = new FormAttachment(0, 0);
fd.left = new FormAttachment(overrideButton, 5);
fd.right = new FormAttachment(100, -5);
fd.right.alignment = SWT.RIGHT;
Composite tmp = new Composite(overrideComp, SWT.NONE);
tmp.setLayoutData(fd);
tmp.setLayout(new GridLayout(1, true));
fChangeWorkspaceSettings = createLink(tmp, "Configure Workspace Settings..."); //$NON-NLS-1$
fChangeWorkspaceSettings.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
}
}
private void createWarPrefs(Composite main) {
warPrefGroup = new Group(main, SWT.NONE);
warPrefGroup.setText(Messages.MavenWtpPreferencePage_WAR_Project_Preferences);
warPrefGroup.setLayout(new GridLayout(1, false));
warPrefGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
warMavenArchiverButton = new Button(warPrefGroup, SWT.CHECK);
warMavenArchiverButton.setText(Messages.MavenWtpPreferencePage_Generate_MavenArchiver_Files_Under_Build_Dir);
warMavenArchiverButton.setToolTipText(Messages.MavenWtpPreferencePage_Using_Build_Directory);
}
private Link createLink(Composite composite, String text) {
Link link = new Link(composite, SWT.BORDER);
link.setFont(composite.getFont());
link.setText("<A>" + text + "</A>"); //$NON-NLS-1$//$NON-NLS-2$
link.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
openGlobalPrefs();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
openGlobalPrefs();
}
});
return link;
}
private void openGlobalPrefs() {
String id = MavenWtpPreferencesConstants.MAVEN_WTP_PREFERENCE_PAGE;
PreferencesUtil.createPreferenceDialogOn(getShell(), id, new String[] {id}, getElement()).open();
}
protected void setWidgetsEnabled(boolean isEnabled) {
if (genApplicationXmlButton != null) {
genApplicationXmlButton.setEnabled(isEnabled);
}
if (warMavenArchiverButton != null) {
warMavenArchiverButton.setEnabled(isEnabled);
}
}
private void fillValues(IMavenWtpPreferences preferences) {
IProject project = getProject();
if(project != null) {
overrideButton.setSelection(preferences.isEnabledProjectSpecificSettings());
setWidgetsEnabled(overrideButton.getSelection());
}
//read from stored preferences
if (genApplicationXmlButton != null) {
genApplicationXmlButton.setSelection(preferences.isApplicationXmGeneratedInBuildDirectory());
}
if (warMavenArchiverButton != null) {
warMavenArchiverButton.setSelection(preferences.isWebMavenArchiverUsesBuildDirectory());
}
}
public IProject getProject() {
IAdaptable el = getElement();
IProject p = (el == null) ? null : ((IProject) el.getAdapter(IProject.class));
return p;
}
/**
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
@Override
public void init(IWorkbench workbench) {
}
/**
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk() {
IProject project = getProject();
IMavenWtpPreferencesManager preferencesManager = MavenWtpPlugin.getDefault().getMavenWtpPreferencesManager();
IMavenWtpPreferences preferences = preferencesManager.getPreferences(project);
IMavenWtpPreferences newPreferences = preferencesManager.createNewPreferences();
if(project != null) {
newPreferences.setEnabledProjectSpecificSettings(overrideButton.getSelection());
}
if (genApplicationXmlButton != null) {
newPreferences.setApplicationXmGeneratedInBuildDirectory(genApplicationXmlButton.getSelection());
}
if (warMavenArchiverButton != null) {
newPreferences.setWebMavenArchiverUsesBuildDirectory(warMavenArchiverButton.getSelection());
}
if (enablersComposites != null) {
for (ConfiguratorEnablerComposite enablerComposite : enablersComposites) {
enablerComposite.savePreferences();
}
}
if(!newPreferences.equals(preferences)) {
preferencesManager.savePreferences(newPreferences, getProject());
boolean res = MessageDialog.openQuestion(getShell(), Messages.MavenWtpPreferencePage_Maven_JavaEE_Integration_Settings, //
Messages.MavenWtpPreferencePage_Update_Projects_After_Preference_Changes);
if(res) {
updateImpactedProjects();
}
}
return super.performOk();
}
/**
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
IProject project = getProject();
IMavenWtpPreferencesManager preferencesManager = MavenWtpPlugin.getDefault().getMavenWtpPreferencesManager();
IMavenWtpPreferences workspacePreferences = preferencesManager.getWorkspacePreferences();
if(project == null) {
workspacePreferences.setApplicationXmGeneratedInBuildDirectory(true);
workspacePreferences.setWebMavenArchiverUsesBuildDirectory(true);
}
fillValues(workspacePreferences);
if (enablersComposites != null) {
for (ConfiguratorEnablerComposite enablerComposite : enablersComposites) {
enablerComposite.setDefaultValue();
}
}
super.performDefaults();
}
/**
* Update the configuration of maven projects impacted by the configuration change.
*/
private void updateImpactedProjects() {
final IMavenProjectRegistry projectManager = MavenPlugin.getMavenProjectRegistry();
final List<IMavenProjectFacade> facades = getImpactedProjects(projectManager);
if(facades.isEmpty())
return;
final IProjectConfigurationManager configurationManager = MavenPlugin.getProjectConfigurationManager();
WorkspaceJob job = new WorkspaceJob(Messages.MavenWtpPreferencePage_Updating_Maven_Projects_Job) {
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) {
try {
SubMonitor progress = SubMonitor.convert(monitor, Messages.MavenWtpPreferencePage_Updating_Maven_Projects_Monitor, 100);
SubMonitor subProgress = SubMonitor.convert(progress.newChild(5), facades.size() * 100);
//projectManager.sortProjects(facades, progress.newChild(5));
for(IMavenProjectFacade facade : facades) {
if(progress.isCanceled()) {
throw new OperationCanceledException();
}
IProject project = facade.getProject();
subProgress.subTask(NLS.bind(Messages.MavenWtpPreferencePage_Updating_Configuration_For_Project, project.getName()));
configurationManager.updateProjectConfiguration(project, subProgress);
}
} catch(CoreException ex) {
return ex.getStatus();
}
return Status.OK_STATUS;
}
};
job.setRule(configurationManager.getRule());
job.schedule();
}
/**
* Returns the list of Maven projects impacted by the configuration change.
*
* @param projectManager
* @return
*/
private List<IMavenProjectFacade> getImpactedProjects(final IMavenProjectRegistry projectManager) {
final List<IMavenProjectFacade> facades = new ArrayList<IMavenProjectFacade>();
IProject project = getProject();
if(project == null) {
//Get all workspace projects that might be impacted by the configuration change
for(IMavenProjectFacade facade : projectManager.getProjects()) {
if(isImpacted(facade)) {
facades.add(facade);
}
}
} else {
facades.add(projectManager.getProject(project));
}
return facades;
}
/**
* Checks if the project is impacted by the configuration change.
*
* @param facade
* @return
*/
private boolean isImpacted(IMavenProjectFacade facade) {
//We simply check if the project is an EAR for now
switch(JEEPackaging.getValue(facade.getPackaging())) {
case EAR:
case WAR:
return true;
default:
return false;
}
}
}