/*! ******************************************************************************
*
* 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.prioritizestreams;
import org.pentaho.di.core.RowSet;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleRowException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.i18n.BaseMessages;
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;
/**
* Prioritize INPUT Streams.
*
* @author Samatar
* @since 30-06-2008
*/
public class PrioritizeStreams extends BaseStep implements StepInterface {
private static Class<?> PKG = PrioritizeStreamsMeta.class; // for i18n purposes, needed by Translator2!!
private PrioritizeStreamsMeta meta;
private PrioritizeStreamsData data;
public PrioritizeStreams( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr,
TransMeta transMeta, Trans trans ) {
super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
}
public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {
meta = (PrioritizeStreamsMeta) smi;
data = (PrioritizeStreamsData) sdi;
if ( first ) {
if ( meta.getStepName() != null || meta.getStepName().length > 0 ) {
data.stepnrs = meta.getStepName().length;
data.rowSets = new RowSet[data.stepnrs];
for ( int i = 0; i < data.stepnrs; i++ ) {
data.rowSets[i] = findInputRowSet( meta.getStepName()[i] );
if ( i > 0 ) {
// Compare layout of first stream with the current stream
checkInputLayoutValid( data.rowSets[0].getRowMeta(), data.rowSets[i].getRowMeta() );
}
}
} else {
// error
throw new KettleException( BaseMessages.getString( PKG, "PrioritizeStreams.Error.NotInputSteps" ) );
}
data.currentRowSet = data.rowSets[0];
} // end if first, part 1
Object[] input = getOneRow();
while ( input == null && data.stepnr < data.stepnrs - 1 && !isStopped() ) {
input = getOneRow();
}
if ( input == null ) {
// no more input to be expected...
setOutputDone();
return false;
}
if ( first ) {
// Take the row Meta from the first rowset read
data.outputRowMeta = data.currentRowSet.getRowMeta();
first = false;
}
putRow( data.outputRowMeta, input );
return true;
}
private Object[] getOneRow() throws KettleException {
Object[] input = getRowFrom( data.currentRowSet );
if ( input == null ) {
if ( data.stepnr < data.stepnrs - 1 ) {
// read rows from the next step
data.stepnr++;
data.currentRowSet = data.rowSets[data.stepnr];
input = getRowFrom( data.currentRowSet );
}
}
return input;
}
public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
meta = (PrioritizeStreamsMeta) smi;
data = (PrioritizeStreamsData) sdi;
if ( super.init( smi, sdi ) ) {
// Add init code here.
data.stepnr = 0;
return true;
}
return false;
}
public void dispose( StepMetaInterface smi, StepDataInterface sdi ) {
data.currentRowSet = null;
data.rowSets = null;
super.dispose( smi, sdi );
}
/**
* Checks whether 2 template rows are compatible for the mergestep.
*
* @param referenceRow
* Reference row
* @param compareRow
* Row to compare to
*
* @return true when templates are compatible.
* @throws KettleRowException
* in case there is a compatibility error.
*/
protected void checkInputLayoutValid( RowMetaInterface referenceRowMeta, RowMetaInterface compareRowMeta ) throws KettleRowException {
if ( referenceRowMeta != null && compareRowMeta != null ) {
BaseStep.safeModeChecking( referenceRowMeta, compareRowMeta );
}
}
}