/****************************************************************************** * 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; } }