/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2018 by Hitachi Vantara : 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( true );

    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( true );

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