/*! ****************************************************************************** * * 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.job.dialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; 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.graphics.Image; 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.List; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; 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.DBCache; import org.pentaho.di.core.Props; import org.pentaho.di.core.database.Database; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.ChannelLogTable; import org.pentaho.di.core.logging.JobEntryLogTable; import org.pentaho.di.core.logging.JobLogTable; import org.pentaho.di.core.logging.LogStatus; import org.pentaho.di.core.logging.LogTableField; import org.pentaho.di.core.logging.LogTableInterface; import org.pentaho.di.core.logging.LogTablePluginInterface; import org.pentaho.di.core.parameters.DuplicateParamException; import org.pentaho.di.core.parameters.UnknownParamException; import org.pentaho.di.core.plugins.JobEntryPluginType; import org.pentaho.di.core.plugins.PluginInterface; import org.pentaho.di.core.plugins.PluginRegistry; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.job.JobMeta; import org.pentaho.di.job.entry.JobEntryInterface; import org.pentaho.di.repository.KettleRepositoryLostException; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.ui.core.ConstUI; import org.pentaho.di.ui.core.PropsUI; import org.pentaho.di.ui.core.database.dialog.DatabaseDialog; import org.pentaho.di.ui.core.database.dialog.SQLEditor; 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.ColumnInfo; import org.pentaho.di.ui.core.widget.ComboVar; import org.pentaho.di.ui.core.widget.FieldDisabledListener; import org.pentaho.di.ui.core.widget.TableView; import org.pentaho.di.ui.core.widget.TextVar; import org.pentaho.di.ui.repository.RepositoryDirectoryUI; import org.pentaho.di.ui.trans.step.BaseStepDialog; import org.pentaho.di.ui.util.HelpUtils; import java.lang.reflect.Constructor; import java.util.ArrayList; /** * Allows you to edit the Job settings. Just pass a JobInfo object. * * @author Matt Casters * @since 02-jul-2003 */ public class JobDialog extends Dialog { private static Class<?> PKG = JobDialog.class; // for i18n purposes, needed by Translator2!! private CTabFolder wTabFolder; private FormData fdTabFolder; private CTabItem wJobTab, wParamTab, wLogTab, wSettingsTab; private PropsUI props; private Label wlJobname; private Text wJobname; private FormData fdlJobname, fdJobname; private Label wlJobFilename; private Text wJobFilename; private FormData fdlJobFilename, fdJobFilename; private Label wlDirectory; private Text wDirectory; private Button wbDirectory; private FormData fdlDirectory, fdbDirectory, fdDirectory; private Button wbLogconnection; private ComboVar wLogconnection; private TextVar wLogSchema; private Label wlBatchTrans; private Button wBatchTrans; private FormData fdlBatchTrans, fdBatchTrans; protected Button wOK, wSQL, wCancel; protected Listener lsOK, lsSQL, lsCancel, lsHelp; private JobMeta jobMeta; private Shell shell; private Repository rep; private SelectionAdapter lsDef; private ModifyListener lsMod; private boolean changed; private TextVar wSharedObjectsFile; private boolean sharedObjectsFileChanged; // param tab private TableView wParamFields; // Job description private Text wJobdescription; // Extended description private Label wlExtendeddescription; private Text wExtendeddescription; private FormData fdlExtendeddescription, fdExtendeddescription; // Job Status private Label wlJobstatus; private CCombo wJobstatus; private FormData fdlJobstatus, fdJobstatus; // Job version private Text wJobversion; private int middle; private int margin; // Job creation private Text wCreateUser; private Text wCreateDate; // Job modification private Text wModUser; private Text wModDate; private RepositoryDirectoryInterface newDirectory; private boolean directoryChangeAllowed; private TextVar wLogSizeLimit; private List wLogTypeList; private Composite wLogOptionsComposite; private int previousLogTableIndex = 0; private TableView wOptionFields; private TextVar wLogTimeout; private Composite wLogComp; private TextVar wLogTable; private TextVar wLogInterval; private java.util.List<LogTableInterface> logTables; private java.util.List<LogTableUserInterface> logTableUserInterfaces; private DatabaseDialog databaseDialog; private ArrayList<JobDialogPluginInterface> extraTabs; public JobDialog( Shell parent, int style, JobMeta jobMeta, Repository rep ) { super( parent, style ); this.jobMeta = jobMeta; this.props = PropsUI.getInstance(); this.rep = rep; this.newDirectory = null; directoryChangeAllowed = true; logTables = new ArrayList<LogTableInterface>(); logTableUserInterfaces = new ArrayList<LogTableUserInterface>(); for ( LogTableInterface logTable : jobMeta.getLogTables() ) { logTables.add( (LogTableInterface) logTable.clone() ); } } public JobMeta open() { Shell parent = getParent(); Display display = parent.getDisplay(); shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN | SWT.APPLICATION_MODAL ); props.setLook( shell ); shell.setImage( GUIResource.getInstance().getImageJobGraph() ); lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { changed = true; } }; FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setLayout( formLayout ); shell.setText( BaseMessages.getString( PKG, "JobDialog.JobProperties.ShellText" ) ); middle = props.getMiddlePct(); margin = Const.MARGIN; wTabFolder = new CTabFolder( shell, SWT.BORDER ); props.setLook( wTabFolder, Props.WIDGET_STYLE_TAB ); // Get the UI interfaces for the log table plugins... // for ( LogTableInterface logTable : logTables ) { logTableUserInterfaces.add( getLogTableUserInterface( logTable, jobMeta, lsMod ) ); // can be null } addJobTab(); addParamTab(); addSettingsTab(); addLogTab(); // See if there are any other tabs to be added... extraTabs = new ArrayList<JobDialogPluginInterface>(); java.util.List<PluginInterface> jobDialogPlugins = PluginRegistry.getInstance().getPlugins( JobDialogPluginType.class ); for ( PluginInterface jobDialogPlugin : jobDialogPlugins ) { try { JobDialogPluginInterface extraTab = (JobDialogPluginInterface) PluginRegistry.getInstance().loadClass( jobDialogPlugin ); extraTab.addTab( jobMeta, parent, wTabFolder ); extraTabs.add( extraTab ); } catch ( Exception e ) { KettleRepositoryLostException krle = KettleRepositoryLostException.lookupStackStrace( e ); if ( krle != null ) { throw krle; } new ErrorDialog( shell, "Error", "Error loading job dialog plugin with id " + jobDialogPlugin.getIds()[0], e ); } } fdTabFolder = new FormData(); fdTabFolder.left = new FormAttachment( 0, 0 ); fdTabFolder.top = new FormAttachment( 0, 0 ); 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" ) ); wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) ); wSQL = new Button( shell, SWT.PUSH ); wSQL.setText( BaseMessages.getString( PKG, "System.Button.SQL" ) ); wCancel = new Button( shell, SWT.PUSH ); wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) ); // BaseStepDialog.positionBottomButtons(shell, new Button[] { wOK, wSQL, wCancel }, margin, wSharedObjectsFile); BaseStepDialog.positionBottomButtons( shell, new Button[] { wOK, wSQL, wCancel }, Const.MARGIN, null ); // Add listeners lsOK = new Listener() { public void handleEvent( Event e ) { ok(); } }; lsSQL = new Listener() { public void handleEvent( Event e ) { sql(); } }; lsCancel = new Listener() { public void handleEvent( Event e ) { cancel(); } }; wOK.addListener( SWT.Selection, lsOK ); wSQL.addListener( SWT.Selection, lsSQL ); wCancel.addListener( SWT.Selection, lsCancel ); lsDef = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wJobname.addSelectionListener( lsDef ); // 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 ); changed = false; shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return jobMeta; } public DatabaseDialog getDatabaseDialog() { if ( databaseDialog != null ) { return databaseDialog; } databaseDialog = new DatabaseDialog( shell ); return databaseDialog; } public String[] listParameterNames() { int count = wParamFields.nrNonEmpty(); java.util.List<String> list = new ArrayList<String>(); for ( int i = 0; i < count; i++ ) { TableItem item = wParamFields.getNonEmpty( i ); String parameterName = item.getText( 1 ); if ( !Utils.isEmpty( parameterName ) ) { if ( !list.contains( parameterName ) ) { list.add( parameterName ); } } } return list.toArray( new String[list.size()] ); } private void addJobTab() { // //////////////////////// // START OF JOB TAB/// // / wJobTab = new CTabItem( wTabFolder, SWT.NONE ); wJobTab.setText( BaseMessages.getString( PKG, "JobDialog.JobTab.Label" ) ); Composite wJobComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wJobComp ); FormLayout transLayout = new FormLayout(); transLayout.marginWidth = Const.MARGIN; transLayout.marginHeight = Const.MARGIN; wJobComp.setLayout( transLayout ); // Jobname: wlJobname = new Label( wJobComp, SWT.RIGHT ); wlJobname.setText( BaseMessages.getString( PKG, "JobDialog.JobName.Label" ) ); props.setLook( wlJobname ); fdlJobname = new FormData(); fdlJobname.left = new FormAttachment( 0, 0 ); fdlJobname.right = new FormAttachment( middle, -margin ); fdlJobname.top = new FormAttachment( 0, margin ); wlJobname.setLayoutData( fdlJobname ); wJobname = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wJobname ); wJobname.addModifyListener( lsMod ); fdJobname = new FormData(); fdJobname.left = new FormAttachment( middle, 0 ); fdJobname.top = new FormAttachment( 0, margin ); fdJobname.right = new FormAttachment( 100, 0 ); wJobname.setLayoutData( fdJobname ); // JobFilename: wlJobFilename = new Label( wJobComp, SWT.RIGHT ); wlJobFilename.setText( BaseMessages.getString( PKG, "JobDialog.JobFilename.Label" ) ); props.setLook( wlJobFilename ); fdlJobFilename = new FormData(); fdlJobFilename.left = new FormAttachment( 0, 0 ); fdlJobFilename.right = new FormAttachment( middle, -margin ); fdlJobFilename.top = new FormAttachment( wJobname, margin ); wlJobFilename.setLayoutData( fdlJobFilename ); wJobFilename = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wJobFilename ); wJobFilename.addModifyListener( lsMod ); fdJobFilename = new FormData(); fdJobFilename.left = new FormAttachment( middle, 0 ); fdJobFilename.top = new FormAttachment( wJobname, margin ); fdJobFilename.right = new FormAttachment( 100, 0 ); wJobFilename.setLayoutData( fdJobFilename ); wJobFilename.setEditable( false ); wJobFilename.setBackground( GUIResource.getInstance().getColorLightGray() ); // Job description: Label wlJobdescription = new Label( wJobComp, SWT.RIGHT ); wlJobdescription.setText( BaseMessages.getString( PKG, "JobDialog.Jobdescription.Label" ) ); props.setLook( wlJobdescription ); FormData fdlJobdescription = new FormData(); fdlJobdescription.left = new FormAttachment( 0, 0 ); fdlJobdescription.right = new FormAttachment( middle, -margin ); fdlJobdescription.top = new FormAttachment( wJobFilename, margin ); wlJobdescription.setLayoutData( fdlJobdescription ); wJobdescription = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wJobdescription ); wJobdescription.addModifyListener( lsMod ); FormData fdJobdescription = new FormData(); fdJobdescription.left = new FormAttachment( middle, 0 ); fdJobdescription.top = new FormAttachment( wJobFilename, margin ); fdJobdescription.right = new FormAttachment( 100, 0 ); wJobdescription.setLayoutData( fdJobdescription ); // Transformation Extended description wlExtendeddescription = new Label( wJobComp, SWT.RIGHT ); wlExtendeddescription.setText( BaseMessages.getString( PKG, "JobDialog.Extendeddescription.Label" ) ); props.setLook( wlExtendeddescription ); fdlExtendeddescription = new FormData(); fdlExtendeddescription.left = new FormAttachment( 0, 0 ); fdlExtendeddescription.top = new FormAttachment( wJobdescription, margin ); fdlExtendeddescription.right = new FormAttachment( middle, -margin ); wlExtendeddescription.setLayoutData( fdlExtendeddescription ); wExtendeddescription = new Text( wJobComp, SWT.MULTI | SWT.LEFT | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL ); props.setLook( wExtendeddescription, Props.WIDGET_STYLE_FIXED ); wExtendeddescription.addModifyListener( lsMod ); fdExtendeddescription = new FormData(); fdExtendeddescription.left = new FormAttachment( middle, 0 ); fdExtendeddescription.top = new FormAttachment( wJobdescription, margin ); fdExtendeddescription.right = new FormAttachment( 100, 0 ); fdExtendeddescription.bottom = new FormAttachment( 50, -margin ); wExtendeddescription.setLayoutData( fdExtendeddescription ); // Trans Status wlJobstatus = new Label( wJobComp, SWT.RIGHT ); wlJobstatus.setText( BaseMessages.getString( PKG, "JobDialog.Jobstatus.Label" ) ); props.setLook( wlJobstatus ); fdlJobstatus = new FormData(); fdlJobstatus.left = new FormAttachment( 0, 0 ); fdlJobstatus.right = new FormAttachment( middle, 0 ); fdlJobstatus.top = new FormAttachment( wExtendeddescription, margin * 2 ); wlJobstatus.setLayoutData( fdlJobstatus ); wJobstatus = new CCombo( wJobComp, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER ); wJobstatus.add( BaseMessages.getString( PKG, "JobDialog.Draft_Jobstatus.Label" ) ); wJobstatus.add( BaseMessages.getString( PKG, "JobDialog.Production_Jobstatus.Label" ) ); wJobstatus.add( "" ); wJobstatus.select( -1 ); // +1: starts at -1 props.setLook( wJobstatus ); fdJobstatus = new FormData(); fdJobstatus.left = new FormAttachment( middle, 0 ); fdJobstatus.top = new FormAttachment( wExtendeddescription, margin * 2 ); fdJobstatus.right = new FormAttachment( 100, 0 ); wJobstatus.setLayoutData( fdJobstatus ); // Job version: Label wlJobversion = new Label( wJobComp, SWT.RIGHT ); wlJobversion.setText( BaseMessages.getString( PKG, "JobDialog.Jobversion.Label" ) ); props.setLook( wlJobversion ); FormData fdlJobversion = new FormData(); fdlJobversion.left = new FormAttachment( 0, 0 ); fdlJobversion.right = new FormAttachment( middle, -margin ); fdlJobversion.top = new FormAttachment( wJobstatus, margin ); wlJobversion.setLayoutData( fdlJobversion ); wJobversion = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wJobversion ); wJobversion.addModifyListener( lsMod ); FormData fdJobversion = new FormData(); fdJobversion.left = new FormAttachment( middle, 0 ); fdJobversion.top = new FormAttachment( wJobstatus, margin ); fdJobversion.right = new FormAttachment( 100, 0 ); wJobversion.setLayoutData( fdJobversion ); // Directory: wlDirectory = new Label( wJobComp, SWT.RIGHT ); wlDirectory.setText( BaseMessages.getString( PKG, "JobDialog.Directory.Label" ) ); props.setLook( wlDirectory ); fdlDirectory = new FormData(); fdlDirectory.left = new FormAttachment( 0, 0 ); fdlDirectory.right = new FormAttachment( middle, -margin ); fdlDirectory.top = new FormAttachment( wJobversion, margin ); wlDirectory.setLayoutData( fdlDirectory ); wbDirectory = new Button( wJobComp, SWT.PUSH ); wbDirectory.setToolTipText( BaseMessages.getString( PKG, "JobDialog.SelectJobFolderFolder.Tooltip" ) ); wbDirectory.setImage( GUIResource.getInstance().getImageArrow() ); props.setLook( wbDirectory ); fdbDirectory = new FormData(); fdbDirectory.top = new FormAttachment( wJobversion, 0 ); fdbDirectory.right = new FormAttachment( 100, 0 ); wbDirectory.setLayoutData( fdbDirectory ); wbDirectory.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { RepositoryDirectoryInterface directoryFrom = jobMeta.getRepositoryDirectory(); RepositoryDirectoryInterface rd = RepositoryDirectoryUI.chooseDirectory( shell, rep, directoryFrom ); if ( rd == null ) { return; } // We need to change this in the repository as well!! // We do this when the user pressed OK newDirectory = rd; wDirectory.setText( rd.getPath() ); } } ); wDirectory = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wDirectory ); wDirectory.setToolTipText( BaseMessages.getString( PKG, "JobDialog.Directory.Tooltip" ) ); wDirectory.setEditable( false ); wDirectory.setEnabled( false ); fdDirectory = new FormData(); fdDirectory.top = new FormAttachment( wJobversion, margin ); fdDirectory.left = new FormAttachment( middle, 0 ); fdDirectory.right = new FormAttachment( wbDirectory, 0 ); wDirectory.setLayoutData( fdDirectory ); // Create User: Label wlCreateUser = new Label( wJobComp, SWT.RIGHT ); wlCreateUser.setText( BaseMessages.getString( PKG, "JobDialog.CreateUser.Label" ) ); props.setLook( wlCreateUser ); FormData fdlCreateUser = new FormData(); fdlCreateUser.left = new FormAttachment( 0, 0 ); fdlCreateUser.right = new FormAttachment( middle, -margin ); fdlCreateUser.top = new FormAttachment( wDirectory, margin ); wlCreateUser.setLayoutData( fdlCreateUser ); wCreateUser = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wCreateUser ); wCreateUser.setEditable( false ); wCreateUser.addModifyListener( lsMod ); FormData fdCreateUser = new FormData(); fdCreateUser.left = new FormAttachment( middle, 0 ); fdCreateUser.top = new FormAttachment( wDirectory, margin ); fdCreateUser.right = new FormAttachment( 100, 0 ); wCreateUser.setLayoutData( fdCreateUser ); // Created Date: Label wlCreateDate = new Label( wJobComp, SWT.RIGHT ); wlCreateDate.setText( BaseMessages.getString( PKG, "JobDialog.CreateDate.Label" ) ); props.setLook( wlCreateDate ); FormData fdlCreateDate = new FormData(); fdlCreateDate.left = new FormAttachment( 0, 0 ); fdlCreateDate.right = new FormAttachment( middle, -margin ); fdlCreateDate.top = new FormAttachment( wCreateUser, margin ); wlCreateDate.setLayoutData( fdlCreateDate ); wCreateDate = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wCreateDate ); wCreateDate.setEditable( false ); wCreateDate.addModifyListener( lsMod ); FormData fdCreateDate = new FormData(); fdCreateDate.left = new FormAttachment( middle, 0 ); fdCreateDate.top = new FormAttachment( wCreateUser, margin ); fdCreateDate.right = new FormAttachment( 100, 0 ); wCreateDate.setLayoutData( fdCreateDate ); // Modified User: Label wlModUser = new Label( wJobComp, SWT.RIGHT ); wlModUser.setText( BaseMessages.getString( PKG, "JobDialog.LastModifiedUser.Label" ) ); props.setLook( wlModUser ); FormData fdlModUser = new FormData(); fdlModUser.left = new FormAttachment( 0, 0 ); fdlModUser.right = new FormAttachment( middle, -margin ); fdlModUser.top = new FormAttachment( wCreateDate, margin ); wlModUser.setLayoutData( fdlModUser ); wModUser = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wModUser ); wModUser.setEditable( false ); wModUser.addModifyListener( lsMod ); FormData fdModUser = new FormData(); fdModUser.left = new FormAttachment( middle, 0 ); fdModUser.top = new FormAttachment( wCreateDate, margin ); fdModUser.right = new FormAttachment( 100, 0 ); wModUser.setLayoutData( fdModUser ); // Modified Date: Label wlModDate = new Label( wJobComp, SWT.RIGHT ); wlModDate.setText( BaseMessages.getString( PKG, "JobDialog.LastModifiedDate.Label" ) ); props.setLook( wlModDate ); FormData fdlModDate = new FormData(); fdlModDate.left = new FormAttachment( 0, 0 ); fdlModDate.right = new FormAttachment( middle, -margin ); fdlModDate.top = new FormAttachment( wModUser, margin ); wlModDate.setLayoutData( fdlModDate ); wModDate = new Text( wJobComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wModDate ); wModDate.setEditable( false ); wModDate.addModifyListener( lsMod ); FormData fdModDate = new FormData(); fdModDate.left = new FormAttachment( middle, 0 ); fdModDate.top = new FormAttachment( wModUser, margin ); fdModDate.right = new FormAttachment( 100, 0 ); wModDate.setLayoutData( fdModDate ); FormData fdJobComp = new FormData(); fdJobComp.left = new FormAttachment( 0, 0 ); fdJobComp.top = new FormAttachment( 0, 0 ); fdJobComp.right = new FormAttachment( 100, 0 ); fdJobComp.bottom = new FormAttachment( 100, 0 ); wJobComp.setLayoutData( fdJobComp ); wJobTab.setControl( wJobComp ); // /////////////////////////////////////////////////////////// // / END OF JOB TAB // /////////////////////////////////////////////////////////// } private void addParamTab() { // //////////////////////// // START OF PARAM TAB // / wParamTab = new CTabItem( wTabFolder, SWT.NONE ); wParamTab.setText( BaseMessages.getString( PKG, "JobDialog.ParamTab.Label" ) ); FormLayout paramLayout = new FormLayout(); paramLayout.marginWidth = Const.MARGIN; paramLayout.marginHeight = Const.MARGIN; Composite wParamComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wParamComp ); wParamComp.setLayout( paramLayout ); Label wlFields = new Label( wParamComp, SWT.RIGHT ); wlFields.setText( BaseMessages.getString( PKG, "JobDialog.Parameters.Label" ) ); props.setLook( wlFields ); FormData fdlFields = new FormData(); fdlFields.left = new FormAttachment( 0, 0 ); fdlFields.top = new FormAttachment( 0, 0 ); wlFields.setLayoutData( fdlFields ); final int FieldsCols = 3; final int FieldsRows = jobMeta.listParameters().length; ColumnInfo[] colinf = new ColumnInfo[FieldsCols]; colinf[0] = new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.ColumnInfo.Parameter.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false ); colinf[1] = new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.ColumnInfo.Default.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false ); colinf[2] = new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.ColumnInfo.Description.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false ); wParamFields = new TableView( jobMeta, wParamComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colinf, FieldsRows, lsMod, props ); FormData fdFields = new FormData(); fdFields.left = new FormAttachment( 0, 0 ); fdFields.top = new FormAttachment( wlFields, margin ); fdFields.right = new FormAttachment( 100, 0 ); fdFields.bottom = new FormAttachment( 100, 0 ); wParamFields.setLayoutData( fdFields ); FormData fdDepComp = new FormData(); fdDepComp.left = new FormAttachment( 0, 0 ); fdDepComp.top = new FormAttachment( 0, 0 ); fdDepComp.right = new FormAttachment( 100, 0 ); fdDepComp.bottom = new FormAttachment( 100, 0 ); wParamComp.setLayoutData( fdDepComp ); wParamComp.layout(); wParamTab.setControl( wParamComp ); // /////////////////////////////////////////////////////////// // / END OF PARAM TAB // /////////////////////////////////////////////////////////// } private void addLogTab() { // //////////////////////// // START OF LOG TAB/// // / wLogTab = new CTabItem( wTabFolder, SWT.NONE ); wLogTab.setText( BaseMessages.getString( PKG, "JobDialog.LogTab.Label" ) ); FormLayout LogLayout = new FormLayout(); LogLayout.marginWidth = Const.MARGIN; LogLayout.marginHeight = Const.MARGIN; wLogComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wLogComp ); wLogComp.setLayout( LogLayout ); // Add a log type List on the left hand side... // wLogTypeList = new List( wLogComp, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER ); props.setLook( wLogTypeList ); for ( LogTableInterface logTable : logTables ) { wLogTypeList.add( logTable.getLogTableType() ); } FormData fdLogTypeList = new FormData(); fdLogTypeList.left = new FormAttachment( 0, 0 ); fdLogTypeList.top = new FormAttachment( 0, 0 ); fdLogTypeList.right = new FormAttachment( middle / 2, 0 ); fdLogTypeList.bottom = new FormAttachment( 100, 0 ); wLogTypeList.setLayoutData( fdLogTypeList ); wLogTypeList.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { showLogTypeOptions( wLogTypeList.getSelectionIndex() ); } } ); // On the right side we see a dynamic area : a composite... // wLogOptionsComposite = new Composite( wLogComp, SWT.BORDER ); FormLayout logOptionsLayout = new FormLayout(); logOptionsLayout.marginWidth = Const.MARGIN; logOptionsLayout.marginHeight = Const.MARGIN; wLogOptionsComposite.setLayout( logOptionsLayout ); props.setLook( wLogOptionsComposite ); FormData fdLogOptionsComposite = new FormData(); fdLogOptionsComposite.left = new FormAttachment( wLogTypeList, margin ); fdLogOptionsComposite.top = new FormAttachment( 0, 0 ); fdLogOptionsComposite.right = new FormAttachment( 100, 0 ); fdLogOptionsComposite.bottom = new FormAttachment( 100, 0 ); wLogOptionsComposite.setLayoutData( fdLogOptionsComposite ); FormData fdLogComp = new FormData(); fdLogComp.left = new FormAttachment( 0, 0 ); fdLogComp.top = new FormAttachment( 0, 0 ); fdLogComp.right = new FormAttachment( 100, 0 ); fdLogComp.bottom = new FormAttachment( 100, 0 ); wLogComp.setLayoutData( fdLogComp ); wLogComp.layout(); wLogTab.setControl( wLogComp ); // /////////////////////////////////////////////////////////// // / END OF LOG TAB // /////////////////////////////////////////////////////////// } private void showLogTypeOptions( int index ) { if ( index != previousLogTableIndex ) { getLogInfo( previousLogTableIndex ); // clean the log options composite... // for ( Control control : wLogOptionsComposite.getChildren() ) { control.dispose(); } previousLogTableIndex = index; LogTableInterface logTable = logTables.get( index ); LogTableUserInterface logTableUserInterface = logTableUserInterfaces.get( index ); if ( logTableUserInterface != null ) { logTableUserInterface.showLogTableOptions( wLogOptionsComposite, logTable ); } else { if ( logTable instanceof JobLogTable ) { showJobLogTableOptions( (JobLogTable) logTable ); } else if ( logTable instanceof ChannelLogTable ) { showChannelLogTableOptions( (ChannelLogTable) logTable ); } if ( logTable instanceof JobEntryLogTable ) { showJobEntryLogTableOptions( (JobEntryLogTable) logTable ); } } wLogOptionsComposite.layout( true, true ); wLogComp.layout( true, true ); } } private void getLogInfo( int previousLogTableIndex ) { if ( previousLogTableIndex < 0 ) { return; } // Remember the that was entered data... // LogTableInterface modifiedLogTable = logTables.get( previousLogTableIndex ); LogTableUserInterface logTableUserInterface = logTableUserInterfaces.get( previousLogTableIndex ); if ( logTableUserInterface != null ) { logTableUserInterface.retrieveLogTableOptions( modifiedLogTable ); } else { if ( modifiedLogTable instanceof JobLogTable ) { getJobLogTableOptions( (JobLogTable) modifiedLogTable ); } else if ( modifiedLogTable instanceof ChannelLogTable ) { getChannelLogTableOptions( (ChannelLogTable) modifiedLogTable ); } else if ( modifiedLogTable instanceof JobEntryLogTable ) { getJobEntryLogTableOptions( (JobEntryLogTable) modifiedLogTable ); } } } private void getJobLogTableOptions( JobLogTable jobLogTable ) { // The connection... // jobLogTable.setConnectionName( wLogconnection.getText() ); jobLogTable.setSchemaName( wLogSchema.getText() ); jobLogTable.setTableName( wLogTable.getText() ); jobLogTable.setLogInterval( wLogInterval.getText() ); jobLogTable.setLogSizeLimit( wLogSizeLimit.getText() ); jobLogTable.setTimeoutInDays( wLogTimeout.getText() ); for ( int i = 0; i < jobLogTable.getFields().size(); i++ ) { TableItem item = wOptionFields.table.getItem( i ); LogTableField field = jobLogTable.getFields().get( i ); field.setEnabled( item.getChecked() ); field.setFieldName( item.getText( 1 ) ); } } private Control addDBSchemaTableLogOptions( LogTableInterface logTable ) { // Log table connection... // Label wlLogconnection = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogconnection.setText( BaseMessages.getString( PKG, "JobDialog.LogConnection.Label" ) ); props.setLook( wlLogconnection ); FormData fdlLogconnection = new FormData(); fdlLogconnection.left = new FormAttachment( 0, 0 ); fdlLogconnection.right = new FormAttachment( middle, -margin ); fdlLogconnection.top = new FormAttachment( 0, 0 ); wlLogconnection.setLayoutData( fdlLogconnection ); wbLogconnection = new Button( wLogOptionsComposite, SWT.PUSH ); wbLogconnection.setText( BaseMessages.getString( PKG, "JobDialog.LogconnectionButton.Label" ) ); wbLogconnection.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { DatabaseMeta databaseMeta = new DatabaseMeta(); databaseMeta.shareVariablesWith( jobMeta ); getDatabaseDialog().setDatabaseMeta( databaseMeta ); if ( getDatabaseDialog().open() != null ) { jobMeta.addDatabase( getDatabaseDialog().getDatabaseMeta() ); wLogconnection.add( getDatabaseDialog().getDatabaseMeta().getName() ); wLogconnection.select( wLogconnection.getItemCount() - 1 ); } } } ); FormData fdbLogconnection = new FormData(); fdbLogconnection.right = new FormAttachment( 100, 0 ); fdbLogconnection.top = new FormAttachment( 0, 0 ); wbLogconnection.setLayoutData( fdbLogconnection ); wLogconnection = new ComboVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wLogconnection ); wLogconnection.addModifyListener( lsMod ); FormData fdLogconnection = new FormData(); fdLogconnection.left = new FormAttachment( middle, 0 ); fdLogconnection.top = new FormAttachment( 0, 0 ); fdLogconnection.right = new FormAttachment( wbLogconnection, -margin ); wLogconnection.setLayoutData( fdLogconnection ); wLogconnection.setItems( jobMeta.getDatabaseNames() ); wLogconnection.setText( Const.NVL( logTable.getConnectionName(), "" ) ); wLogconnection.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogConnection.Tooltip", logTable .getConnectionNameVariable() ) ); // Log schema ... // Label wlLogSchema = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogSchema.setText( BaseMessages.getString( PKG, "JobDialog.LogSchema.Label" ) ); props.setLook( wlLogSchema ); FormData fdlLogSchema = new FormData(); fdlLogSchema.left = new FormAttachment( 0, 0 ); fdlLogSchema.right = new FormAttachment( middle, -margin ); fdlLogSchema.top = new FormAttachment( wLogconnection, margin ); wlLogSchema.setLayoutData( fdlLogSchema ); wLogSchema = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wLogSchema ); wLogSchema.addModifyListener( lsMod ); FormData fdLogSchema = new FormData(); fdLogSchema.left = new FormAttachment( middle, 0 ); fdLogSchema.top = new FormAttachment( wLogconnection, margin ); fdLogSchema.right = new FormAttachment( 100, 0 ); wLogSchema.setLayoutData( fdLogSchema ); wLogSchema.setText( Const.NVL( logTable.getSchemaName(), "" ) ); wLogSchema.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogSchema.Tooltip", logTable .getSchemaNameVariable() ) ); // Log table... // Label wlLogtable = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogtable.setText( BaseMessages.getString( PKG, "JobDialog.Logtable.Label" ) ); props.setLook( wlLogtable ); FormData fdlLogtable = new FormData(); fdlLogtable.left = new FormAttachment( 0, 0 ); fdlLogtable.right = new FormAttachment( middle, -margin ); fdlLogtable.top = new FormAttachment( wLogSchema, margin ); wlLogtable.setLayoutData( fdlLogtable ); wLogTable = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wLogTable ); wLogTable.addModifyListener( lsMod ); FormData fdLogtable = new FormData(); fdLogtable.left = new FormAttachment( middle, 0 ); fdLogtable.top = new FormAttachment( wLogSchema, margin ); fdLogtable.right = new FormAttachment( 100, 0 ); wLogTable.setLayoutData( fdLogtable ); wLogTable.setText( Const.NVL( logTable.getTableName(), "" ) ); wLogTable.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTable.Tooltip", logTable .getTableNameVariable() ) ); return wLogTable; } private void showJobLogTableOptions( JobLogTable jobLogTable ) { addDBSchemaTableLogOptions( jobLogTable ); // Log interval... // Label wlLogInterval = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogInterval.setText( BaseMessages.getString( PKG, "JobDialog.LogInterval.Label" ) ); props.setLook( wlLogInterval ); FormData fdlLogInterval = new FormData(); fdlLogInterval.left = new FormAttachment( 0, 0 ); fdlLogInterval.right = new FormAttachment( middle, -margin ); fdlLogInterval.top = new FormAttachment( wLogTable, margin ); wlLogInterval.setLayoutData( fdlLogInterval ); wLogInterval = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wLogInterval ); wLogInterval.addModifyListener( lsMod ); FormData fdLogInterval = new FormData(); fdLogInterval.left = new FormAttachment( middle, 0 ); fdLogInterval.top = new FormAttachment( wLogTable, margin ); fdLogInterval.right = new FormAttachment( 100, 0 ); wLogInterval.setLayoutData( fdLogInterval ); wLogInterval.setText( Const.NVL( jobLogTable.getLogInterval(), "" ) ); // The log timeout in days // Label wlLogTimeout = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogTimeout.setText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Label" ) ); wlLogTimeout.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Tooltip" ) ); props.setLook( wlLogTimeout ); FormData fdlLogTimeout = new FormData(); fdlLogTimeout.left = new FormAttachment( 0, 0 ); fdlLogTimeout.right = new FormAttachment( middle, -margin ); fdlLogTimeout.top = new FormAttachment( wLogInterval, margin ); wlLogTimeout.setLayoutData( fdlLogTimeout ); wLogTimeout = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wLogTimeout.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Tooltip" ) ); props.setLook( wLogTimeout ); wLogTimeout.addModifyListener( lsMod ); FormData fdLogTimeout = new FormData(); fdLogTimeout.left = new FormAttachment( middle, 0 ); fdLogTimeout.top = new FormAttachment( wLogInterval, margin ); fdLogTimeout.right = new FormAttachment( 100, 0 ); wLogTimeout.setLayoutData( fdLogTimeout ); wLogTimeout.setText( Const.NVL( jobLogTable.getTimeoutInDays(), "" ) ); // The log size limit // Label wlLogSizeLimit = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogSizeLimit.setText( BaseMessages.getString( PKG, "JobDialog.LogSizeLimit.Label" ) ); wlLogSizeLimit.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogSizeLimit.Tooltip" ) ); props.setLook( wlLogSizeLimit ); FormData fdlLogSizeLimit = new FormData(); fdlLogSizeLimit.left = new FormAttachment( 0, 0 ); fdlLogSizeLimit.right = new FormAttachment( middle, -margin ); fdlLogSizeLimit.top = new FormAttachment( wLogTimeout, margin ); wlLogSizeLimit.setLayoutData( fdlLogSizeLimit ); wLogSizeLimit = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wLogSizeLimit.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogSizeLimit.Tooltip" ) ); props.setLook( wLogSizeLimit ); wLogSizeLimit.addModifyListener( lsMod ); FormData fdLogSizeLimit = new FormData(); fdLogSizeLimit.left = new FormAttachment( middle, 0 ); fdLogSizeLimit.top = new FormAttachment( wLogTimeout, margin ); fdLogSizeLimit.right = new FormAttachment( 100, 0 ); wLogSizeLimit.setLayoutData( fdLogSizeLimit ); wLogSizeLimit.setText( Const.NVL( jobLogTable.getLogSizeLimit(), "" ) ); // Add the fields grid... // Label wlFields = new Label( wLogOptionsComposite, SWT.NONE ); wlFields.setText( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Label" ) ); props.setLook( wlFields ); FormData fdlFields = new FormData(); fdlFields.left = new FormAttachment( 0, 0 ); fdlFields.top = new FormAttachment( wLogSizeLimit, margin * 2 ); wlFields.setLayoutData( fdlFields ); final java.util.List<LogTableField> fields = jobLogTable.getFields(); final int nrRows = fields.size(); ColumnInfo[] colinf = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.FieldName" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Description" ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ), }; wOptionFields = new TableView( jobMeta, wLogOptionsComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.CHECK, // add a // check // to the // left... colinf, nrRows, true, lsMod, props ); wOptionFields.setSortable( false ); for ( int i = 0; i < fields.size(); i++ ) { LogTableField field = fields.get( i ); TableItem item = wOptionFields.table.getItem( i ); item.setChecked( field.isEnabled() ); item.setText( new String[] { "", Const.NVL( field.getFieldName(), "" ), Const.NVL( field.getDescription(), "" ) } ); } wOptionFields.table.getColumn( 0 ).setText( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Enabled" ) ); FormData fdOptionFields = new FormData(); fdOptionFields.left = new FormAttachment( 0, 0 ); fdOptionFields.top = new FormAttachment( wlFields, margin ); fdOptionFields.right = new FormAttachment( 100, 0 ); fdOptionFields.bottom = new FormAttachment( 100, 0 ); wOptionFields.setLayoutData( fdOptionFields ); wOptionFields.optWidth( true ); wOptionFields.layout(); } private void getChannelLogTableOptions( ChannelLogTable channelLogTable ) { // The connection... // channelLogTable.setConnectionName( wLogconnection.getText() ); channelLogTable.setSchemaName( wLogSchema.getText() ); channelLogTable.setTableName( wLogTable.getText() ); channelLogTable.setTimeoutInDays( wLogTimeout.getText() ); for ( int i = 0; i < channelLogTable.getFields().size(); i++ ) { TableItem item = wOptionFields.table.getItem( i ); LogTableField field = channelLogTable.getFields().get( i ); field.setEnabled( item.getChecked() ); field.setFieldName( item.getText( 1 ) ); } } private void showChannelLogTableOptions( ChannelLogTable channelLogTable ) { addDBSchemaTableLogOptions( channelLogTable ); // The log timeout in days // Label wlLogTimeout = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogTimeout.setText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Label" ) ); wlLogTimeout.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Tooltip" ) ); props.setLook( wlLogTimeout ); FormData fdlLogTimeout = new FormData(); fdlLogTimeout.left = new FormAttachment( 0, 0 ); fdlLogTimeout.right = new FormAttachment( middle, -margin ); fdlLogTimeout.top = new FormAttachment( wLogTable, margin ); wlLogTimeout.setLayoutData( fdlLogTimeout ); wLogTimeout = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wLogTimeout.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Tooltip" ) ); props.setLook( wLogTimeout ); wLogTimeout.addModifyListener( lsMod ); FormData fdLogTimeout = new FormData(); fdLogTimeout.left = new FormAttachment( middle, 0 ); fdLogTimeout.top = new FormAttachment( wLogTable, margin ); fdLogTimeout.right = new FormAttachment( 100, 0 ); wLogTimeout.setLayoutData( fdLogTimeout ); wLogTimeout.setText( Const.NVL( channelLogTable.getTimeoutInDays(), "" ) ); // Add the fields grid... // Label wlFields = new Label( wLogOptionsComposite, SWT.NONE ); wlFields.setText( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Label" ) ); props.setLook( wlFields ); FormData fdlFields = new FormData(); fdlFields.left = new FormAttachment( 0, 0 ); fdlFields.top = new FormAttachment( wLogTimeout, margin * 2 ); wlFields.setLayoutData( fdlFields ); final java.util.List<LogTableField> fields = channelLogTable.getFields(); final int nrRows = fields.size(); ColumnInfo[] colinf = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.FieldName" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Description" ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ), }; FieldDisabledListener disabledListener = new FieldDisabledListener() { public boolean isFieldDisabled( int rowNr ) { if ( rowNr >= 0 && rowNr < fields.size() ) { LogTableField field = fields.get( rowNr ); return field.isSubjectAllowed(); } else { return true; } } }; colinf[1].setDisabledListener( disabledListener ); wOptionFields = new TableView( jobMeta, wLogOptionsComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.CHECK, // add a // check // to the // left... colinf, nrRows, true, lsMod, props ); wOptionFields.setSortable( false ); for ( int i = 0; i < fields.size(); i++ ) { LogTableField field = fields.get( i ); TableItem item = wOptionFields.table.getItem( i ); item.setChecked( field.isEnabled() ); item.setText( new String[] { "", Const.NVL( field.getFieldName(), "" ), Const.NVL( field.getDescription(), "" ) } ); } wOptionFields.table.getColumn( 0 ).setText( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Enabled" ) ); FormData fdOptionFields = new FormData(); fdOptionFields.left = new FormAttachment( 0, 0 ); fdOptionFields.top = new FormAttachment( wlFields, margin ); fdOptionFields.right = new FormAttachment( 100, 0 ); fdOptionFields.bottom = new FormAttachment( 100, 0 ); wOptionFields.setLayoutData( fdOptionFields ); wOptionFields.optWidth( true ); wOptionFields.layout(); } private void getJobEntryLogTableOptions( JobEntryLogTable jobEntryLogTable ) { // The connection... // jobEntryLogTable.setConnectionName( wLogconnection.getText() ); jobEntryLogTable.setSchemaName( wLogSchema.getText() ); jobEntryLogTable.setTableName( wLogTable.getText() ); jobEntryLogTable.setTimeoutInDays( wLogTimeout.getText() ); for ( int i = 0; i < jobEntryLogTable.getFields().size(); i++ ) { TableItem item = wOptionFields.table.getItem( i ); LogTableField field = jobEntryLogTable.getFields().get( i ); field.setEnabled( item.getChecked() ); field.setFieldName( item.getText( 1 ) ); } } private void showJobEntryLogTableOptions( JobEntryLogTable jobEntryLogTable ) { addDBSchemaTableLogOptions( jobEntryLogTable ); // The log timeout in days // Label wlLogTimeout = new Label( wLogOptionsComposite, SWT.RIGHT ); wlLogTimeout.setText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Label" ) ); wlLogTimeout.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Tooltip" ) ); props.setLook( wlLogTimeout ); FormData fdlLogTimeout = new FormData(); fdlLogTimeout.left = new FormAttachment( 0, 0 ); fdlLogTimeout.right = new FormAttachment( middle, -margin ); fdlLogTimeout.top = new FormAttachment( wLogTable, margin ); wlLogTimeout.setLayoutData( fdlLogTimeout ); wLogTimeout = new TextVar( jobMeta, wLogOptionsComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wLogTimeout.setToolTipText( BaseMessages.getString( PKG, "JobDialog.LogTimeout.Tooltip" ) ); props.setLook( wLogTimeout ); wLogTimeout.addModifyListener( lsMod ); FormData fdLogTimeout = new FormData(); fdLogTimeout.left = new FormAttachment( middle, 0 ); fdLogTimeout.top = new FormAttachment( wLogTable, margin ); fdLogTimeout.right = new FormAttachment( 100, 0 ); wLogTimeout.setLayoutData( fdLogTimeout ); wLogTimeout.setText( Const.NVL( jobEntryLogTable.getTimeoutInDays(), "" ) ); // Add the fields grid... // Label wlFields = new Label( wLogOptionsComposite, SWT.NONE ); wlFields.setText( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Label" ) ); props.setLook( wlFields ); FormData fdlFields = new FormData(); fdlFields.left = new FormAttachment( 0, 0 ); fdlFields.top = new FormAttachment( wLogTimeout, margin * 2 ); wlFields.setLayoutData( fdlFields ); final java.util.List<LogTableField> fields = jobEntryLogTable.getFields(); final int nrRows = fields.size(); ColumnInfo[] colinf = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.FieldName" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Description" ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ), }; FieldDisabledListener disabledListener = new FieldDisabledListener() { public boolean isFieldDisabled( int rowNr ) { if ( rowNr >= 0 && rowNr < fields.size() ) { LogTableField field = fields.get( rowNr ); return field.isSubjectAllowed(); } else { return true; } } }; colinf[1].setDisabledListener( disabledListener ); wOptionFields = new TableView( jobMeta, wLogOptionsComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.CHECK, // add a // check // to the // left... colinf, nrRows, true, lsMod, props ); wOptionFields.setSortable( false ); for ( int i = 0; i < fields.size(); i++ ) { LogTableField field = fields.get( i ); TableItem item = wOptionFields.table.getItem( i ); item.setChecked( field.isEnabled() ); item.setText( new String[] { "", Const.NVL( field.getFieldName(), "" ), Const.NVL( field.getDescription(), "" ) } ); } wOptionFields.table.getColumn( 0 ).setText( BaseMessages.getString( PKG, "JobDialog.TransLogTable.Fields.Enabled" ) ); FormData fdOptionFields = new FormData(); fdOptionFields.left = new FormAttachment( 0, 0 ); fdOptionFields.top = new FormAttachment( wlFields, margin ); fdOptionFields.right = new FormAttachment( 100, 0 ); fdOptionFields.bottom = new FormAttachment( 100, 0 ); wOptionFields.setLayoutData( fdOptionFields ); wOptionFields.optWidth( true ); wOptionFields.layout(); } private void addSettingsTab() { // //////////////////////// // START OF SETTINGS TAB/// // / wSettingsTab = new CTabItem( wTabFolder, SWT.NONE ); wSettingsTab.setText( BaseMessages.getString( PKG, "JobDialog.SettingsTab.Label" ) ); FormLayout LogLayout = new FormLayout(); LogLayout.marginWidth = Const.MARGIN; LogLayout.marginHeight = Const.MARGIN; Composite wSettingsComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wSettingsComp ); wSettingsComp.setLayout( LogLayout ); wlBatchTrans = new Label( wSettingsComp, SWT.RIGHT ); wlBatchTrans.setText( BaseMessages.getString( PKG, "JobDialog.PassBatchID.Label" ) ); props.setLook( wlBatchTrans ); fdlBatchTrans = new FormData(); fdlBatchTrans.left = new FormAttachment( 0, 0 ); fdlBatchTrans.top = new FormAttachment( 0, margin ); fdlBatchTrans.right = new FormAttachment( middle, -margin ); wlBatchTrans.setLayoutData( fdlBatchTrans ); wBatchTrans = new Button( wSettingsComp, SWT.CHECK ); props.setLook( wBatchTrans ); wBatchTrans.setToolTipText( BaseMessages.getString( PKG, "JobDialog.PassBatchID.Tooltip" ) ); fdBatchTrans = new FormData(); fdBatchTrans.left = new FormAttachment( middle, 0 ); fdBatchTrans.top = new FormAttachment( 0, margin ); fdBatchTrans.right = new FormAttachment( 100, 0 ); wBatchTrans.setLayoutData( fdBatchTrans ); // Shared objects file Label wlSharedObjectsFile = new Label( wSettingsComp, SWT.RIGHT ); wlSharedObjectsFile.setText( BaseMessages.getString( PKG, "JobDialog.SharedObjectsFile.Label" ) ); props.setLook( wlSharedObjectsFile ); FormData fdlSharedObjectsFile = new FormData(); fdlSharedObjectsFile.left = new FormAttachment( 0, 0 ); fdlSharedObjectsFile.right = new FormAttachment( middle, -margin ); fdlSharedObjectsFile.top = new FormAttachment( wBatchTrans, 4 * margin ); wlSharedObjectsFile.setLayoutData( fdlSharedObjectsFile ); wSharedObjectsFile = new TextVar( jobMeta, wSettingsComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wlSharedObjectsFile.setToolTipText( BaseMessages.getString( PKG, "JobDialog.SharedObjectsFile.Tooltip" ) ); wSharedObjectsFile.setToolTipText( BaseMessages.getString( PKG, "JobDialog.SharedObjectsFile.Tooltip" ) ); props.setLook( wSharedObjectsFile ); FormData fdSharedObjectsFile = new FormData(); fdSharedObjectsFile.left = new FormAttachment( middle, 0 ); fdSharedObjectsFile.top = new FormAttachment( wBatchTrans, 4 * margin ); fdSharedObjectsFile.right = new FormAttachment( 100, 0 ); wSharedObjectsFile.setLayoutData( fdSharedObjectsFile ); wSharedObjectsFile.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent arg0 ) { sharedObjectsFileChanged = true; } } ); FormData fdLogComp = new FormData(); fdLogComp.left = new FormAttachment( 0, 0 ); fdLogComp.top = new FormAttachment( 0, 0 ); fdLogComp.right = new FormAttachment( 100, 0 ); fdLogComp.bottom = new FormAttachment( 100, 0 ); wSettingsComp.setLayoutData( fdLogComp ); wSettingsComp.layout(); wSettingsTab.setControl( wSettingsComp ); // /////////////////////////////////////////////////////////// // / END OF LOG TAB // /////////////////////////////////////////////////////////// } public void dispose() { WindowProperty winprop = new WindowProperty( shell ); props.setScreen( winprop ); shell.dispose(); } /** * Copy information from the meta-data input to the dialog fields. */ public void getData() { wJobname.setText( Const.NVL( jobMeta.getName(), "" ) ); wJobFilename.setText( Const.NVL( jobMeta.getFilename(), "" ) ); wJobdescription.setText( Const.NVL( jobMeta.getDescription(), "" ) ); wExtendeddescription.setText( Const.NVL( jobMeta.getExtendedDescription(), "" ) ); wJobversion.setText( Const.NVL( jobMeta.getJobversion(), "" ) ); wJobstatus.select( jobMeta.getJobstatus() - 1 ); wLogTypeList.select( 0 ); showJobLogTableOptions( (JobLogTable) logTables.get( 0 ) ); if ( jobMeta.getRepositoryDirectory() != null ) { wDirectory.setText( jobMeta.getRepositoryDirectory().getPath() ); } if ( jobMeta.getCreatedUser() != null ) { wCreateUser.setText( jobMeta.getCreatedUser() ); } if ( jobMeta.getCreatedDate() != null && jobMeta.getCreatedDate() != null ) { wCreateDate.setText( jobMeta.getCreatedDate().toString() ); } if ( jobMeta.getModifiedUser() != null ) { wModUser.setText( jobMeta.getModifiedUser() ); } if ( jobMeta.getModifiedDate() != null && jobMeta.getModifiedDate() != null ) { wModDate.setText( jobMeta.getModifiedDate().toString() ); } wBatchTrans.setSelection( jobMeta.isBatchIdPassed() ); // The named parameters String[] parameters = jobMeta.listParameters(); for ( int idx = 0; idx < parameters.length; idx++ ) { TableItem item = wParamFields.table.getItem( idx ); String description; try { description = jobMeta.getParameterDescription( parameters[idx] ); } catch ( UnknownParamException e ) { description = ""; } String defValue; try { defValue = jobMeta.getParameterDefault( parameters[idx] ); } catch ( UnknownParamException e ) { defValue = ""; } item.setText( 1, parameters[idx] ); item.setText( 2, Const.NVL( defValue, "" ) ); item.setText( 3, Const.NVL( description, "" ) ); } wParamFields.setRowNums(); wParamFields.optWidth( true ); wSharedObjectsFile.setText( Const.NVL( jobMeta.getSharedObjectsFile(), "" ) ); sharedObjectsFileChanged = false; for ( JobDialogPluginInterface extraTab : extraTabs ) { extraTab.getData( jobMeta ); } setFlags(); } public void setFlags() { wbDirectory.setEnabled( rep != null ); // wDirectory.setEnabled(rep!=null); wlDirectory.setEnabled( rep != null ); // DatabaseMeta dbMeta = jobMeta.findDatabase(wLogconnection.getText()); // wbLogconnection.setEnabled(dbMeta!=null); // wlLogSizeLimit.setEnabled(wLogfield.getSelection()); // wLogSizeLimit.setEnabled(wLogfield.getSelection()); } private void cancel() { props.setScreen( new WindowProperty( shell ) ); jobMeta = null; dispose(); } private void ok() { if ( previousLogTableIndex >= 0 ) { getLogInfo( previousLogTableIndex ); } for ( int i = 0; i < logTables.size(); i++ ) { jobMeta.getLogTables().get( i ).replaceMeta( logTables.get( i ) ); } jobMeta.setName( wJobname.getText() ); jobMeta.setDescription( wJobdescription.getText() ); jobMeta.setExtendedDescription( wExtendeddescription.getText() ); jobMeta.setJobversion( wJobversion.getText() ); if ( wJobstatus.getSelectionIndex() != 2 ) { // Saving the index as meta data is in fact pretty bad, but since // it was already in ... jobMeta.setJobstatus( wJobstatus.getSelectionIndex() + 1 ); } else { jobMeta.setJobstatus( -1 ); } // Clear and add parameters jobMeta.eraseParameters(); int nrNonEmptyFields = wParamFields.nrNonEmpty(); for ( int i = 0; i < nrNonEmptyFields; i++ ) { TableItem item = wParamFields.getNonEmpty( i ); try { jobMeta.addParameterDefinition( item.getText( 1 ), item.getText( 2 ), item.getText( 3 ) ); } catch ( DuplicateParamException e ) { // Ignore the duplicate parameter. } } jobMeta.activateParameters(); jobMeta.setBatchIdPassed( wBatchTrans.getSelection() ); jobMeta.setSharedObjectsFile( wSharedObjectsFile.getText() ); for ( JobDialogPluginInterface extraTab : extraTabs ) { extraTab.ok( jobMeta ); } if ( newDirectory != null ) { if ( directoryChangeAllowed ) { RepositoryDirectoryInterface dirFrom = jobMeta.getRepositoryDirectory(); try { if ( jobMeta.getObjectId() != null ) { ObjectId newId = rep.renameJob( jobMeta.getObjectId(), newDirectory, jobMeta.getName() ); jobMeta.setObjectId( newId ); } jobMeta.setRepositoryDirectory( newDirectory ); wDirectory.setText( jobMeta.getRepositoryDirectory().getPath() ); } catch ( KettleException dbe ) { jobMeta.setRepositoryDirectory( dirFrom ); new ErrorDialog( shell, BaseMessages.getString( PKG, "JobDialog.Dialog.ErrorChangingDirectory.Title" ), BaseMessages .getString( PKG, "JobDialog.Dialog.ErrorChangingDirectory.Message" ), dbe ); } } else { // Just update to the new selected directory... // jobMeta.setRepositoryDirectory( newDirectory ); } } jobMeta.setChanged( changed || jobMeta.hasChanged() ); dispose(); } /** * Generates code for create table... Conversions done by Database */ private void sql() { if ( previousLogTableIndex >= 0 ) { getLogInfo( previousLogTableIndex ); } try { for ( LogTableInterface logTable : logTables ) { if ( logTable.getDatabaseMeta() != null && !Utils.isEmpty( logTable.getTableName() ) ) { // OK, we have something to work with! // Database db = null; try { db = new Database( jobMeta, logTable.getDatabaseMeta() ); db.shareVariablesWith( jobMeta ); db.connect(); StringBuilder ddl = new StringBuilder(); RowMetaInterface fields = logTable.getLogRecord( LogStatus.START, null, null ).getRowMeta(); String tableName = db.environmentSubstitute( logTable.getTableName() ); String schemaTable = logTable.getDatabaseMeta().getQuotedSchemaTableCombination( db.environmentSubstitute( logTable.getSchemaName() ), db.environmentSubstitute( logTable.getTableName() ) ); String createTable = db.getDDL( schemaTable, fields ); if ( !Utils.isEmpty( createTable ) ) { ddl.append( "-- " ).append( logTable.getLogTableType() ).append( Const.CR ); ddl.append( "--" ).append( Const.CR ).append( Const.CR ); ddl.append( createTable ).append( Const.CR ); } java.util.List<RowMetaInterface> indexes = logTable.getRecommendedIndexes(); for ( int i = 0; i < indexes.size(); i++ ) { RowMetaInterface index = indexes.get( i ); if ( !index.isEmpty() ) { String createIndex = db.getCreateIndexStatement( schemaTable, "IDX_" + tableName + "_" + ( i + 1 ), index .getFieldNames(), false, false, false, true ); if ( !Utils.isEmpty( createIndex ) ) { ddl.append( createIndex ); } } } if ( ddl.length() > 0 ) { SQLEditor sqledit = new SQLEditor( jobMeta, shell, SWT.NONE, logTable.getDatabaseMeta(), DBCache.getInstance(), ddl .toString() ); sqledit.open(); } else { MessageBox mb = new MessageBox( shell, SWT.OK | SWT.ICON_INFORMATION ); mb.setText( BaseMessages.getString( PKG, "JobDialog.NoSqlNedds.DialogTitle" ) ); mb.setMessage( logTable.getLogTableType() + Const.CR + Const.CR + BaseMessages.getString( PKG, "JobDialog.NoSqlNedds.DialogMessage" ) ); mb.open(); } } finally { if ( db != null ) { db.disconnect(); } } } } } catch ( Exception e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "JobDialog.Dialog.ErrorCreatingSQL.Title" ), BaseMessages.getString( PKG, "JobDialog.Dialog.ErrorCreatingSQL.Message" ), e ); } } public boolean isSharedObjectsFileChanged() { return sharedObjectsFileChanged; } public static final Button setShellImage( Shell shell, JobEntryInterface jobEntryInterface ) { Button helpButton = null; try { final PluginInterface plugin = getPlugin( jobEntryInterface ); helpButton = HelpUtils.createHelpButton( shell, HelpUtils.getHelpDialogTitle( plugin ), plugin ); shell.setImage( getImage( shell, plugin ) ); } catch ( Throwable e ) { // Ignore unexpected errors, not worth it } return helpButton; } public static PluginInterface getPlugin( JobEntryInterface jobEntryInterface ) { return PluginRegistry.getInstance().getPlugin( JobEntryPluginType.class, jobEntryInterface ); } public static Image getImage( Shell shell, PluginInterface plugin ) { String id = plugin.getIds()[0]; if ( id != null ) { return GUIResource.getInstance().getImagesJobentries().get( id ).getAsBitmapForSize( shell.getDisplay(), ConstUI.ICON_SIZE, ConstUI.ICON_SIZE ); } return null; } public void setDirectoryChangeAllowed( boolean directoryChangeAllowed ) { this.directoryChangeAllowed = directoryChangeAllowed; } private LogTableUserInterface getLogTableUserInterface( LogTableInterface logTable, JobMeta jobMeta, ModifyListener lsMod ) { if ( !( logTable instanceof LogTablePluginInterface ) ) { return null; } LogTablePluginInterface pluginInterface = (LogTablePluginInterface) logTable; String uiClassName = pluginInterface.getLogTablePluginUIClassname(); Class<?> uiClass; Class<?>[] paramClasses = new Class<?>[] { JobMeta.class, ModifyListener.class, JobDialog.class, }; Object[] paramArgs = new Object[] { jobMeta, lsMod, this, }; Constructor<?> uiConstructor; try { uiClass = pluginInterface.getClass().getClassLoader().loadClass( uiClassName ); uiConstructor = uiClass.getConstructor( paramClasses ); return (LogTableUserInterface) uiConstructor.newInstance( paramArgs ); } catch ( Exception e ) { new ErrorDialog( shell, "Error", "Unable to load UI interface class: " + uiClassName, e ); return null; } } }