/******************************************************************************
* Copyright (c) 2008-2013, Linagora
*
* 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:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.services.preferences;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.DirectoryFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import com.ebmwebsourcing.petals.common.internal.provisional.preferences.PreferencesManager;
import com.ebmwebsourcing.petals.common.internal.provisional.ui.FileUrlFieldEditor;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.IoUtils;
import com.ebmwebsourcing.petals.services.PetalsServicesPlugin;
import com.ebmwebsourcing.petals.services.maven.PetalsServicePomManager;
/**
* The Petals preference page for Maven.
* @author Vincent Zurczak - EBM WebSourcing
*/
public class MavenPreferencePage
extends PreferencePage
implements IWorkbenchPreferencePage {
private BooleanFieldEditor autoPomUpdateField;
private DirectoryFieldEditor customizedPomLocationField;
private StringFieldEditor pluginVersionField, groupIdField;
private FileUrlFieldEditor pomParentField;
private Button defaultButton, customizedButton;
private boolean useCustomizedPom;
/**
* Constructor.
*/
public MavenPreferencePage() {
super( "Petals Preferences for Maven" );
setTitle( "Petals Preferences for Maven" );
setDescription( "The preference page to configure Maven elements." );
setPreferenceStore( PreferencesManager.getPreferenceStore());
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage
* #init(org.eclipse.ui.IWorkbench)
*/
public void init( IWorkbench workbench ) {
this.useCustomizedPom = PreferencesManager.useCustomizedTemplates();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage
* #createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents( Composite parent ) {
Composite container = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout();
container.setLayout( layout );
container.setLayoutData( new GridData( GridData.FILL_BOTH ));
// Petals Maven plug-in
Group group = new Group( container, SWT.NONE );
group.setLayout( new GridLayout( 3, false ));
GridData layoutData = new GridData( GridData.FILL_HORIZONTAL );
layoutData.horizontalSpan = 3;
layoutData.verticalIndent = 4;
group.setLayoutData( layoutData );
group.setText( "Petals Maven plug-in" );
Composite subContainer = new Composite( group, SWT.NONE );
subContainer.setLayout( new GridLayout());
subContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.pluginVersionField = new StringFieldEditor(
PreferencesManager.PREFS_MAVEN_PLUGIN_VERSION,
"Plugin Version:",
StringFieldEditor.UNLIMITED,
subContainer );
this.pluginVersionField.fillIntoGrid( subContainer, 3 );
this.pluginVersionField.setPage( this );
this.pluginVersionField.setPreferenceStore( getPreferenceStore());
this.pluginVersionField.load();
this.groupIdField = new StringFieldEditor(
PreferencesManager.PREFS_MAVEN_GROUP_ID,
"Group ID:",
StringFieldEditor.UNLIMITED,
subContainer );
this.groupIdField.fillIntoGrid( subContainer, 3 );
this.groupIdField.setPage( this );
this.groupIdField.setPreferenceStore( getPreferenceStore());
this.groupIdField.load();
this.pomParentField = new FileUrlFieldEditor(
PreferencesManager.PREFS_MAVEN_POM_PARENT,
"POM Parent:",
true,
StringFieldEditor.VALIDATE_ON_KEY_STROKE,
subContainer );
this.pomParentField.setFileExtensions( new String[] { "*.xml" } );
this.pomParentField.setPage( this );
this.pomParentField.setPreferenceStore( getPreferenceStore());
this.pomParentField.load();
// Work with customized POM
group = new Group( container, SWT.NONE );
group.setLayout( new GridLayout( 4, false ));
layoutData = new GridData( GridData.FILL_HORIZONTAL );
layoutData.horizontalSpan = 3;
layoutData.verticalIndent = 10;
group.setLayoutData( layoutData );
group.setText( "POM customization" );
subContainer = new Composite( group, SWT.NONE );
subContainer.setLayout( new GridLayout());
subContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.defaultButton = new Button( subContainer, SWT.RADIO );
this.defaultButton.setText( "Use default POM" );
layoutData = new GridData();
layoutData.horizontalSpan = 3;
this.defaultButton.setLayoutData( layoutData );
this.customizedButton = new Button( subContainer, SWT.RADIO );
this.customizedButton.setText( "Use customized POM" );
layoutData = new GridData();
layoutData.horizontalSpan = 3;
this.customizedButton.setLayoutData( layoutData );
// The next field must only validate the location if it is enabled
this.customizedPomLocationField = new DirectoryFieldEditor(
PreferencesManager.PREFS_CUSTOMIZED_POM_LOCATION,
"POM templates:",
subContainer ) {
@Override
protected boolean checkState() {
boolean result = true;
if( MavenPreferencePage.this.useCustomizedPom )
result = super.checkState();
else
clearErrorMessage();
return result;
}
@Override
public void setEnabled( boolean enabled, Composite parent ) {
super.setEnabled( enabled, parent );
valueChanged();
}
};
this.customizedPomLocationField.setErrorMessage( "The POM templates location is not a valid directory." );
this.customizedPomLocationField.setPage( this );
this.customizedPomLocationField.setPreferenceStore( getPreferenceStore());
this.customizedPomLocationField.load();
// Add a hyper link to generate the default POM
final Link hyperlink = new Link( subContainer, SWT.NONE );
hyperlink.setText( "<A>Generate the default POM templates</A>" );
layoutData = new GridData( SWT.TRAIL, SWT.DEFAULT, true, false );
layoutData.horizontalSpan = 2;
hyperlink.setLayoutData( layoutData );
// Add the listeners
this.customizedPomLocationField.setPropertyChangeListener( new IPropertyChangeListener() {
public void propertyChange( PropertyChangeEvent event ) {
if( FieldEditor.VALUE.equals( event.getProperty())) {
boolean valid = MavenPreferencePage.this.customizedPomLocationField.isValid();
hyperlink.setEnabled( valid );
setValid( valid );
}
}
});
SelectionListener selectionListener = new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
widgetDefaultSelected( e );
}
public void widgetDefaultSelected( SelectionEvent e ) {
MavenPreferencePage.this.useCustomizedPom = MavenPreferencePage.this.customizedButton.getSelection();
MavenPreferencePage.this.customizedPomLocationField.setEnabled(
MavenPreferencePage.this.useCustomizedPom,
MavenPreferencePage.this.customizedButton.getParent());
if( MavenPreferencePage.this.useCustomizedPom )
hyperlink.setEnabled( MavenPreferencePage.this.customizedPomLocationField.isValid());
else
hyperlink.setEnabled( false );
}
};
this.defaultButton.addSelectionListener( selectionListener );
this.customizedButton.addSelectionListener( selectionListener );
this.defaultButton.setSelection( ! this.useCustomizedPom );
this.customizedButton.setSelection( this.useCustomizedPom );
this.customizedButton.notifyListeners( SWT.Selection, new Event());
hyperlink.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
// Get the situation
File rootDirectory = new File( MavenPreferencePage.this.customizedPomLocationField.getStringValue());
File suPom = new File( rootDirectory, PetalsServicePomManager.DEFAULT_SU_POM );
File saPom = new File( rootDirectory, PetalsServicePomManager.DEFAULT_SA_POM );
boolean overwrite = false;
if( suPom.exists() || saPom.exists()) {
String msg = "Some of the default POM templates already exist.\nDo you want to overwrite them?";
overwrite = MessageDialog.openQuestion( hyperlink.getShell(), "Overwrite Templates", msg );
}
// Create the SU template
boolean ok = true;
if( ! suPom.exists() || overwrite ) {
File tpl = getBundledTemplateFile( true );
try {
IoUtils.copyStream( tpl, suPom );
} catch( IOException e1 ) {
ok = false;
PetalsServicesPlugin.log( e1, IStatus.ERROR );
}
}
// Create the SA template
if( ! saPom.exists() || overwrite ) {
File tpl = getBundledTemplateFile( false );
try {
IoUtils.copyStream( tpl, saPom );
} catch( IOException e1 ) {
ok = false;
PetalsServicesPlugin.log( e1, IStatus.ERROR );
}
}
// Report the result
if( ok ) {
MessageDialog.openInformation(
hyperlink.getShell(),
"Successful Creation",
"The default POM templates were successfully created." );
} else {
MessageDialog.openError(
hyperlink.getShell(),
"Error during the Creation",
"The default POM templates could not be created correctly.\nCheck the log for more details." );
}
}
});
// Update POM dependencies automatically
group = new Group( container, SWT.NONE );
group.setLayout( new GridLayout());
layoutData = new GridData( GridData.FILL_HORIZONTAL );
layoutData.horizontalSpan = 3;
layoutData.verticalIndent = 10;
group.setLayoutData( layoutData );
group.setText( "POM dependencies" );
subContainer = new Composite( group, SWT.NONE );
subContainer.setLayout( new GridLayout());
this.autoPomUpdateField = new BooleanFieldEditor(
PreferencesManager.PREFS_UPDATE_MAVEN_POM,
"Update POM dependencies automatically (SA projects)",
subContainer );
this.autoPomUpdateField.setPage( this );
this.autoPomUpdateField.setPreferenceStore( getPreferenceStore());
this.autoPomUpdateField.load();
return container;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage
* #performOk()
*/
@Override
public boolean performOk() {
this.autoPomUpdateField.store();
this.customizedPomLocationField.store();
this.groupIdField.store();
this.pluginVersionField.store();
this.pomParentField.store();
getPreferenceStore().setValue( PreferencesManager.PREFS_USE_CUSTOMIZED_POM, this.useCustomizedPom );
return super.performOk();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage
* #performDefaults()
*/
@Override
protected void performDefaults() {
this.autoPomUpdateField.loadDefault();
this.customizedPomLocationField.loadDefault();
this.groupIdField.loadDefault();
this.pluginVersionField.loadDefault();
this.pomParentField.loadDefault();
this.defaultButton.setSelection( true );
this.customizedButton.setSelection( false );
this.defaultButton.notifyListeners( SWT.Selection, new Event());
super.performDefaults();
}
/**
* Gets a template file from the bundle.
* @param su true to get the default SU template, false for the SA's one
* @return the template file
*/
private File getBundledTemplateFile( boolean su ) {
File result = null;
String entry;
if( su )
entry = "pom/" + PetalsServicePomManager.DEFAULT_SU_POM;
else
entry = "pom/" + PetalsServicePomManager.DEFAULT_SA_POM;
try {
URL url = PetalsServicesPlugin.getDefault().getBundle().getEntry( entry );
IPath path = new Path( FileLocator.toFileURL( url ).getPath());
result = path.toFile();
} catch( IOException e ) {
PetalsServicesPlugin.log( e, IStatus.ERROR );
}
return result;
}
}