/*******************************************************************************
* Copyright (c) 2007, 2010 IBM Corporation 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:
* IBM Corporation - Initial API and implementation
* Greg Amerson <gregory.amerson@liferay.com>
*******************************************************************************/
package com.liferay.ide.server.ui.editor;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.core.util.StringUtil;
import com.liferay.ide.server.core.portal.PortalServer;
import com.liferay.ide.server.core.portal.PortalServerConstants;
import com.liferay.ide.server.ui.LiferayServerUI;
import com.liferay.ide.server.ui.cmd.SetDeveloperModeCommand;
import com.liferay.ide.server.ui.cmd.SetExternalPropertiesCommand;
import com.liferay.ide.server.ui.cmd.SetLaunchSettingsCommand;
import com.liferay.ide.server.ui.cmd.SetMemoryArgsCommand;
import com.liferay.ide.server.util.ServerUtil;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
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.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.help.IWorkbenchHelpSystem;
import org.eclipse.wst.server.core.IPublishListener;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.internal.Server;
import org.eclipse.wst.server.core.util.PublishAdapter;
import org.eclipse.wst.server.ui.editor.ServerEditorSection;
import org.eclipse.wst.server.ui.internal.ContextIds;
@SuppressWarnings( "restriction" )
public class PortalServerLaunchEditorSection extends ServerEditorSection
{
protected Section section;
protected PortalServer portalServer;
protected Hyperlink setDefault;
protected boolean defaultDeployDirIsSet;
protected Text memoryArgs;
protected Text externalProperties;
protected Button developerMode;
protected Button externalPropertiesBrowse;
protected Button defaultLaunchSettings;
protected Button customLaunchSettings;
protected boolean updating;
protected PropertyChangeListener listener;
protected IPublishListener publishListener;
protected IPath workspacePath;
protected IPath defaultDeployPath;
protected boolean allowRestrictedEditing;
protected IPath tempDirPath;
protected IPath installDirPath;
/**
* ServerGeneralEditorPart constructor comment.
*/
public PortalServerLaunchEditorSection()
{
super();
}
/**
* Add listeners to detect undo changes and publishing of the server.
*/
protected void addChangeListeners()
{
listener = new PropertyChangeListener()
{
public void propertyChange( PropertyChangeEvent event )
{
if( updating )
{
return;
}
updating = true;
if( PortalServer.PROPERTY_MEMORY_ARGS.equals( event.getPropertyName() ) )
{
String s = (String) event.getNewValue();
PortalServerLaunchEditorSection.this.memoryArgs.setText( s );
}
else if( PortalServer.PROPERTY_EXTERNAL_PROPERTIES.equals( event.getPropertyName() ) )
{
String s = (String) event.getNewValue();
PortalServerLaunchEditorSection.this.externalProperties.setText( s );
}
else if( PortalServer.PROPERTY_DEVELOPER_MODE.equals( event.getPropertyName() ) )
{
boolean s = (Boolean) event.getNewValue();
developerMode.setSelection( s );
}
else if( PortalServer.PROPERTY_LAUNCH_SETTINGS.equals( event.getPropertyName() ) )
{
boolean s = (Boolean) event.getNewValue();
defaultLaunchSettings.setSelection( s );
customLaunchSettings.setSelection( !s );
}
validate();
updating = false;
}
};
server.addPropertyChangeListener( listener );
publishListener = new PublishAdapter()
{
public void publishFinished( IServer server2, IStatus status )
{
boolean flag = false;
if( status.isOK() && server2.getModules().length == 0 )
{
flag = true;
}
if( flag != allowRestrictedEditing )
{
allowRestrictedEditing = flag;
}
}
};
server.getOriginal().addPublishListener( publishListener );
}
private void applyDefaultPortalServerSetting( final boolean useDefaultPortalSeverSetting )
{
if( useDefaultPortalSeverSetting )
{
developerMode.setEnabled( false );
externalProperties.setEnabled( false );
externalPropertiesBrowse.setEnabled( false );
memoryArgs.setEnabled( false );
}
else
{
developerMode.setEnabled( true );
externalProperties.setEnabled( true );
externalPropertiesBrowse.setEnabled( true );
memoryArgs.setEnabled( true );;
}
}
/**
* Creates the SWT controls for this workbench part.
*
* @param parent
* the parent control
*/
public void createSection( Composite parent )
{
super.createSection( parent );
FormToolkit toolkit = getFormToolkit( parent.getDisplay() );
section =
toolkit.createSection( parent, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED |
ExpandableComposite.TITLE_BAR | Section.DESCRIPTION | ExpandableComposite.FOCUS_TITLE );
section.setText( Msgs.liferayLaunch );
section.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL ) );
Composite composite = toolkit.createComposite( section );
GridLayout layout = new GridLayout();
layout.numColumns = 3;
layout.marginHeight = 5;
layout.marginWidth = 10;
layout.verticalSpacing = 5;
layout.horizontalSpacing = 15;
composite.setLayout( layout );
composite.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL ) );
IWorkbenchHelpSystem whs = PlatformUI.getWorkbench().getHelpSystem();
whs.setHelp( composite, ContextIds.EDITOR_SERVER );
whs.setHelp( section, ContextIds.EDITOR_SERVER );
toolkit.paintBordersFor( composite );
section.setClient( composite );
GridData data = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
defaultLaunchSettings = new Button( composite, SWT.RADIO );
defaultLaunchSettings.setText( Msgs.defaultLaunchSettings );
data = new GridData( SWT.BEGINNING, SWT.CENTER, true, false, 3, 1 );
defaultLaunchSettings.setLayoutData( data );
defaultLaunchSettings.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
updating = true;
execute( new SetLaunchSettingsCommand( server, defaultLaunchSettings.getSelection() ) );
updating = false;
applyDefaultPortalServerSetting( defaultLaunchSettings.getSelection() );
customLaunchSettings.setSelection( !defaultLaunchSettings.getSelection() );
validate();
}
});
customLaunchSettings = new Button( composite, SWT.RADIO );
customLaunchSettings.setText( Msgs.customLaunchSettings );
data = new GridData( SWT.BEGINNING, SWT.CENTER, true, false, 3, 1 );
customLaunchSettings.setLayoutData( data );
customLaunchSettings.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
updating = true;
execute( new SetLaunchSettingsCommand( server, !customLaunchSettings.getSelection() ) );
updating = false;
applyDefaultPortalServerSetting( !customLaunchSettings.getSelection() );
defaultLaunchSettings.setSelection( !customLaunchSettings.getSelection() );
validate();
}
});
Label label = createLabel( toolkit, composite, Msgs.memoryArgsLabel );
data = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
label.setLayoutData( data );
memoryArgs = toolkit.createText( composite, null );
data = new GridData( SWT.FILL, SWT.CENTER, true, false );
data.widthHint = 300;
memoryArgs.setLayoutData( data );
memoryArgs.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
if( updating )
{
return;
}
updating = true;
execute(new SetMemoryArgsCommand(server, memoryArgs.getText().trim()));
updating = false;
validate();
}
});
label = createLabel( toolkit, composite, StringPool.EMPTY );
data = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
label.setLayoutData( data );
label = createLabel( toolkit, composite, Msgs.externalPropertiesLabel );
data = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
label.setLayoutData( data );
externalProperties = toolkit.createText( composite, null );
data = new GridData( SWT.FILL, SWT.CENTER, false, false );
data.widthHint = 150;
externalProperties.setLayoutData( data );
externalProperties.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
if( updating )
{
return;
}
updating = true;
execute(new SetExternalPropertiesCommand(server, externalProperties.getText().trim()));
updating = false;
validate();
}
});
externalPropertiesBrowse = toolkit.createButton( composite, Msgs.editorBrowse, SWT.PUSH );
externalPropertiesBrowse.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, false, false ) );
externalPropertiesBrowse.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent se )
{
FileDialog dialog = new FileDialog( externalPropertiesBrowse.getShell() );
dialog.setFilterPath( externalPropertiesBrowse.getText() );
String selectedFile = dialog.open();
if( selectedFile != null && !selectedFile.equals( externalPropertiesBrowse.getText() ) )
{
updating = true;
execute(new SetExternalPropertiesCommand(server, selectedFile));
externalProperties.setText( selectedFile );
updating = false;
validate();
}
}
});
label = createLabel( toolkit, composite, StringPool.EMPTY );
data = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
label.setLayoutData( data );
developerMode = new Button( composite, SWT.CHECK );
developerMode.setText( Msgs.useDeveloperMode );
data = new GridData( SWT.FILL, SWT.CENTER, true, false );
developerMode.setLayoutData( data );
developerMode.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
if( updating )
{
return;
}
updating = true;
execute( new SetDeveloperModeCommand( server, developerMode.getSelection() ) );
updating = false;
validate();
}
});
label = createLabel( toolkit, composite, StringPool.EMPTY );
data = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
label.setLayoutData( data );
setDefault = toolkit.createHyperlink( composite, Msgs.restoreDefaultsLink, SWT.WRAP );
setDefault.addHyperlinkListener( new HyperlinkAdapter()
{
public void linkActivated( HyperlinkEvent e )
{
updating = true;
execute( new SetMemoryArgsCommand( server, PortalServerConstants.DEFAULT_MEMORY_ARGS ) );
memoryArgs.setText( PortalServerConstants.DEFAULT_MEMORY_ARGS );
execute( new SetExternalPropertiesCommand( server, StringPool.EMPTY ) );
externalProperties.setText( StringPool.EMPTY );
execute( new SetDeveloperModeCommand(
server, PortalServerConstants.DEFAULT_DEVELOPER_MODE ) );
developerMode.setSelection( PortalServerConstants.DEFAULT_DEVELOPER_MODE );
execute( new SetLaunchSettingsCommand(
server, PortalServerConstants.DEFAULT_LAUNCH_SETTING ) );
defaultLaunchSettings.setSelection( PortalServerConstants.DEFAULT_LAUNCH_SETTING );
customLaunchSettings.setSelection( !PortalServerConstants.DEFAULT_LAUNCH_SETTING );
applyDefaultPortalServerSetting( PortalServerConstants.DEFAULT_LAUNCH_SETTING );
updating = false;
validate();
}
});
data = new GridData( SWT.FILL, SWT.CENTER, true, false );
data.horizontalSpan = 3;
setDefault.setLayoutData( data );
initialize();
}
protected Label createLabel( FormToolkit toolkit, Composite parent, String text )
{
Label label = toolkit.createLabel( parent, text );
label.setForeground( toolkit.getColors().getColor( IFormColors.TITLE ) );
return label;
}
/**
* @see ServerEditorSection#dispose()
*/
public void dispose()
{
if( server != null )
{
server.removePropertyChangeListener( listener );
if( server.getOriginal() != null )
{
server.getOriginal().removePublishListener( publishListener );
}
}
}
/**
* @see ServerEditorSection#init(IEditorSite, IEditorInput)
*/
public void init( IEditorSite site, IEditorInput input )
{
super.init( site, input );
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
workspacePath = root.getLocation();
if( server != null )
{
portalServer = (PortalServer) server.loadAdapter( PortalServer.class, null );
addChangeListeners();
}
}
/**
* Initialize the fields in this editor.
*/
protected void initialize()
{
if( portalServer == null )
{
return;
}
updating = true;
applyDefaultPortalServerSetting( portalServer.getLaunchSettings() );
customLaunchSettings.setSelection( !portalServer.getLaunchSettings() );
defaultLaunchSettings.setSelection( portalServer.getLaunchSettings() );
developerMode.setSelection( portalServer.getDeveloperMode() );
externalProperties.setText( portalServer.getExternalProperties() );
memoryArgs.setText( StringUtil.merge( portalServer.getMemoryArgs(), " " ) );
server.setAttribute( Server.PROP_AUTO_PUBLISH_TIME, portalServer.getAutoPublishTime() );
updating = false;
validate();
}
public IStatus[] getSaveStatus()
{
String externalPropetiesValue = portalServer.getExternalProperties();
if( !CoreUtil.isNullOrEmpty( externalPropetiesValue ) )
{
File externalPropertiesFile = new File( externalPropetiesValue );
if( ( !externalPropertiesFile.exists() ) || ( !ServerUtil.isValidPropertiesFile( externalPropertiesFile ) ) )
{
return new IStatus[] { new Status(
IStatus.ERROR, LiferayServerUI.PLUGIN_ID, Msgs.invalidExternalPropertiesFile ) };
}
}
return super.getSaveStatus();
}
protected void validate()
{
if( portalServer != null )
{
String externalPropetiesValue = portalServer.getExternalProperties();
if( !CoreUtil.isNullOrEmpty( externalPropetiesValue ) )
{
File externalPropertiesFile = new File( externalPropetiesValue );
if( ( !externalPropertiesFile.exists() ) ||
( !ServerUtil.isValidPropertiesFile( externalPropertiesFile ) ) )
{
setErrorMessage( Msgs.invalidExternalPropertiesFile );
return;
}
}
setErrorMessage( null );
}
}
private static class Msgs extends NLS
{
public static String customLaunchSettings;
public static String defaultLaunchSettings;
public static String editorBrowse;
public static String externalPropertiesLabel;
public static String invalidExternalPropertiesFile;
public static String liferayLaunch;
public static String memoryArgsLabel;
public static String restoreDefaultsLink;
public static String useDeveloperMode;
static
{
initializeMessages( PortalServerLaunchEditorSection.class.getName(), Msgs.class );
}
}
}