/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.ui.cluster.dialog; import java.util.Collection; import java.util.Collections; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; 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.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.pentaho.di.cluster.SlaveServer; import org.pentaho.di.core.Const; import org.pentaho.di.core.Props; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.ui.core.PropsUI; import org.pentaho.di.ui.core.dialog.EnterTextDialog; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.core.gui.GUIResource; import org.pentaho.di.ui.core.gui.WindowProperty; import org.pentaho.di.ui.core.widget.PasswordTextVar; import org.pentaho.di.ui.core.widget.TextVar; import org.pentaho.di.ui.trans.step.BaseStepDialog; import org.pentaho.di.ui.util.DialogUtils; import org.pentaho.di.www.RegisterTransServlet; /** * * Dialog that allows you to edit the settings of the security service connection * * @see SlaveServer * @author Matt * @since 31-10-2006 * */ public class SlaveServerDialog extends Dialog { private static Class<?> PKG = SlaveServerDialog.class; // for i18n purposes, needed by Translator2!! private SlaveServer slaveServer; private Collection<SlaveServer> existingServers; private CTabFolder wTabFolder; private FormData fdTabFolder; private CTabItem wServiceTab, wProxyTab; private Composite wServiceComp, wProxyComp; private FormData fdServiceComp, fdProxyComp; private Shell shell; // Service private Text wName; private TextVar wHostname, wPort, wWebAppName, wUsername, wPassword; private Button wMaster; private Button wSSL; // Proxy private TextVar wProxyHost, wProxyPort, wNonProxyHosts; private Button wOK, wCancel; private ModifyListener lsMod; private PropsUI props; private int middle; private int margin; private SlaveServer originalServer; private boolean ok; public SlaveServerDialog( Shell par, SlaveServer slaveServer, Collection<SlaveServer> existingServers ) { super( par, SWT.NONE ); this.slaveServer = (SlaveServer) slaveServer.clone(); this.slaveServer.shareVariablesWith( slaveServer ); this.originalServer = slaveServer; this.existingServers = existingServers; props = PropsUI.getInstance(); ok = false; } public SlaveServerDialog( Shell par, SlaveServer slaveServer ) { this( par, slaveServer, Collections.<SlaveServer>emptyList() ); } public boolean open() { Shell parent = getParent(); shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN ); props.setLook( shell ); shell.setImage( GUIResource.getInstance().getImageSlave() ); lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { slaveServer.setChanged(); } }; middle = props.getMiddlePct(); margin = Const.MARGIN; FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setText( BaseMessages.getString( PKG, "SlaveServerDialog.Shell.Title" ) ); shell.setLayout( formLayout ); // First, add the buttons... // Buttons wOK = new Button( shell, SWT.PUSH ); wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) ); wCancel = new Button( shell, SWT.PUSH ); wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) ); Button[] buttons = new Button[] { wOK, wCancel }; BaseStepDialog.positionBottomButtons( shell, buttons, margin, null ); // The rest stays above the buttons... wTabFolder = new CTabFolder( shell, SWT.BORDER ); props.setLook( wTabFolder, Props.WIDGET_STYLE_TAB ); addServiceTab(); addProxyTab(); fdTabFolder = new FormData(); fdTabFolder.left = new FormAttachment( 0, 0 ); fdTabFolder.top = new FormAttachment( 0, margin ); fdTabFolder.right = new FormAttachment( 100, 0 ); fdTabFolder.bottom = new FormAttachment( wOK, -margin ); wTabFolder.setLayoutData( fdTabFolder ); // Add listeners wOK.addListener( SWT.Selection, new Listener() { public void handleEvent( Event e ) { ok(); } } ); wCancel.addListener( SWT.Selection, new Listener() { public void handleEvent( Event e ) { cancel(); } } ); SelectionAdapter selAdapter = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wUsername.addSelectionListener( selAdapter ); wPassword.addSelectionListener( selAdapter ); wHostname.addSelectionListener( selAdapter ); wPort.addSelectionListener( selAdapter ); wWebAppName.addSelectionListener( selAdapter ); wProxyHost.addSelectionListener( selAdapter ); wProxyPort.addSelectionListener( selAdapter ); wNonProxyHosts.addSelectionListener( selAdapter ); // Detect X or ALT-F4 or something that kills this window... shell.addShellListener( new ShellAdapter() { public void shellClosed( ShellEvent e ) { cancel(); } } ); wTabFolder.setSelection( 0 ); getData(); BaseStepDialog.setSize( shell ); shell.open(); Display display = parent.getDisplay(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return ok; } private void addServiceTab() { // //////////////////////// // START OF DB TAB /// // //////////////////////// wServiceTab = new CTabItem( wTabFolder, SWT.NONE ); wServiceTab.setText( BaseMessages.getString( PKG, "SlaveServerDialog.USER_TAB_SERVICE" ) ); wServiceComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wServiceComp ); FormLayout GenLayout = new FormLayout(); GenLayout.marginWidth = Const.FORM_MARGIN; GenLayout.marginHeight = Const.FORM_MARGIN; wServiceComp.setLayout( GenLayout ); // What's the name Label wlName = new Label( wServiceComp, SWT.RIGHT ); props.setLook( wlName ); wlName.setText( BaseMessages.getString( PKG, "SlaveServerDialog.ServerName.Label" ) ); FormData fdlName = new FormData(); fdlName.top = new FormAttachment( 0, 0 ); fdlName.left = new FormAttachment( 0, 0 ); // First one in the left top corner fdlName.right = new FormAttachment( middle, -margin ); wlName.setLayoutData( fdlName ); wName = new Text( wServiceComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wName ); wName.addModifyListener( lsMod ); FormData fdName = new FormData(); fdName.top = new FormAttachment( 0, 0 ); fdName.left = new FormAttachment( middle, 0 ); // To the right of the label fdName.right = new FormAttachment( 95, 0 ); wName.setLayoutData( fdName ); // What's the hostname Label wlHostname = new Label( wServiceComp, SWT.RIGHT ); props.setLook( wlHostname ); wlHostname.setText( BaseMessages.getString( PKG, "SlaveServerDialog.HostIP.Label" ) ); FormData fdlHostname = new FormData(); fdlHostname.top = new FormAttachment( wName, margin * 2 ); fdlHostname.left = new FormAttachment( 0, 0 ); // First one in the left top corner fdlHostname.right = new FormAttachment( middle, -margin ); wlHostname.setLayoutData( fdlHostname ); wHostname = new TextVar( slaveServer, wServiceComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wHostname ); wHostname.addModifyListener( lsMod ); FormData fdHostname = new FormData(); fdHostname.top = new FormAttachment( wName, margin * 2 ); fdHostname.left = new FormAttachment( middle, 0 ); // To the right of the label fdHostname.right = new FormAttachment( 95, 0 ); wHostname.setLayoutData( fdHostname ); // What's the service URL? Label wlPort = new Label( wServiceComp, SWT.RIGHT ); props.setLook( wlPort ); wlPort.setText( BaseMessages.getString( PKG, "SlaveServerDialog.Port.Label" ) ); FormData fdlPort = new FormData(); fdlPort.top = new FormAttachment( wHostname, margin ); fdlPort.left = new FormAttachment( 0, 0 ); // First one in the left top corner fdlPort.right = new FormAttachment( middle, -margin ); wlPort.setLayoutData( fdlPort ); wPort = new TextVar( slaveServer, wServiceComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wPort ); wPort.addModifyListener( lsMod ); FormData fdPort = new FormData(); fdPort.top = new FormAttachment( wHostname, margin ); fdPort.left = new FormAttachment( middle, 0 ); // To the right of the label fdPort.right = new FormAttachment( 95, 0 ); wPort.setLayoutData( fdPort ); // webapp name (optional) Label wlWebAppName = new Label( wServiceComp, SWT.RIGHT ); wlWebAppName.setText( BaseMessages.getString( PKG, "SlaveServerDialog.WebAppName.Label" ) ); props.setLook( wlWebAppName ); FormData fdlWebAppName = new FormData(); fdlWebAppName.top = new FormAttachment( wPort, margin ); fdlWebAppName.left = new FormAttachment( 0, 0 ); fdlWebAppName.right = new FormAttachment( middle, -margin ); wlWebAppName.setLayoutData( fdlWebAppName ); wWebAppName = new TextVar( slaveServer, wServiceComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wWebAppName ); wWebAppName.addModifyListener( lsMod ); FormData fdWebAppName = new FormData(); fdWebAppName.top = new FormAttachment( wPort, margin ); fdWebAppName.left = new FormAttachment( middle, 0 ); fdWebAppName.right = new FormAttachment( 95, 0 ); wWebAppName.setLayoutData( fdWebAppName ); // Username Label wlUsername = new Label( wServiceComp, SWT.RIGHT ); wlUsername.setText( BaseMessages.getString( PKG, "SlaveServerDialog.UserName.Label" ) ); props.setLook( wlUsername ); FormData fdlUsername = new FormData(); fdlUsername.top = new FormAttachment( wWebAppName, margin ); fdlUsername.left = new FormAttachment( 0, 0 ); fdlUsername.right = new FormAttachment( middle, -margin ); wlUsername.setLayoutData( fdlUsername ); wUsername = new TextVar( slaveServer, wServiceComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wUsername ); wUsername.addModifyListener( lsMod ); FormData fdUsername = new FormData(); fdUsername.top = new FormAttachment( wWebAppName, margin ); fdUsername.left = new FormAttachment( middle, 0 ); fdUsername.right = new FormAttachment( 95, 0 ); wUsername.setLayoutData( fdUsername ); // Password Label wlPassword = new Label( wServiceComp, SWT.RIGHT ); wlPassword.setText( BaseMessages.getString( PKG, "SlaveServerDialog.Password.Label" ) ); props.setLook( wlPassword ); FormData fdlPassword = new FormData(); fdlPassword.top = new FormAttachment( wUsername, margin ); fdlPassword.left = new FormAttachment( 0, 0 ); fdlPassword.right = new FormAttachment( middle, -margin ); wlPassword.setLayoutData( fdlPassword ); wPassword = new PasswordTextVar( slaveServer, wServiceComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wPassword ); wPassword.addModifyListener( lsMod ); FormData fdPassword = new FormData(); fdPassword.top = new FormAttachment( wUsername, margin ); fdPassword.left = new FormAttachment( middle, 0 ); fdPassword.right = new FormAttachment( 95, 0 ); wPassword.setLayoutData( fdPassword ); // Master Label wlMaster = new Label( wServiceComp, SWT.RIGHT ); wlMaster.setText( BaseMessages.getString( PKG, "SlaveServerDialog.IsTheMaster.Label" ) ); props.setLook( wlMaster ); FormData fdlMaster = new FormData(); fdlMaster.top = new FormAttachment( wPassword, margin ); fdlMaster.left = new FormAttachment( 0, 0 ); fdlMaster.right = new FormAttachment( middle, -margin ); wlMaster.setLayoutData( fdlMaster ); wMaster = new Button( wServiceComp, SWT.CHECK ); props.setLook( wMaster ); FormData fdMaster = new FormData(); fdMaster.top = new FormAttachment( wPassword, margin ); fdMaster.left = new FormAttachment( middle, 0 ); fdMaster.right = new FormAttachment( 95, 0 ); wMaster.setLayoutData( fdMaster ); // Https Control lastControl = wMaster; Label wlSSL = new Label( wServiceComp, SWT.RIGHT ); wlSSL.setText( BaseMessages.getString( PKG, "SlaveServerDialog.UseSsl.Label" ) ); props.setLook( wlSSL ); FormData fd = new FormData(); fd.top = new FormAttachment( lastControl, margin ); fd.left = new FormAttachment( 0, 0 ); fd.right = new FormAttachment( middle, -margin ); wlSSL.setLayoutData( fd ); wlSSL.setVisible( false ); // future functional wSSL = new Button( wServiceComp, SWT.CHECK ); props.setLook( wSSL ); FormData bfd = new FormData(); bfd.top = new FormAttachment( lastControl, margin ); bfd.left = new FormAttachment( middle, 0 ); bfd.right = new FormAttachment( 95, 0 ); wSSL.setLayoutData( bfd ); wSSL.setVisible( false ); // future functional fdServiceComp = new FormData(); fdServiceComp.left = new FormAttachment( 0, 0 ); fdServiceComp.top = new FormAttachment( 0, 0 ); fdServiceComp.right = new FormAttachment( 100, 0 ); fdServiceComp.bottom = new FormAttachment( 100, 0 ); wServiceComp.setLayoutData( fdServiceComp ); wServiceComp.layout(); wServiceTab.setControl( wServiceComp ); // /////////////////////////////////////////////////////////// // / END OF GEN TAB // /////////////////////////////////////////////////////////// } private void addProxyTab() { // //////////////////////// // START OF POOL TAB/// // / wProxyTab = new CTabItem( wTabFolder, SWT.NONE ); wProxyTab.setText( BaseMessages.getString( PKG, "SlaveServerDialog.USER_TAB_PROXY" ) ); FormLayout poolLayout = new FormLayout(); poolLayout.marginWidth = Const.FORM_MARGIN; poolLayout.marginHeight = Const.FORM_MARGIN; wProxyComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wProxyComp ); wProxyComp.setLayout( poolLayout ); // What's the data tablespace name? Label wlProxyHost = new Label( wProxyComp, SWT.RIGHT ); props.setLook( wlProxyHost ); wlProxyHost.setText( BaseMessages.getString( PKG, "SlaveServerDialog.ProxyServerName.Label" ) ); FormData fdlProxyHost = new FormData(); fdlProxyHost.top = new FormAttachment( 0, 0 ); fdlProxyHost.left = new FormAttachment( 0, 0 ); // First one in the left top corner fdlProxyHost.right = new FormAttachment( middle, -margin ); wlProxyHost.setLayoutData( fdlProxyHost ); wProxyHost = new TextVar( slaveServer, wProxyComp, SWT.BORDER | SWT.LEFT | SWT.SINGLE ); props.setLook( wProxyHost ); wProxyHost.addModifyListener( lsMod ); FormData fdProxyHost = new FormData(); fdProxyHost.top = new FormAttachment( 0, 0 ); fdProxyHost.left = new FormAttachment( middle, 0 ); // To the right of the label fdProxyHost.right = new FormAttachment( 95, 0 ); wProxyHost.setLayoutData( fdProxyHost ); // What's the initial pool size Label wlProxyPort = new Label( wProxyComp, SWT.RIGHT ); props.setLook( wlProxyPort ); wlProxyPort.setText( BaseMessages.getString( PKG, "SlaveServerDialog.ProxyServerPort.Label" ) ); FormData fdlProxyPort = new FormData(); fdlProxyPort.top = new FormAttachment( wProxyHost, margin ); fdlProxyPort.left = new FormAttachment( 0, 0 ); // First one in the left top corner fdlProxyPort.right = new FormAttachment( middle, -margin ); wlProxyPort.setLayoutData( fdlProxyPort ); wProxyPort = new TextVar( slaveServer, wProxyComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wProxyPort ); wProxyPort.addModifyListener( lsMod ); FormData fdProxyPort = new FormData(); fdProxyPort.top = new FormAttachment( wProxyHost, margin ); fdProxyPort.left = new FormAttachment( middle, 0 ); // To the right of the label fdProxyPort.right = new FormAttachment( 95, 0 ); wProxyPort.setLayoutData( fdProxyPort ); // What's the maximum pool size Label wlNonProxyHosts = new Label( wProxyComp, SWT.RIGHT ); props.setLook( wlNonProxyHosts ); wlNonProxyHosts.setText( BaseMessages.getString( PKG, "SlaveServerDialog.IgnoreProxyForHosts.Label" ) ); FormData fdlNonProxyHosts = new FormData(); fdlNonProxyHosts.top = new FormAttachment( wProxyPort, margin ); fdlNonProxyHosts.left = new FormAttachment( 0, 0 ); // First one in the left top corner fdlNonProxyHosts.right = new FormAttachment( middle, -margin ); wlNonProxyHosts.setLayoutData( fdlNonProxyHosts ); wNonProxyHosts = new TextVar( slaveServer, wProxyComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wNonProxyHosts ); wNonProxyHosts.addModifyListener( lsMod ); FormData fdNonProxyHosts = new FormData(); fdNonProxyHosts.top = new FormAttachment( wProxyPort, margin ); fdNonProxyHosts.left = new FormAttachment( middle, 0 ); // To the right of the label fdNonProxyHosts.right = new FormAttachment( 95, 0 ); wNonProxyHosts.setLayoutData( fdNonProxyHosts ); fdProxyComp = new FormData(); fdProxyComp.left = new FormAttachment( 0, 0 ); fdProxyComp.top = new FormAttachment( 0, 0 ); fdProxyComp.right = new FormAttachment( 100, 0 ); fdProxyComp.bottom = new FormAttachment( 100, 0 ); wProxyComp.setLayoutData( fdProxyComp ); wProxyComp.layout(); wProxyTab.setControl( wProxyComp ); } public void dispose() { props.setScreen( new WindowProperty( shell ) ); shell.dispose(); } public void getData() { wName.setText( Const.NVL( slaveServer.getName(), "" ) ); wHostname.setText( Const.NVL( slaveServer.getHostname(), "" ) ); wPort.setText( Const.NVL( slaveServer.getPort(), "" ) ); wWebAppName.setText( Const.NVL( slaveServer.getWebAppName(), "" ) ); wUsername.setText( Const.NVL( slaveServer.getUsername(), "" ) ); wPassword.setText( Const.NVL( slaveServer.getPassword(), "" ) ); wProxyHost.setText( Const.NVL( slaveServer.getProxyHostname(), "" ) ); wProxyPort.setText( Const.NVL( slaveServer.getProxyPort(), "" ) ); wNonProxyHosts.setText( Const.NVL( slaveServer.getNonProxyHosts(), "" ) ); wMaster.setSelection( slaveServer.isMaster() ); wSSL.setSelection( slaveServer.isSslMode() ); wName.setFocus(); } private void cancel() { originalServer = null; dispose(); } public void ok() { getInfo(); if ( !slaveServer.getName().equals( originalServer.getName() ) ) { if ( DialogUtils.objectWithTheSameNameExists( slaveServer, existingServers ) ) { String title = BaseMessages.getString( PKG, "SlaveServerDialog.SlaveServerNameExists.Title" ); String message = BaseMessages.getString( PKG, "SlaveServerDialog.SlaveServerNameExists", slaveServer.getName() ); String okButton = BaseMessages.getString( PKG, "System.Button.OK" ); MessageDialog dialog = new MessageDialog( shell, title, null, message, MessageDialog.ERROR, new String[] { okButton }, 0 ); dialog.open(); return; } } originalServer.setName( slaveServer.getName() ); originalServer.setHostname( slaveServer.getHostname() ); originalServer.setPort( slaveServer.getPort() ); originalServer.setWebAppName( slaveServer.getWebAppName() ); originalServer.setUsername( slaveServer.getUsername() ); originalServer.setPassword( slaveServer.getPassword() ); originalServer.setProxyHostname( slaveServer.getProxyHostname() ); originalServer.setProxyPort( slaveServer.getProxyPort() ); originalServer.setNonProxyHosts( slaveServer.getNonProxyHosts() ); originalServer.setMaster( slaveServer.isMaster() ); originalServer.setSslMode( slaveServer.isSslMode() ); originalServer.setChanged(); ok = true; dispose(); } // Get dialog info in securityService private void getInfo() { slaveServer.setName( wName.getText() ); slaveServer.setHostname( wHostname.getText() ); slaveServer.setPort( wPort.getText() ); slaveServer.setWebAppName( wWebAppName.getText() ); slaveServer.setUsername( wUsername.getText() ); slaveServer.setPassword( wPassword.getText() ); slaveServer.setProxyHostname( wProxyHost.getText() ); slaveServer.setProxyPort( wProxyPort.getText() ); slaveServer.setNonProxyHosts( wNonProxyHosts.getText() ); slaveServer.setMaster( wMaster.getSelection() ); slaveServer.setSslMode( wSSL.getSelection() ); } public void test() { try { getInfo(); String xml = "<sample/>"; String reply = slaveServer.sendXML( xml, RegisterTransServlet.CONTEXT_PATH ); String message = BaseMessages.getString( PKG, "SlaveServer.Replay.Info1" ) + slaveServer.constructUrl( RegisterTransServlet.CONTEXT_PATH ) + Const.CR + BaseMessages.getString( PKG, "SlaveServer.Replay.Info2" ) + Const.CR + Const.CR; message += xml; message += Const.CR + Const.CR; message += "Reply was:" + Const.CR + Const.CR; message += reply + Const.CR; EnterTextDialog dialog = new EnterTextDialog( shell, "XML", BaseMessages.getString( PKG, "SlaveServer.RetournedXMLInfo" ), message ); dialog.open(); } catch ( Exception e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SlaveServer.ExceptionError" ), BaseMessages.getString( PKG, "SlaveServer.ExceptionUnableGetReplay.Error1" ) + slaveServer.getHostname() + BaseMessages.getString( PKG, "SlaveServer.ExceptionUnableGetReplay.Error2" ), e ); } } }