/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 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.trans.steps.http;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.FocusListener;
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.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDialogInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.http.HTTPMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.widget.ColumnInfo;
import org.pentaho.di.ui.core.widget.ComboVar;
import org.pentaho.di.ui.core.widget.PasswordTextVar;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.core.widget.TextVar;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
public class HTTPDialog extends BaseStepDialog implements StepDialogInterface {
private static Class<?> PKG = HTTPMeta.class; // for i18n purposes, needed by Translator2!!
private Label wlUrl;
private TextVar wUrl;
private FormData fdlUrl, fdUrl;
private Label wlResult;
private TextVar wResult;
private FormData fdlResult, fdResult;
private Label wlFields;
private TableView wFields;
private FormData fdlFields, fdFields;
private Label wlHeaders;
private TableView wHeaders;
private FormData fdlHeaders, fdHeaders;
private Label wlUrlInField;
private Button wUrlInField;
private FormData fdlUrlInField, fdUrlInField;
private Label wlUrlField;
private ComboVar wUrlField;
private FormData fdlUrlField, fdUrlField;
private ComboVar wEncoding;
private Button wGet, wGetHeaders;
private Listener lsGet, lsGetHeaders;
private Label wlHttpLogin;
private TextVar wHttpLogin;
private Label wlHttpPassword;
private TextVar wHttpPassword;
private Label wlProxyHost;
private TextVar wProxyHost;
private Label wlProxyPort;
private TextVar wProxyPort;
private CTabFolder wTabFolder;
private CTabItem wGeneralTab, wAdditionalTab;
private FormData fdTabFolder;
private Composite wGeneralComp, wAdditionalComp;
private FormData fdGeneralComp, fdAdditionalComp;
private Label wlResultCode;
private TextVar wResultCode;
private FormData fdlResultCode, fdResultCode;
private Label wlResponseTime;
private TextVar wResponseTime;
private FormData fdlResponseTime, fdResponseTime;
private Label wlResponseHeader;
private TextVar wResponseHeader;
private FormData fdlResponseHeader, fdResponseHeader;
private HTTPMeta input;
private ColumnInfo[] colinf;
private ColumnInfo[] colinfHeaders;
private Map<String, Integer> inputFields;
private boolean gotEncodings = false;
private Label wlConnectionTimeOut;
private TextVar wConnectionTimeOut;
private Label wlSocketTimeOut;
private TextVar wSocketTimeOut;
private Label wlCloseIdleConnectionsTime;
private TextVar wCloseIdleConnectionsTime;
public HTTPDialog( Shell parent, Object in, TransMeta transMeta, String sname ) {
super( parent, (BaseStepMeta) in, transMeta, sname );
input = (HTTPMeta) in;
inputFields = new HashMap<String, Integer>();
}
public String open() {
Shell parent = getParent();
Display display = parent.getDisplay();
shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
props.setLook( shell );
setShellImage( shell, input );
ModifyListener lsMod = new ModifyListener() {
public void modifyText( ModifyEvent e ) {
input.setChanged();
}
};
changed = input.hasChanged();
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout( formLayout );
shell.setText( BaseMessages.getString( PKG, "HTTPDialog.Shell.Title" ) );
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
// Stepname line
//
wlStepname = new Label( shell, SWT.RIGHT );
wlStepname.setText( BaseMessages.getString( PKG, "HTTPDialog.Stepname.Label" ) );
props.setLook( wlStepname );
fdlStepname = new FormData();
fdlStepname.left = new FormAttachment( 0, 0 );
fdlStepname.right = new FormAttachment( middle, -margin );
fdlStepname.top = new FormAttachment( 0, margin );
wlStepname.setLayoutData( fdlStepname );
wStepname = new Text( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wStepname.setText( stepname );
props.setLook( wStepname );
wStepname.addModifyListener( lsMod );
fdStepname = new FormData();
fdStepname.left = new FormAttachment( middle, 0 );
fdStepname.top = new FormAttachment( 0, margin );
fdStepname.right = new FormAttachment( 100, 0 );
wStepname.setLayoutData( fdStepname );
Control lastControl = wStepname;
wTabFolder = new CTabFolder( shell, SWT.BORDER );
props.setLook( wTabFolder, PropsUI.WIDGET_STYLE_TAB );
// ////////////////////////
// START OF GENERAL TAB ///
// ////////////////////////
wGeneralTab = new CTabItem( wTabFolder, SWT.NONE );
wGeneralTab.setText( BaseMessages.getString( PKG, "HTTPDialog.GeneralTab.Title" ) );
wGeneralComp = new Composite( wTabFolder, SWT.NONE );
props.setLook( wGeneralComp );
FormLayout fileLayout = new FormLayout();
fileLayout.marginWidth = 3;
fileLayout.marginHeight = 3;
wGeneralComp.setLayout( fileLayout );
// ////////////////////////
// START Settings GROUP
Group gSettings = new Group( wGeneralComp, SWT.SHADOW_ETCHED_IN );
gSettings.setText( BaseMessages.getString( PKG, "HTTPDialog.SettingsGroup.Label" ) );
FormLayout SettingsLayout = new FormLayout();
SettingsLayout.marginWidth = 3;
SettingsLayout.marginHeight = 3;
gSettings.setLayout( SettingsLayout );
props.setLook( gSettings );
// The URL to use
//
wlUrl = new Label( gSettings, SWT.RIGHT );
wlUrl.setText( BaseMessages.getString( PKG, "HTTPDialog.URL.Label" ) );
props.setLook( wlUrl );
fdlUrl = new FormData();
fdlUrl.left = new FormAttachment( 0, 0 );
fdlUrl.right = new FormAttachment( middle, -margin );
fdlUrl.top = new FormAttachment( lastControl, margin );
wlUrl.setLayoutData( fdlUrl );
wUrl = new TextVar( transMeta, gSettings, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wUrl );
wUrl.addModifyListener( lsMod );
fdUrl = new FormData();
fdUrl.left = new FormAttachment( middle, 0 );
fdUrl.top = new FormAttachment( lastControl, margin );
fdUrl.right = new FormAttachment( 100, 0 );
wUrl.setLayoutData( fdUrl );
lastControl = wUrl;
// UrlInField line
//
wlUrlInField = new Label( gSettings, SWT.RIGHT );
wlUrlInField.setText( BaseMessages.getString( PKG, "HTTPDialog.UrlInField.Label" ) );
props.setLook( wlUrlInField );
fdlUrlInField = new FormData();
fdlUrlInField.left = new FormAttachment( 0, 0 );
fdlUrlInField.top = new FormAttachment( lastControl, margin );
fdlUrlInField.right = new FormAttachment( middle, -margin );
wlUrlInField.setLayoutData( fdlUrlInField );
wUrlInField = new Button( gSettings, SWT.CHECK );
props.setLook( wUrlInField );
fdUrlInField = new FormData();
fdUrlInField.left = new FormAttachment( middle, 0 );
fdUrlInField.top = new FormAttachment( lastControl, margin );
fdUrlInField.right = new FormAttachment( 100, 0 );
wUrlInField.setLayoutData( fdUrlInField );
wUrlInField.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
input.setChanged();
activeUrlInfield();
}
} );
lastControl = wUrlInField;
// UrlField Line
//
wlUrlField = new Label( gSettings, SWT.RIGHT );
wlUrlField.setText( BaseMessages.getString( PKG, "HTTPDialog.UrlField.Label" ) );
props.setLook( wlUrlField );
fdlUrlField = new FormData();
fdlUrlField.left = new FormAttachment( 0, 0 );
fdlUrlField.right = new FormAttachment( middle, -margin );
fdlUrlField.top = new FormAttachment( lastControl, margin );
wlUrlField.setLayoutData( fdlUrlField );
wUrlField = new ComboVar( transMeta, gSettings, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wUrlField.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.UrlField.Tooltip" ) );
props.setLook( wUrlField );
wUrlField.addModifyListener( lsMod );
fdUrlField = new FormData();
fdUrlField.left = new FormAttachment( middle, 0 );
fdUrlField.top = new FormAttachment( lastControl, margin );
fdUrlField.right = new FormAttachment( 100, 0 );
wUrlField.setLayoutData( fdUrlField );
wUrlField.setEnabled( false );
wUrlField.addFocusListener( new FocusListener() {
public void focusLost( org.eclipse.swt.events.FocusEvent e ) {
}
public void focusGained( org.eclipse.swt.events.FocusEvent e ) {
Cursor busy = new Cursor( shell.getDisplay(), SWT.CURSOR_WAIT );
shell.setCursor( busy );
BaseStepDialog.getFieldsFromPrevious( wUrlField, transMeta, stepMeta );
shell.setCursor( null );
busy.dispose();
}
} );
lastControl = wUrlField;
// Encoding
//
Label wlEncoding = new Label( gSettings, SWT.RIGHT );
wlEncoding.setText( BaseMessages.getString( PKG, "HTTPDialog.Encoding.Label" ) );
props.setLook( wlEncoding );
FormData fdlEncoding = new FormData();
fdlEncoding.top = new FormAttachment( lastControl, margin );
fdlEncoding.left = new FormAttachment( 0, 0 );
fdlEncoding.right = new FormAttachment( middle, -margin );
wlEncoding.setLayoutData( fdlEncoding );
wEncoding = new ComboVar( transMeta, gSettings, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wEncoding );
wEncoding.addModifyListener( lsMod );
FormData fdEncoding = new FormData();
fdEncoding.top = new FormAttachment( lastControl, margin );
fdEncoding.left = new FormAttachment( middle, 0 );
fdEncoding.right = new FormAttachment( 100, 0 );
wEncoding.setLayoutData( fdEncoding );
lastControl = wEncoding;
wEncoding.addFocusListener( new FocusListener() {
public void focusLost( org.eclipse.swt.events.FocusEvent e ) {
}
public void focusGained( org.eclipse.swt.events.FocusEvent e ) {
Cursor busy = new Cursor( shell.getDisplay(), SWT.CURSOR_WAIT );
shell.setCursor( busy );
setEncodings();
shell.setCursor( null );
busy.dispose();
}
} );
wlConnectionTimeOut = new Label( gSettings, SWT.RIGHT );
wlConnectionTimeOut.setText( BaseMessages.getString( PKG, "HTTPDialog.ConnectionTimeOut.Label" ) );
props.setLook( wlConnectionTimeOut );
FormData fdlConnectionTimeOut = new FormData();
fdlConnectionTimeOut.top = new FormAttachment( wEncoding, margin );
fdlConnectionTimeOut.left = new FormAttachment( 0, 0 );
fdlConnectionTimeOut.right = new FormAttachment( middle, -margin );
wlConnectionTimeOut.setLayoutData( fdlConnectionTimeOut );
wConnectionTimeOut = new TextVar( transMeta, gSettings, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wConnectionTimeOut.addModifyListener( lsMod );
wConnectionTimeOut.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.ConnectionTimeOut.Tooltip" ) );
props.setLook( wConnectionTimeOut );
FormData fdConnectionTimeOut = new FormData();
fdConnectionTimeOut.top = new FormAttachment( wEncoding, margin );
fdConnectionTimeOut.left = new FormAttachment( middle, 0 );
fdConnectionTimeOut.right = new FormAttachment( 100, 0 );
wConnectionTimeOut.setLayoutData( fdConnectionTimeOut );
wlSocketTimeOut = new Label( gSettings, SWT.RIGHT );
wlSocketTimeOut.setText( BaseMessages.getString( PKG, "HTTPDialog.SocketTimeOut.Label" ) );
props.setLook( wlSocketTimeOut );
FormData fdlSocketTimeOut = new FormData();
fdlSocketTimeOut.top = new FormAttachment( wConnectionTimeOut, margin );
fdlSocketTimeOut.left = new FormAttachment( 0, 0 );
fdlSocketTimeOut.right = new FormAttachment( middle, -margin );
wlSocketTimeOut.setLayoutData( fdlSocketTimeOut );
wSocketTimeOut = new TextVar( transMeta, gSettings, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wSocketTimeOut.addModifyListener( lsMod );
wSocketTimeOut.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.SocketTimeOut.Tooltip" ) );
props.setLook( wSocketTimeOut );
FormData fdSocketTimeOut = new FormData();
fdSocketTimeOut.top = new FormAttachment( wConnectionTimeOut, margin );
fdSocketTimeOut.left = new FormAttachment( middle, 0 );
fdSocketTimeOut.right = new FormAttachment( 100, 0 );
wSocketTimeOut.setLayoutData( fdSocketTimeOut );
wlCloseIdleConnectionsTime = new Label( gSettings, SWT.RIGHT );
wlCloseIdleConnectionsTime
.setText( BaseMessages.getString( PKG, "HTTPDialog.CloseIdleConnectionsTime.Label" ) );
props.setLook( wlCloseIdleConnectionsTime );
FormData fdlCloseIdleConnectionsTime = new FormData();
fdlCloseIdleConnectionsTime.top = new FormAttachment( wSocketTimeOut, margin );
fdlCloseIdleConnectionsTime.left = new FormAttachment( 0, 0 );
fdlCloseIdleConnectionsTime.right = new FormAttachment( middle, -margin );
wlCloseIdleConnectionsTime.setLayoutData( fdlCloseIdleConnectionsTime );
wCloseIdleConnectionsTime = new TextVar( transMeta, gSettings, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wCloseIdleConnectionsTime.addModifyListener( lsMod );
wCloseIdleConnectionsTime.setToolTipText( BaseMessages.getString(
PKG, "HTTPDialog.CloseIdleConnectionsTime.Tooltip" ) );
props.setLook( wCloseIdleConnectionsTime );
FormData fdCloseIdleConnectionsTime = new FormData();
fdCloseIdleConnectionsTime.top = new FormAttachment( wSocketTimeOut, margin );
fdCloseIdleConnectionsTime.left = new FormAttachment( middle, 0 );
fdCloseIdleConnectionsTime.right = new FormAttachment( 100, 0 );
wCloseIdleConnectionsTime.setLayoutData( fdCloseIdleConnectionsTime );
FormData fdSettings = new FormData();
fdSettings.left = new FormAttachment( 0, 0 );
fdSettings.right = new FormAttachment( 100, 0 );
fdSettings.top = new FormAttachment( lastControl, margin );
gSettings.setLayoutData( fdSettings );
// END Output Settings GROUP
// ////////////////////////
lastControl = gSettings;
// ////////////////////////
// START Output Fields GROUP
Group gOutputFields = new Group( wGeneralComp, SWT.SHADOW_ETCHED_IN );
gOutputFields.setText( BaseMessages.getString( PKG, "HTTPDialog.OutputFieldsGroup.Label" ) );
FormLayout OutputFieldsLayout = new FormLayout();
OutputFieldsLayout.marginWidth = 3;
OutputFieldsLayout.marginHeight = 3;
gOutputFields.setLayout( OutputFieldsLayout );
props.setLook( gOutputFields );
// Result line...
//
wlResult = new Label( gOutputFields, SWT.RIGHT );
wlResult.setText( BaseMessages.getString( PKG, "HTTPDialog.Result.Label" ) );
props.setLook( wlResult );
fdlResult = new FormData();
fdlResult.left = new FormAttachment( 0, 0 );
fdlResult.right = new FormAttachment( middle, -margin );
fdlResult.top = new FormAttachment( lastControl, margin );
wlResult.setLayoutData( fdlResult );
wResult = new TextVar( transMeta, gOutputFields, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wResult );
wResult.addModifyListener( lsMod );
fdResult = new FormData();
fdResult.left = new FormAttachment( middle, 0 );
fdResult.top = new FormAttachment( lastControl, margin );
fdResult.right = new FormAttachment( 100, 0 );
wResult.setLayoutData( fdResult );
// Resultcode line...
wlResultCode = new Label( gOutputFields, SWT.RIGHT );
wlResultCode.setText( BaseMessages.getString( PKG, "HTTPDialog.ResultCode.Label" ) );
props.setLook( wlResultCode );
fdlResultCode = new FormData();
fdlResultCode.left = new FormAttachment( 0, 0 );
fdlResultCode.right = new FormAttachment( middle, -margin );
fdlResultCode.top = new FormAttachment( wResult, margin );
wlResultCode.setLayoutData( fdlResultCode );
wResultCode = new TextVar( transMeta, gOutputFields, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wResultCode );
wResultCode.addModifyListener( lsMod );
fdResultCode = new FormData();
fdResultCode.left = new FormAttachment( middle, 0 );
fdResultCode.top = new FormAttachment( wResult, margin );
fdResultCode.right = new FormAttachment( 100, 0 );
wResultCode.setLayoutData( fdResultCode );
// Response time line...
wlResponseTime = new Label( gOutputFields, SWT.RIGHT );
wlResponseTime.setText( BaseMessages.getString( PKG, "HTTPDialog.ResponseTime.Label" ) );
props.setLook( wlResponseTime );
fdlResponseTime = new FormData();
fdlResponseTime.left = new FormAttachment( 0, 0 );
fdlResponseTime.right = new FormAttachment( middle, -margin );
fdlResponseTime.top = new FormAttachment( wResultCode, margin );
wlResponseTime.setLayoutData( fdlResponseTime );
wResponseTime = new TextVar( transMeta, gOutputFields, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wResponseTime );
wResponseTime.addModifyListener( lsMod );
fdResponseTime = new FormData();
fdResponseTime.left = new FormAttachment( middle, 0 );
fdResponseTime.top = new FormAttachment( wResultCode, margin );
fdResponseTime.right = new FormAttachment( 100, 0 );
wResponseTime.setLayoutData( fdResponseTime );
// Response header line...
wlResponseHeader = new Label( gOutputFields, SWT.RIGHT );
wlResponseHeader.setText( BaseMessages.getString( PKG, "HTTPDialog.ResponseHeader.Label" ) );
props.setLook( wlResponseHeader );
fdlResponseHeader = new FormData();
fdlResponseHeader.left = new FormAttachment( 0, 0 );
fdlResponseHeader.right = new FormAttachment( middle, -margin );
fdlResponseHeader.top = new FormAttachment( wResponseTime, margin );
wlResponseHeader.setLayoutData( fdlResponseHeader );
wResponseHeader = new TextVar( transMeta, gOutputFields, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wResponseHeader );
wResponseHeader.addModifyListener( lsMod );
fdResponseHeader = new FormData();
fdResponseHeader.left = new FormAttachment( middle, 0 );
fdResponseHeader.top = new FormAttachment( wResponseTime, margin );
fdResponseHeader.right = new FormAttachment( 100, 0 );
wResponseHeader.setLayoutData( fdResponseHeader );
FormData fdOutputFields = new FormData();
fdOutputFields.left = new FormAttachment( 0, 0 );
fdOutputFields.right = new FormAttachment( 100, 0 );
fdOutputFields.top = new FormAttachment( lastControl, margin );
gOutputFields.setLayoutData( fdOutputFields );
// END Output Fields GROUP
// ////////////////////////
lastControl = gOutputFields;
// ////////////////////////
// START HTTP AUTH GROUP
Group gHttpAuth = new Group( wGeneralComp, SWT.SHADOW_ETCHED_IN );
gHttpAuth.setText( BaseMessages.getString( PKG, "HTTPDialog.HttpAuthGroup.Label" ) );
FormLayout httpAuthLayout = new FormLayout();
httpAuthLayout.marginWidth = 3;
httpAuthLayout.marginHeight = 3;
gHttpAuth.setLayout( httpAuthLayout );
props.setLook( gHttpAuth );
// HTTP Login
wlHttpLogin = new Label( gHttpAuth, SWT.RIGHT );
wlHttpLogin.setText( BaseMessages.getString( PKG, "HTTPDialog.HttpLogin.Label" ) );
props.setLook( wlHttpLogin );
FormData fdlHttpLogin = new FormData();
fdlHttpLogin.top = new FormAttachment( 0, margin );
fdlHttpLogin.left = new FormAttachment( 0, 0 );
fdlHttpLogin.right = new FormAttachment( middle, -margin );
wlHttpLogin.setLayoutData( fdlHttpLogin );
wHttpLogin = new TextVar( transMeta, gHttpAuth, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wHttpLogin.addModifyListener( lsMod );
wHttpLogin.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.HttpLogin.Tooltip" ) );
props.setLook( wHttpLogin );
FormData fdHttpLogin = new FormData();
fdHttpLogin.top = new FormAttachment( 0, margin );
fdHttpLogin.left = new FormAttachment( middle, 0 );
fdHttpLogin.right = new FormAttachment( 100, 0 );
wHttpLogin.setLayoutData( fdHttpLogin );
// HTTP Password
wlHttpPassword = new Label( gHttpAuth, SWT.RIGHT );
wlHttpPassword.setText( BaseMessages.getString( PKG, "HTTPDialog.HttpPassword.Label" ) );
props.setLook( wlHttpPassword );
FormData fdlHttpPassword = new FormData();
fdlHttpPassword.top = new FormAttachment( wHttpLogin, margin );
fdlHttpPassword.left = new FormAttachment( 0, 0 );
fdlHttpPassword.right = new FormAttachment( middle, -margin );
wlHttpPassword.setLayoutData( fdlHttpPassword );
wHttpPassword = new PasswordTextVar( transMeta, gHttpAuth, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wHttpPassword.addModifyListener( lsMod );
wHttpPassword.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.HttpPassword.Tooltip" ) );
props.setLook( wHttpPassword );
FormData fdHttpPassword = new FormData();
fdHttpPassword.top = new FormAttachment( wHttpLogin, margin );
fdHttpPassword.left = new FormAttachment( middle, 0 );
fdHttpPassword.right = new FormAttachment( 100, 0 );
wHttpPassword.setLayoutData( fdHttpPassword );
FormData fdHttpAuth = new FormData();
fdHttpAuth.left = new FormAttachment( 0, 0 );
fdHttpAuth.right = new FormAttachment( 100, 0 );
fdHttpAuth.top = new FormAttachment( lastControl, margin );
gHttpAuth.setLayoutData( fdHttpAuth );
// END HTTP AUTH GROUP
// ////////////////////////
lastControl = gHttpAuth;
// ////////////////////////
// START PROXY GROUP
Group gProxy = new Group( wGeneralComp, SWT.SHADOW_ETCHED_IN );
gProxy.setText( BaseMessages.getString( PKG, "HTTPDialog.ProxyGroup.Label" ) );
FormLayout proxyLayout = new FormLayout();
proxyLayout.marginWidth = 3;
proxyLayout.marginHeight = 3;
gProxy.setLayout( proxyLayout );
props.setLook( gProxy );
// HTTP Login
wlProxyHost = new Label( gProxy, SWT.RIGHT );
wlProxyHost.setText( BaseMessages.getString( PKG, "HTTPDialog.ProxyHost.Label" ) );
props.setLook( wlProxyHost );
FormData fdlProxyHost = new FormData();
fdlProxyHost.top = new FormAttachment( 0, margin );
fdlProxyHost.left = new FormAttachment( 0, 0 );
fdlProxyHost.right = new FormAttachment( middle, -margin );
wlProxyHost.setLayoutData( fdlProxyHost );
wProxyHost = new TextVar( transMeta, gProxy, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wProxyHost.addModifyListener( lsMod );
wProxyHost.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.ProxyHost.Tooltip" ) );
props.setLook( wProxyHost );
FormData fdProxyHost = new FormData();
fdProxyHost.top = new FormAttachment( 0, margin );
fdProxyHost.left = new FormAttachment( middle, 0 );
fdProxyHost.right = new FormAttachment( 100, 0 );
wProxyHost.setLayoutData( fdProxyHost );
// HTTP Password
wlProxyPort = new Label( gProxy, SWT.RIGHT );
wlProxyPort.setText( BaseMessages.getString( PKG, "HTTPDialog.ProxyPort.Label" ) );
props.setLook( wlProxyPort );
FormData fdlProxyPort = new FormData();
fdlProxyPort.top = new FormAttachment( wProxyHost, margin );
fdlProxyPort.left = new FormAttachment( 0, 0 );
fdlProxyPort.right = new FormAttachment( middle, -margin );
wlProxyPort.setLayoutData( fdlProxyPort );
wProxyPort = new TextVar( transMeta, gProxy, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
wProxyPort.addModifyListener( lsMod );
wProxyPort.setToolTipText( BaseMessages.getString( PKG, "HTTPDialog.ProxyPort.Tooltip" ) );
props.setLook( wProxyPort );
FormData fdProxyPort = new FormData();
fdProxyPort.top = new FormAttachment( wProxyHost, margin );
fdProxyPort.left = new FormAttachment( middle, 0 );
fdProxyPort.right = new FormAttachment( 100, 0 );
wProxyPort.setLayoutData( fdProxyPort );
FormData fdProxy = new FormData();
fdProxy.left = new FormAttachment( 0, 0 );
fdProxy.right = new FormAttachment( 100, 0 );
fdProxy.top = new FormAttachment( lastControl, margin );
gProxy.setLayoutData( fdProxy );
// END HTTP Proxy GROUP
// ////////////////////////
lastControl = gProxy;
fdGeneralComp = new FormData();
fdGeneralComp.left = new FormAttachment( 0, 0 );
fdGeneralComp.top = new FormAttachment( wStepname, margin );
fdGeneralComp.right = new FormAttachment( 100, 0 );
fdGeneralComp.bottom = new FormAttachment( 100, 0 );
wGeneralComp.setLayoutData( fdGeneralComp );
wGeneralComp.layout();
wGeneralTab.setControl( wGeneralComp );
// ///////////////////////////////////////////////////////////
// / END OF GENERAL TAB
// ///////////////////////////////////////////////////////////
// Additional tab...
//
wAdditionalTab = new CTabItem( wTabFolder, SWT.NONE );
wAdditionalTab.setText( BaseMessages.getString( PKG, "HTTPDialog.FieldsTab.Title" ) );
FormLayout addLayout = new FormLayout();
addLayout.marginWidth = Const.FORM_MARGIN;
addLayout.marginHeight = Const.FORM_MARGIN;
wAdditionalComp = new Composite( wTabFolder, SWT.NONE );
wAdditionalComp.setLayout( addLayout );
props.setLook( wAdditionalComp );
wlFields = new Label( wAdditionalComp, SWT.NONE );
wlFields.setText( BaseMessages.getString( PKG, "HTTPDialog.Parameters.Label" ) );
props.setLook( wlFields );
fdlFields = new FormData();
fdlFields.left = new FormAttachment( 0, 0 );
fdlFields.top = new FormAttachment( lastControl, margin );
wlFields.setLayoutData( fdlFields );
lastControl = wlFields;
wGet = new Button( wAdditionalComp, SWT.PUSH );
wGet.setText( BaseMessages.getString( PKG, "HTTPDialog.GetFields.Button" ) );
FormData fdGet = new FormData();
fdGet.top = new FormAttachment( wlFields, margin );
fdGet.right = new FormAttachment( 100, 0 );
wGet.setLayoutData( fdGet );
final int FieldsRows = input.getArgumentField().length;
colinf =
new ColumnInfo[] {
new ColumnInfo(
BaseMessages.getString( PKG, "HTTPDialog.ColumnInfo.Name" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
new String[] { "" }, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "HTTPDialog.ColumnInfo.Parameter" ), ColumnInfo.COLUMN_TYPE_TEXT,
false ), };
wFields =
new TableView(
transMeta, wAdditionalComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colinf, FieldsRows, lsMod,
props );
fdFields = new FormData();
fdFields.left = new FormAttachment( 0, 0 );
fdFields.top = new FormAttachment( wlFields, margin );
fdFields.right = new FormAttachment( wGet, -margin );
fdFields.bottom = new FormAttachment( wlFields, 200 );
wFields.setLayoutData( fdFields );
wlHeaders = new Label( wAdditionalComp, SWT.NONE );
wlHeaders.setText( BaseMessages.getString( PKG, "HTTPDialog.Headers.Label" ) );
props.setLook( wlHeaders );
fdlHeaders = new FormData();
fdlHeaders.left = new FormAttachment( 0, 0 );
fdlHeaders.top = new FormAttachment( wFields, margin );
wlHeaders.setLayoutData( fdlHeaders );
final int HeadersRows = input.getHeaderParameter().length;
colinfHeaders =
new ColumnInfo[] {
new ColumnInfo(
BaseMessages.getString( PKG, "HTTPDialog.ColumnInfo.Field" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
new String[] { "" }, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "HTTPDialog.ColumnInfo.Header" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), };
colinfHeaders[1].setUsingVariables( true );
wHeaders =
new TableView(
transMeta, wAdditionalComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colinfHeaders, HeadersRows,
lsMod, props );
wGetHeaders = new Button( wAdditionalComp, SWT.PUSH );
wGetHeaders.setText( BaseMessages.getString( PKG, "HTTPDialog.GetHeaders.Button" ) );
FormData fdGetHeaders = new FormData();
fdGetHeaders.top = new FormAttachment( wlHeaders, margin );
fdGetHeaders.right = new FormAttachment( 100, 0 );
wGetHeaders.setLayoutData( fdGetHeaders );
fdHeaders = new FormData();
fdHeaders.left = new FormAttachment( 0, 0 );
fdHeaders.top = new FormAttachment( wlHeaders, margin );
fdHeaders.right = new FormAttachment( wGetHeaders, -margin );
fdHeaders.bottom = new FormAttachment( 100, -margin );
wHeaders.setLayoutData( fdHeaders );
//
// Search the fields in the background
final Runnable runnable = new Runnable() {
public void run() {
StepMeta stepMeta = transMeta.findStep( stepname );
if ( stepMeta != null ) {
try {
RowMetaInterface row = transMeta.getPrevStepFields( stepMeta );
// Remember these fields...
for ( int i = 0; i < row.size(); i++ ) {
inputFields.put( row.getValueMeta( i ).getName(), Integer.valueOf( i ) );
}
setComboBoxes();
} catch ( KettleException e ) {
logError( BaseMessages.getString( PKG, "System.Dialog.GetFieldsFailed.Message" ) );
}
}
}
};
new Thread( runnable ).start();
fdAdditionalComp = new FormData();
fdAdditionalComp.left = new FormAttachment( 0, 0 );
fdAdditionalComp.top = new FormAttachment( wStepname, margin );
fdAdditionalComp.right = new FormAttachment( 100, 0 );
fdAdditionalComp.bottom = new FormAttachment( 100, 0 );
wAdditionalComp.setLayoutData( fdAdditionalComp );
wAdditionalComp.layout();
wAdditionalTab.setControl( wAdditionalComp );
// ////// END of Additional Tab
fdTabFolder = new FormData();
fdTabFolder.left = new FormAttachment( 0, 0 );
fdTabFolder.top = new FormAttachment( wStepname, margin );
fdTabFolder.right = new FormAttachment( 100, 0 );
fdTabFolder.bottom = new FormAttachment( 100, -50 );
wTabFolder.setLayoutData( fdTabFolder );
// THE 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" ) );
setButtonPositions( new Button[] { wOK, wCancel }, margin, wTabFolder );
// Add listeners
lsOK = new Listener() {
public void handleEvent( Event e ) {
ok();
}
};
lsGet = new Listener() {
public void handleEvent( Event e ) {
get();
}
};
lsCancel = new Listener() {
public void handleEvent( Event e ) {
cancel();
}
};
lsGetHeaders = new Listener() {
public void handleEvent( Event e ) {
getHeadersFields();
}
};
wOK.addListener( SWT.Selection, lsOK );
wGet.addListener( SWT.Selection, lsGet );
wCancel.addListener( SWT.Selection, lsCancel );
wGetHeaders.addListener( SWT.Selection, lsGetHeaders );
lsDef = new SelectionAdapter() {
public void widgetDefaultSelected( SelectionEvent e ) {
ok();
}
};
wStepname.addSelectionListener( lsDef );
wUrl.addSelectionListener( lsDef );
wResult.addSelectionListener( lsDef );
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener( new ShellAdapter() {
public void shellClosed( ShellEvent e ) {
cancel();
}
} );
lsResize = new Listener() {
public void handleEvent( Event event ) {
Point size = shell.getSize();
wFields.setSize( size.x - 10, size.y - 50 );
wFields.table.setSize( size.x - 10, size.y - 50 );
wFields.redraw();
}
};
shell.addListener( SWT.Resize, lsResize );
// Set the shell size, based upon previous time...
setSize();
getData();
wTabFolder.setSelection( 0 );
activeUrlInfield();
input.setChanged( changed );
shell.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
return stepname;
}
private void setEncodings() {
// Encoding of the text file:
if ( !gotEncodings ) {
gotEncodings = true;
wEncoding.removeAll();
List<Charset> values = new ArrayList<Charset>( Charset.availableCharsets().values() );
for ( int i = 0; i < values.size(); i++ ) {
Charset charSet = values.get( i );
wEncoding.add( charSet.displayName() );
}
// Now select the default!
String defEncoding = Const.getEnvironmentVariable( "file.encoding", "UTF-8" );
int idx = Const.indexOfString( defEncoding, wEncoding.getItems() );
if ( idx >= 0 ) {
wEncoding.select( idx );
}
}
}
protected void setComboBoxes() {
// Something was changed in the row.
//
final Map<String, Integer> fields = new HashMap<String, Integer>();
// Add the currentMeta fields...
fields.putAll( inputFields );
Set<String> keySet = fields.keySet();
List<String> entries = new ArrayList<String>( keySet );
String[] fieldNames = entries.toArray( new String[entries.size()] );
Const.sortStrings( fieldNames );
colinf[0].setComboValues( fieldNames );
colinfHeaders[0].setComboValues( fieldNames );
}
private void activeUrlInfield() {
wlUrlField.setEnabled( wUrlInField.getSelection() );
wUrlField.setEnabled( wUrlInField.getSelection() );
wlUrl.setEnabled( !wUrlInField.getSelection() );
wUrl.setEnabled( !wUrlInField.getSelection() );
}
/**
* Copy information from the meta-data input to the dialog fields.
*/
public void getData() {
if ( isDebug() ) {
logDebug( BaseMessages.getString( PKG, "HTTPDialog.Log.GettingKeyInfo" ) );
}
if ( input.getArgumentField() != null ) {
for ( int i = 0; i < input.getArgumentField().length; i++ ) {
TableItem item = wFields.table.getItem( i );
item.setText( 1, Const.NVL( input.getArgumentField()[i], "" ) );
item.setText( 2, Const.NVL( input.getArgumentParameter()[i], "" ) );
}
}
if ( input.getHeaderField() != null ) {
for ( int i = 0; i < input.getHeaderField().length; i++ ) {
TableItem item = wHeaders.table.getItem( i );
if ( input.getHeaderField()[i] != null ) {
item.setText( 1, input.getHeaderField()[i] );
}
if ( input.getHeaderParameter()[i] != null ) {
item.setText( 2, input.getHeaderParameter()[i] );
}
}
}
wSocketTimeOut.setText( Const.NVL( input.getSocketTimeout(), "" ) );
wConnectionTimeOut.setText( Const.NVL( input.getConnectionTimeout(), "" ) );
wCloseIdleConnectionsTime.setText( Const.NVL( input.getCloseIdleConnectionsTime(), "" ) );
wUrl.setText( Const.NVL( input.getUrl(), "" ) );
wUrlInField.setSelection( input.isUrlInField() );
wUrlField.setText( Const.NVL( input.getUrlField(), "" ) );
wEncoding.setText( Const.NVL( input.getEncoding(), "" ) );
wResult.setText( Const.NVL( input.getFieldName(), "" ) );
if ( input.getHttpLogin() != null ) {
wHttpLogin.setText( input.getHttpLogin() );
}
if ( input.getHttpPassword() != null ) {
wHttpPassword.setText( input.getHttpPassword() );
}
if ( input.getProxyHost() != null ) {
wProxyHost.setText( input.getProxyHost() );
}
if ( input.getProxyPort() != null ) {
wProxyPort.setText( input.getProxyPort() );
}
if ( input.getResultCodeFieldName() != null ) {
wResultCode.setText( input.getResultCodeFieldName() );
}
if ( input.getResponseTimeFieldName() != null ) {
wResponseTime.setText( input.getResponseTimeFieldName() );
}
if ( input.getResponseHeaderFieldName() != null ) {
wResponseHeader.setText( input.getResponseHeaderFieldName() );
}
wFields.setRowNums();
wFields.optWidth( true );
wHeaders.setRowNums();
wHeaders.optWidth( true );
wStepname.selectAll();
wStepname.setFocus();
}
private void cancel() {
stepname = null;
input.setChanged( changed );
dispose();
}
private void ok() {
if ( Utils.isEmpty( wStepname.getText() ) ) {
return;
}
int nrargs = wFields.nrNonEmpty();
int nrheaders = wHeaders.nrNonEmpty();
input.allocate( nrargs, nrheaders );
if ( isDebug() ) {
logDebug( BaseMessages.getString( PKG, "HTTPDialog.Log.FoundArguments", String.valueOf( nrargs ) ) );
}
//CHECKSTYLE:Indentation:OFF
for ( int i = 0; i < nrargs; i++ ) {
TableItem item = wFields.getNonEmpty( i );
input.getArgumentField()[i] = item.getText( 1 );
input.getArgumentParameter()[i] = item.getText( 2 );
}
if ( log.isDebug() ) {
logDebug( BaseMessages.getString( PKG, "HTTPDialog.Log.FoundHeaders", String.valueOf( nrheaders ) ) );
}
//CHECKSTYLE:Indentation:OFF
for ( int i = 0; i < nrheaders; i++ ) {
TableItem item = wHeaders.getNonEmpty( i );
input.getHeaderField()[i] = item.getText( 1 );
input.getHeaderParameter()[i] = item.getText( 2 );
}
input.setUrl( wUrl.getText() );
input.setUrlField( wUrlField.getText() );
input.setUrlInField( wUrlInField.getSelection() );
input.setFieldName( wResult.getText() );
input.setEncoding( wEncoding.getText() );
input.setHttpLogin( wHttpLogin.getText() );
input.setHttpPassword( wHttpPassword.getText() );
input.setProxyHost( wProxyHost.getText() );
input.setProxyPort( wProxyPort.getText() );
input.setResultCodeFieldName( wResultCode.getText() );
input.setResponseTimeFieldName( wResponseTime.getText() );
input.setResponseHeaderFieldName( wResponseHeader.getText() );
input.setSocketTimeout( wSocketTimeOut.getText() );
input.setConnectionTimeout( wConnectionTimeOut.getText() );
input.setCloseIdleConnectionsTime( wCloseIdleConnectionsTime.getText() );
stepname = wStepname.getText(); // return value
dispose();
}
private void get() {
try {
RowMetaInterface r = transMeta.getPrevStepFields( stepname );
if ( r != null && !r.isEmpty() ) {
BaseStepDialog.getFieldsFromPrevious( r, wFields, 1, new int[] { 1, 2 }, new int[] { 3 }, -1, -1, null );
}
} catch ( KettleException ke ) {
new ErrorDialog(
shell, BaseMessages.getString( PKG, "HTTPDialog.FailedToGetFields.DialogTitle" ), BaseMessages
.getString( PKG, "HTTPDialog.FailedToGetFields.DialogMessage" ), ke );
}
}
private void getHeadersFields() {
try {
RowMetaInterface r = transMeta.getPrevStepFields( stepname );
if ( r != null && !r.isEmpty() ) {
BaseStepDialog.getFieldsFromPrevious( r, wHeaders, 1, new int[] { 1, 2 }, new int[] { 3 }, -1, -1, null );
}
} catch ( KettleException ke ) {
new ErrorDialog(
shell, BaseMessages.getString( PKG, "HTTPDialog.FailedToGetFields.DialogTitle" ), BaseMessages
.getString( PKG, "HTTPDialog.FailedToGetFields.DialogMessage" ), ke );
}
}
}