/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of the Liferay Enterprise
* Subscription License ("License"). You may not use this file except in
* compliance with the License. You can obtain a copy of the License by
* contacting Liferay, Inc. See the License for the specific language governing
* permissions and limitations under the License, including but not limited to
* distribution rights of the Software.
*/
package com.liferay.ide.server.ui.wizard;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.server.core.LiferayServerCore;
import com.liferay.ide.server.remote.IRemoteServer;
import com.liferay.ide.server.remote.IRemoteServerWorkingCopy;
import com.liferay.ide.server.remote.RemoteServer;
import com.liferay.ide.server.remote.RemoteUtil;
import com.liferay.ide.server.ui.LiferayServerUI;
import com.liferay.ide.ui.LiferayUIPlugin;
import com.liferay.ide.ui.util.SWTUtil;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.text.MessageFormat;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.server.core.IServerWorkingCopy;
import org.eclipse.wst.server.ui.wizard.IWizardHandle;
/**
* @author Greg Amerson
*/
public class RemoteServerComposite extends Composite implements ModifyListener, PropertyChangeListener
{
protected boolean disableValidation;
protected RemoteServerWizardFragment fragment;
protected boolean ignoreModifyEvents;
protected Label labelHttpPort;
protected Label labelLiferayPortalContextPath;
protected Label labelPassword;
protected Label labelServerManagerContextPath;
protected Label labelUsername;
protected IRemoteServerWorkingCopy remoteServerWC;
protected IServerWorkingCopy serverWC;
protected Text textHostname;
protected Text textHTTP;
protected Text textLiferayPortalContextPath;
protected Text textPassword;
protected Text textServerManagerContextPath;
protected Text textUsername;
protected IWizardHandle wizard;
private String initialServerName;
private String initialHostName;
public RemoteServerComposite( Composite parent, RemoteServerWizardFragment fragment, IWizardHandle wizard )
{
super( parent, SWT.NONE );
this.fragment = fragment;
this.wizard = wizard;
createControl();
}
public void modifyText( ModifyEvent e )
{
Object src = e.getSource();
if( src == null || ignoreModifyEvents )
{
return;
}
if( src.equals( textHostname ) )
{
this.serverWC.setHost( textHostname.getText() );
// IDE-425
if( this.initialServerName != null && this.initialHostName.contains( this.initialHostName ) )
{
this.serverWC.setName( this.initialServerName.replaceAll( this.initialHostName, textHostname.getText() ) );
}
}
else if( src.equals( textHTTP ) )
{
this.remoteServerWC.setHTTPPort( textHTTP.getText() );
}
else if( src.equals( textServerManagerContextPath ) )
{
this.remoteServerWC.setServerManagerContextPath( textServerManagerContextPath.getText() );
}
else if( src.equals( textLiferayPortalContextPath ) )
{
this.remoteServerWC.setLiferayPortalContextPath( textLiferayPortalContextPath.getText() );
}
else if( src.equals( textUsername ) )
{
this.remoteServerWC.setUsername( textUsername.getText() );
}
else if( src.equals( textPassword ) )
{
this.remoteServerWC.setPassword( textPassword.getText() );
}
}
public void propertyChange( PropertyChangeEvent evt )
{
if( IRemoteServer.ATTR_HOSTNAME.equals( evt.getPropertyName() ) ||
IRemoteServer.ATTR_HTTP_PORT.equals( evt.getPropertyName() ) ||
IRemoteServer.ATTR_USERNAME.equals( evt.getPropertyName() ) ||
IRemoteServer.ATTR_PASSWORD.equals( evt.getPropertyName() ) ||
IRemoteServer.ATTR_LIFERAY_PORTAL_CONTEXT_PATH.equals( evt.getPropertyName() ) ||
IRemoteServer.ATTR_SERVER_MANAGER_CONTEXT_PATH.equals( evt.getPropertyName() ) )
{
LiferayServerCore.updateConnectionSettings( (IRemoteServer) serverWC.loadAdapter(
IRemoteServer.class, null ) );
}
}
public void setServer( IServerWorkingCopy newServer )
{
if( newServer == null )
{
serverWC = null;
remoteServerWC = null;
}
else
{
serverWC = newServer;
remoteServerWC = (IRemoteServerWorkingCopy) serverWC.loadAdapter( IRemoteServerWorkingCopy.class, null );
serverWC.addPropertyChangeListener( this );
}
disableValidation = true;
initialize();
disableValidation = false;
validate();
}
protected void createControl()
{
setLayout( new GridLayout( 1, false ) );
disableValidation = true;
Group connectionGroup = SWTUtil.createGroup( this, Msgs.connectionSettings, 2 );
connectionGroup.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false ) );
Label labelHostname = new Label( connectionGroup, SWT.NONE );
labelHostname.setText( Msgs.hostname );
textHostname = new Text( connectionGroup, SWT.BORDER );
textHostname.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1 ) );
textHostname.addModifyListener( this );
labelHttpPort = new Label( connectionGroup, SWT.NONE );
labelHttpPort.setText( Msgs.httpPortLabel );
textHTTP = new Text( connectionGroup, SWT.BORDER );
textHTTP.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 1, 1 ) );
textHTTP.addModifyListener( this );
labelUsername = new Label( connectionGroup, SWT.NONE );
labelUsername.setText( Msgs.username );
textUsername = new Text( connectionGroup, SWT.BORDER );
textUsername.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 1, 1 ) );
textUsername.addModifyListener( this );
labelPassword = new Label( connectionGroup, SWT.NONE );
labelPassword.setText( Msgs.password );
textPassword = new Text( connectionGroup, SWT.BORDER | SWT.PASSWORD );
textPassword.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1 ) );
textPassword.addModifyListener( this );
labelLiferayPortalContextPath = new Label( connectionGroup, SWT.NONE );
labelLiferayPortalContextPath.setText( Msgs.liferayPortalContextPath );
labelLiferayPortalContextPath.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false ) );
textLiferayPortalContextPath = new Text( connectionGroup, SWT.BORDER );
textLiferayPortalContextPath.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1 ) );
textLiferayPortalContextPath.addModifyListener( this );
labelServerManagerContextPath = new Label( connectionGroup, SWT.NONE );
labelServerManagerContextPath.setText( Msgs.serverManagerContextPath );
labelServerManagerContextPath.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false ) );
textServerManagerContextPath = new Text( connectionGroup, SWT.BORDER );
textServerManagerContextPath.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1 ) );
textServerManagerContextPath.addModifyListener( this );
final String marketplaceLinkLabel = Msgs.installRemoteIDEConnector;
final String appUrl = "http://www.liferay.com/marketplace/-/mp/application/15193785"; //$NON-NLS-1$
SWTUtil.createHyperLink( this, SWT.NONE, marketplaceLinkLabel, 1, appUrl );
final String installLabel = NLS.bind( "<a>{0}</a>", Msgs.clickHereLink ); //$NON-NLS-1$
final String installUrl = "{0}/group/control_panel/manage?p_p_id=1_WAR_marketplaceportlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&appId=15193785"; //$NON-NLS-1$
final Link installLink = SWTUtil.createLink( this, SWT.NONE, installLabel, 1 );
installLink.addSelectionListener
(
new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
try
{
final String url =
MessageFormat.format( installUrl, "http://" + textHostname.getText() + ":" + textHTTP.getText() ); //$NON-NLS-1$ //$NON-NLS-2$
PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL( new URL( url ) );
}
catch ( Exception e1 )
{
LiferayUIPlugin.logError( "Could not open external browser.", e1 ); //$NON-NLS-1$
}
};
}
);
Composite validateComposite = new Composite( this, SWT.NONE );
validateComposite.setLayoutData( new GridData( SWT.LEFT, SWT.BOTTOM, false, true ) );
validateComposite.setLayout( new GridLayout( 1, false ) );
Button validateButton = new Button( validateComposite, SWT.PUSH );
validateButton.setText( Msgs.validateConnection );
validateButton.setLayoutData( new GridData( SWT.LEFT, SWT.BOTTOM, false, false ) );
validateButton.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
validate();
}
} );
// initDataBindings();
disableValidation = false;
validate();
}
protected RemoteServer getRemoteServer()
{
if( serverWC != null )
{
return (RemoteServer) serverWC.loadAdapter( RemoteServer.class, null );
}
else
{
return null;
}
}
protected void initialize()
{
if( this.serverWC != null && this.remoteServerWC != null )
{
ignoreModifyEvents = true;
this.textHostname.setText( this.serverWC.getHost() );
this.textHTTP.setText( this.remoteServerWC.getHTTPPort() );
this.textLiferayPortalContextPath.setText( this.remoteServerWC.getLiferayPortalContextPath() );
this.textServerManagerContextPath.setText( this.remoteServerWC.getServerManagerContextPath() );
// this.checkboxSecurity.setSelection( this.remoteServerWC.getSecurityEnabled() );
this.textUsername.setText( this.remoteServerWC.getUsername() );
this.textPassword.setText( this.remoteServerWC.getPassword() );
this.initialServerName = this.serverWC.getName();
this.initialHostName = this.serverWC.getHost();
ignoreModifyEvents = false;
}
}
protected void validate()
{
if( disableValidation )
{
return;
}
if( serverWC == null )
{
wizard.setMessage( StringPool.EMPTY, IMessageProvider.ERROR );
return;
}
try
{
IRunnableWithProgress validateRunnable = new IRunnableWithProgress()
{
public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException
{
final IStatus updateStatus = validateServer( monitor );
if( updateStatus.isOK() )
{
String contextPath = RemoteUtil.detectServerManagerContextPath( getRemoteServer(), monitor );
remoteServerWC.setServerManagerContextPath( contextPath );
}
RemoteServerComposite.this.getDisplay().syncExec( new Runnable()
{
public void run()
{
if( updateStatus == null || updateStatus.isOK() )
{
wizard.setMessage( null, IMessageProvider.NONE );
}
else if( updateStatus.getSeverity() == IStatus.WARNING ||
updateStatus.getSeverity() == IStatus.ERROR )
{
if( updateStatus.getMessage().contains( "Your license key has expired" ) ||
updateStatus.getMessage().contains( "Register Your Server or Application" ) )
{
wizard.setMessage(
"Server is not registered or license key has expired ",
IMessageProvider.WARNING );
}
else
{
wizard.setMessage( updateStatus.getMessage(), IMessageProvider.WARNING );
}
}
wizard.update();
}
});
}
};
wizard.run( true, true, validateRunnable );
wizard.update();
if( fragment.lastServerStatus != null && fragment.lastServerStatus.isOK() )
{
ignoreModifyEvents = true;
textServerManagerContextPath.setText( this.remoteServerWC.getServerManagerContextPath() );
textLiferayPortalContextPath.setText( this.remoteServerWC.getLiferayPortalContextPath() );
ignoreModifyEvents = false;
}
}
catch( final Exception e )
{
RemoteServerComposite.this.getDisplay().syncExec( new Runnable()
{
public void run()
{
wizard.setMessage( e.getMessage(), IMessageProvider.WARNING );
wizard.update();
}
} );
}
}
protected IStatus validateServer( IProgressMonitor monitor )
{
String host = serverWC.getHost();
if( CoreUtil.isNullOrEmpty( host ) )
{
return LiferayServerUI.createErrorStatus( Msgs.specifyHostname );
}
String username = remoteServerWC.getUsername();
if( CoreUtil.isNullOrEmpty( username ) )
{
return LiferayServerUI.createErrorStatus( Msgs.specifyUsernamePassword );
}
String port = remoteServerWC.getHTTPPort();
if( CoreUtil.isNullOrEmpty( port ) )
{
return LiferayServerUI.createErrorStatus( Msgs.specifyHTTPPort );
}
IStatus status = remoteServerWC.validate( monitor );
if( status != null && status.getSeverity() == IStatus.ERROR )
{
fragment.lastServerStatus =
new Status( IStatus.WARNING, status.getPlugin(), status.getMessage(), status.getException() );
}
else
{
fragment.lastServerStatus = status;
}
return status;
}
private static class Msgs extends NLS
{
public static String clickHereLink;
public static String connectionSettings;
public static String hostname;
public static String httpPortLabel;
public static String installRemoteIDEConnector;
public static String liferayPortalContextPath;
public static String password;
public static String serverManagerContextPath;
public static String specifyHostname;
public static String specifyHTTPPort;
public static String specifyUsernamePassword;
public static String username;
public static String validateConnection;
static
{
initializeMessages( RemoteServerComposite.class.getName(), Msgs.class );
}
}
}