/*
* This file is part of PaloKettlePlugin.
*
* PaloKettlePlugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PaloKettlePlugin is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with PaloKettlePlugin. If not, see <http://www.gnu.org/licenses/>.
*
* Portions Copyright 2008 Stratebi Business Solutions, S.L.
* Portions Copyright 2011 De Bortoli Wines Pty Limited (Australia)
* Portions Copyright 2011 - 2013 Pentaho Corporation
*/
package org.pentaho.di.trans.steps.palo.cellinput;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.palo.core.PaloHelper;
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;
public class PaloCellInput extends BaseStep implements StepInterface {
private PaloCellInputMeta meta;
private PaloCellInputData data;
private ListenerWithException listener;
public PaloCellInput( final StepMeta stepMeta, final StepDataInterface stepDataInterface, final int copyNr,
final TransMeta transMeta, final Trans trans ) {
super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
}
private abstract class ListenerWithException implements PaloHelper.Listener {
protected Exception throwedException = null;
}
public final boolean processRow( final StepMetaInterface smi, final StepDataInterface sdi ) throws KettleException {
this.logBasic( "Getting row meta." );
final RowMetaInterface rowMeta =
data.helper.getCellRowMeta( meta.getCube(), meta.getFields(), meta.getCubeMeasure() );
this.logBasic( "Number of fields:" + meta.getFields().size() );
this.logBasic( "Row Meta Size: " + rowMeta.size() );
this.logBasic( "Creating Listener." );
listener = new ListenerWithException() {
private boolean stop = false;
private boolean cancel = false;
public void oneMoreElement( final Object element ) {
final Object[] row = (Object[]) element;
try {
assert ( rowMeta.size() != row.length );
incrementLinesInput();
putRow( rowMeta, row );
} catch ( Exception ex ) {
this.throwedException = ex;
this.cancel();
}
}
public void prepareElements( final int maxNumberOfElements ) {
}
public void stop() {
this.stop = true;
}
public void resume() {
this.stop = false;
}
public boolean getStop() {
return stop;
}
public void cancel() {
this.cancel = true;
}
public boolean getCancel() {
return this.cancel;
}
};
data.helper.getCells( meta.getCube(), rowMeta, listener );
if ( listener.throwedException != null ) {
throw new KettleException( "Failed to process some row", listener.throwedException );
}
setOutputDone();
return false;
}
public void pauseRunning() {
this.listener.stop();
this.logDebug( "Process Stopped" );
}
public void stopAll() {
this.listener.cancel();
this.logDebug( "Process Cancelled" );
}
public void resumeRunning() {
this.listener.resume();
this.logDebug( "Process Resumed" );
}
public final boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
meta = (PaloCellInputMeta) smi;
data = (PaloCellInputData) sdi;
if ( super.init( smi, sdi ) ) {
try {
this.logDebug( "Meta Fields: " + meta.getFields().size() );
data.helper = new PaloHelper( meta.getDatabaseMeta(), getLogLevel() );
data.helper.connect();
return true;
} catch ( Exception e ) {
logError( "An error occurred, processing will be stopped: " + e.getMessage() );
setErrors( 1 );
stopAll();
}
}
return false;
}
public void dispose( StepMetaInterface smi, StepDataInterface sdi ) {
data.helper.disconnect();
super.dispose( smi, sdi );
}
}