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