/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.pentaho.di.trans.steps.systemdata;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.Result;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStep;
import org.pentaho.di.trans.step.StepDataInterface;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.version.BuildVersion;
/**
* Get information from the System or the supervising transformation.
*
* @author Matt
* @since 4-aug-2003
*/
public class SystemData extends BaseStep implements StepInterface {
private SystemDataMeta meta;
private SystemDataData data;
public SystemData( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta,
Trans trans ) {
super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
}
private Object[] getSystemData( RowMetaInterface inputRowMeta, Object[] inputRowData ) throws KettleException {
Object[] row = new Object[data.outputRowMeta.size()];
for ( int i = 0; i < inputRowMeta.size(); i++ ) {
row[i] = inputRowData[i]; // no data is changed, clone is not needed here.
}
for ( int i = 0, index = inputRowMeta.size(); i < meta.getFieldName().length; i++, index++ ) {
Calendar cal;
int argnr = 0;
switch ( meta.getFieldType()[i] ) {
case TYPE_SYSTEM_INFO_SYSTEM_START:
row[index] = getTrans().getCurrentDate();
break;
case TYPE_SYSTEM_INFO_SYSTEM_DATE:
row[index] = new Date();
break;
case TYPE_SYSTEM_INFO_TRANS_DATE_FROM:
row[index] = getTrans().getStartDate();
break;
case TYPE_SYSTEM_INFO_TRANS_DATE_TO:
row[index] = getTrans().getEndDate();
break;
case TYPE_SYSTEM_INFO_JOB_DATE_FROM:
row[index] = getTrans().getJobStartDate();
break;
case TYPE_SYSTEM_INFO_JOB_DATE_TO:
row[index] = getTrans().getJobEndDate();
break;
case TYPE_SYSTEM_INFO_PREV_DAY_START:
cal = Calendar.getInstance();
cal.add( Calendar.DAY_OF_MONTH, -1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_DAY_END:
cal = Calendar.getInstance();
cal.add( Calendar.DAY_OF_MONTH, -1 );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_DAY_START:
cal = Calendar.getInstance();
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_DAY_END:
cal = Calendar.getInstance();
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_DAY_START:
cal = Calendar.getInstance();
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_DAY_END:
cal = Calendar.getInstance();
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_MONTH_START:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, -1 );
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_MONTH_END:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, -1 );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_MONTH_START:
cal = Calendar.getInstance();
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_MONTH_END:
cal = Calendar.getInstance();
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_MONTH_START:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, 1 );
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_MONTH_END:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, 1 );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_COPYNR:
row[index] = new Long( getCopy() );
break;
case TYPE_SYSTEM_INFO_TRANS_NAME:
row[index] = getTransMeta().getName();
break;
case TYPE_SYSTEM_INFO_MODIFIED_USER:
row[index] = getTransMeta().getModifiedUser();
break;
case TYPE_SYSTEM_INFO_MODIFIED_DATE:
row[index] = getTransMeta().getModifiedDate();
break;
case TYPE_SYSTEM_INFO_TRANS_BATCH_ID:
row[index] = new Long( getTrans().getBatchId() );
break;
case TYPE_SYSTEM_INFO_JOB_BATCH_ID:
row[index] = new Long( getTrans().getPassedBatchId() );
break;
case TYPE_SYSTEM_INFO_HOSTNAME_REAL:
row[index] = Const.getHostnameReal();
break;
case TYPE_SYSTEM_INFO_HOSTNAME:
row[index] = Const.getHostname();
break;
case TYPE_SYSTEM_INFO_IP_ADDRESS:
try {
row[index] = Const.getIPAddress();
} catch ( Exception e ) {
throw new KettleException( e );
}
break;
case TYPE_SYSTEM_INFO_FILENAME:
row[index] = getTransMeta().getFilename();
break;
case TYPE_SYSTEM_INFO_ARGUMENT_01:
case TYPE_SYSTEM_INFO_ARGUMENT_02:
case TYPE_SYSTEM_INFO_ARGUMENT_03:
case TYPE_SYSTEM_INFO_ARGUMENT_04:
case TYPE_SYSTEM_INFO_ARGUMENT_05:
case TYPE_SYSTEM_INFO_ARGUMENT_06:
case TYPE_SYSTEM_INFO_ARGUMENT_07:
case TYPE_SYSTEM_INFO_ARGUMENT_08:
case TYPE_SYSTEM_INFO_ARGUMENT_09:
case TYPE_SYSTEM_INFO_ARGUMENT_10:
argnr = meta.getFieldType()[i].ordinal() - SystemDataTypes.TYPE_SYSTEM_INFO_ARGUMENT_01.ordinal();
if ( getTrans().getArguments() != null && argnr < getTrans().getArguments().length ) {
row[index] = getTrans().getArguments()[argnr];
} else {
row[index] = null;
}
break;
case TYPE_SYSTEM_INFO_KETTLE_VERSION:
row[index] = BuildVersion.getInstance().getVersion();
break;
case TYPE_SYSTEM_INFO_KETTLE_BUILD_VERSION:
row[index] = BuildVersion.getInstance().getVersion();
break;
case TYPE_SYSTEM_INFO_KETTLE_BUILD_DATE:
row[index] = BuildVersion.getInstance().getBuildDateAsLocalDate();
break;
case TYPE_SYSTEM_INFO_CURRENT_PID:
row[index] = new Long( Management.getPID() );
break;
case TYPE_SYSTEM_INFO_JVM_TOTAL_MEMORY:
row[index] = Runtime.getRuntime().totalMemory();
break;
case TYPE_SYSTEM_INFO_JVM_FREE_MEMORY:
row[index] = Runtime.getRuntime().freeMemory();
break;
case TYPE_SYSTEM_INFO_JVM_MAX_MEMORY:
row[index] = Runtime.getRuntime().maxMemory();
break;
case TYPE_SYSTEM_INFO_JVM_AVAILABLE_MEMORY:
Runtime rt = Runtime.getRuntime();
row[index] = rt.freeMemory() + ( rt.maxMemory() - rt.totalMemory() );
break;
case TYPE_SYSTEM_INFO_AVAILABLE_PROCESSORS:
row[index] = (long) Runtime.getRuntime().availableProcessors();
break;
case TYPE_SYSTEM_INFO_JVM_CPU_TIME:
row[index] = Management.getJVMCpuTime() / 1000000;
break;
case TYPE_SYSTEM_INFO_TOTAL_PHYSICAL_MEMORY_SIZE:
row[index] = Management.getTotalPhysicalMemorySize();
break;
case TYPE_SYSTEM_INFO_TOTAL_SWAP_SPACE_SIZE:
row[index] = Management.getTotalSwapSpaceSize();
break;
case TYPE_SYSTEM_INFO_COMMITTED_VIRTUAL_MEMORY_SIZE:
row[index] = Management.getCommittedVirtualMemorySize();
break;
case TYPE_SYSTEM_INFO_FREE_PHYSICAL_MEMORY_SIZE:
row[index] = Management.getFreePhysicalMemorySize();
break;
case TYPE_SYSTEM_INFO_FREE_SWAP_SPACE_SIZE:
row[index] = Management.getFreeSwapSpaceSize();
break;
case TYPE_SYSTEM_INFO_PREV_WEEK_START:
cal = Calendar.getInstance();
cal.add( Calendar.WEEK_OF_YEAR, -1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_WEEK_END:
cal = Calendar.getInstance();
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_WEEK_OPEN_END:
cal = Calendar.getInstance( Locale.ROOT );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
cal.add( Calendar.DAY_OF_WEEK, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_WEEK_START_US:
cal = Calendar.getInstance( Locale.US );
cal.add( Calendar.WEEK_OF_YEAR, -1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_WEEK_END_US:
cal = Calendar.getInstance( Locale.US );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_WEEK_START:
cal = Calendar.getInstance();
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_WEEK_END:
cal = Calendar.getInstance();
cal.add( Calendar.WEEK_OF_YEAR, 1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_WEEK_OPEN_END:
cal = Calendar.getInstance( Locale.ROOT );
cal.add( Calendar.WEEK_OF_YEAR, 1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
cal.add( Calendar.DAY_OF_WEEK, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_WEEK_START_US:
cal = Calendar.getInstance( Locale.US );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_WEEK_END_US:
cal = Calendar.getInstance( Locale.US );
cal.add( Calendar.WEEK_OF_YEAR, 1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_WEEK_START:
cal = Calendar.getInstance();
cal.add( Calendar.WEEK_OF_YEAR, 1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_WEEK_END:
cal = Calendar.getInstance();
cal.add( Calendar.WEEK_OF_YEAR, 2 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_WEEK_OPEN_END:
cal = Calendar.getInstance( Locale.ROOT );
cal.add( Calendar.WEEK_OF_YEAR, 2 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
cal.add( Calendar.DAY_OF_WEEK, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_WEEK_START_US:
cal = Calendar.getInstance( Locale.US );
cal.add( Calendar.WEEK_OF_YEAR, 1 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_WEEK_END_US:
cal = Calendar.getInstance( Locale.US );
cal.add( Calendar.WEEK_OF_YEAR, 2 );
cal.set( Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, -1 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_QUARTER_START:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, -3 - ( cal.get( Calendar.MONTH ) % 3 ) );
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_QUARTER_END:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, -1 - ( cal.get( Calendar.MONTH ) % 3 ) );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DATE ) );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_QUARTER_START:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, 0 - ( cal.get( Calendar.MONTH ) % 3 ) );
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_QUARTER_END:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, 2 - ( cal.get( Calendar.MONTH ) % 3 ) );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DATE ) );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_QUARTER_START:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, 3 - ( cal.get( Calendar.MONTH ) % 3 ) );
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_QUARTER_END:
cal = Calendar.getInstance();
cal.add( Calendar.MONTH, 5 - ( cal.get( Calendar.MONTH ) % 3 ) );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DATE ) );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_YEAR_START:
cal = Calendar.getInstance();
cal.add( Calendar.YEAR, -1 );
cal.set( Calendar.DAY_OF_YEAR, cal.getActualMinimum( Calendar.DATE ) );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREV_YEAR_END:
cal = Calendar.getInstance();
cal.set( Calendar.DAY_OF_YEAR, cal.getActualMinimum( Calendar.DATE ) );
cal.add( Calendar.DAY_OF_YEAR, -1 );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_YEAR_START:
cal = Calendar.getInstance();
cal.set( Calendar.DAY_OF_YEAR, cal.getActualMinimum( Calendar.DATE ) );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_THIS_YEAR_END:
cal = Calendar.getInstance();
cal.add( Calendar.YEAR, 1 );
cal.set( Calendar.DAY_OF_YEAR, cal.getActualMinimum( Calendar.DATE ) );
cal.add( Calendar.DAY_OF_YEAR, -1 );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_YEAR_START:
cal = Calendar.getInstance();
cal.add( Calendar.YEAR, 1 );
cal.set( Calendar.DAY_OF_YEAR, cal.getActualMinimum( Calendar.DATE ) );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_NEXT_YEAR_END:
cal = Calendar.getInstance();
cal.add( Calendar.YEAR, 2 );
cal.set( Calendar.DAY_OF_YEAR, cal.getActualMinimum( Calendar.DATE ) );
cal.add( Calendar.DAY_OF_YEAR, -1 );
cal.set( Calendar.HOUR_OF_DAY, 23 );
cal.set( Calendar.MINUTE, 59 );
cal.set( Calendar.SECOND, 59 );
cal.set( Calendar.MILLISECOND, 999 );
row[index] = cal.getTime();
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_RESULT:
Result previousResult = getTrans().getPreviousResult();
boolean result = false;
if ( previousResult != null ) {
result = previousResult.getResult();
}
row[index] = result;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_EXIT_STATUS:
previousResult = getTrans().getPreviousResult();
long value = 0;
if ( previousResult != null ) {
value = previousResult.getExitStatus();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_ENTRY_NR:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getEntryNr();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_FILES:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getResultFiles().size();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_FILES_RETRIEVED:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrFilesRetrieved();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_DELETED:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesDeleted();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_INPUT:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesInput();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_OUTPUT:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesOutput();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_READ:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesRead();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_REJETED:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesRejected();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_UPDATED:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesUpdated();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_LINES_WRITTEN:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrLinesWritten();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_ROWS:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getRows().size();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_IS_STOPPED:
previousResult = getTrans().getPreviousResult();
boolean stop = false;
if ( previousResult != null ) {
stop = previousResult.isStopped();
}
row[index] = stop;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_NR_ERRORS:
previousResult = getTrans().getPreviousResult();
value = 0;
if ( previousResult != null ) {
value = previousResult.getNrErrors();
}
row[index] = value;
break;
case TYPE_SYSTEM_INFO_PREVIOUS_RESULT_LOG_TEXT:
previousResult = getTrans().getPreviousResult();
String errorReason = null;
if ( previousResult != null ) {
errorReason = previousResult.getLogText();
}
row[index] = errorReason;
break;
default:
break;
}
}
return row;
}
public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {
Object[] row;
if ( data.readsRows ) {
row = getRow();
if ( row == null ) {
setOutputDone();
return false;
}
if ( first ) {
first = false;
data.outputRowMeta = getInputRowMeta().clone();
meta.getFields( data.outputRowMeta, getStepname(), null, null, this, repository, metaStore );
}
} else {
row = new Object[] {}; // empty row
incrementLinesRead();
if ( first ) {
first = false;
data.outputRowMeta = new RowMeta();
meta.getFields( data.outputRowMeta, getStepname(), null, null, this, repository, metaStore );
}
}
RowMetaInterface imeta = getInputRowMeta();
if ( imeta == null ) {
imeta = new RowMeta();
this.setInputRowMeta( imeta );
}
row = getSystemData( imeta, row );
if ( log.isRowLevel() ) {
logRowlevel( "System info returned: " + data.outputRowMeta.getString( row ) );
}
putRow( data.outputRowMeta, row );
if ( !data.readsRows ) {
// Just one row and then stop!
setOutputDone();
return false;
}
return true;
}
public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
meta = (SystemDataMeta) smi;
data = (SystemDataData) sdi;
if ( super.init( smi, sdi ) ) {
data.readsRows = getStepMeta().getRemoteInputSteps().size() > 0;
List<StepMeta> previous = getTransMeta().findPreviousSteps( getStepMeta() );
if ( previous != null && previous.size() > 0 ) {
data.readsRows = true;
}
return true;
}
return false;
}
public void dispose( StepMetaInterface smi, StepDataInterface sdi ) {
super.dispose( smi, sdi );
}
}