/*
* This software 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.
*
* This software 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 this software. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2011 De Bortoli Wines Pty Limited (Australia)
*/
package org.pentaho.di.trans.steps.openerp.objectinput;
import java.util.ArrayList;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.openerp.core.FieldMapping;
import org.pentaho.di.openerp.core.OpenERPHelper;
import org.pentaho.di.openerp.core.ReadFilter;
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 com.debortoliwines.openerp.api.FilterCollection;
import com.debortoliwines.openerp.api.Row;
import com.debortoliwines.openerp.api.RowCollection;
import com.debortoliwines.openerp.api.FilterCollection.FilterOperator;
public class OpenERPObjectInput extends BaseStep implements StepInterface {
private OpenERPObjectInputMeta meta;
private OpenERPObjectInputData data;
public OpenERPObjectInput( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta,
Trans trans ) {
super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
}
private void putRow( Row row, RowMetaInterface rowMeta ) throws KettleStepException {
ArrayList<FieldMapping> mappings = meta.getMappings();
Object[] copyRow = new Object[mappings.size()];
int i = 0;
for ( FieldMapping map : mappings ) {
Object value = row.get( map.source_field );
if ( map.source_index >= 0 && value != null && value instanceof Object[] ) {
copyRow[i] = ( ( (Object[]) value ).length == 0 ? null : ( (Object[]) value )[map.source_index] );
} else {
copyRow[i] = value;
}
copyRow[i] = fixType( map, copyRow[i] );
i++;
}
putRow( rowMeta, copyRow );
}
private Object fixType( FieldMapping map, Object value ) {
// Nothing to fix
if ( value == null ) {
return null;
}
Object fixedValue = value;
if ( map.target_field_type == ValueMetaInterface.TYPE_INTEGER ) {
fixedValue = Long.parseLong( value.toString() );
} else if ( map.target_field_type == ValueMetaInterface.TYPE_NUMBER ) {
fixedValue = Double.parseDouble( value.toString() );
// ONE2MANY and MANY2MANY fields
} else if ( map.target_field_type == ValueMetaInterface.TYPE_STRING && value instanceof Object[] ) {
String stringValue = "";
for ( Object singleValue : (Object[]) value ) {
stringValue += "," + singleValue.toString();
}
fixedValue = stringValue.substring( 1 );
}
return fixedValue;
}
public boolean processRow( final StepMetaInterface smi, final StepDataInterface sdi ) throws KettleException {
this.logBasic( "Getting Field Row Meta." );
this.logBasic( "Getting Rows." );
if ( first == true ) {
first = false;
try {
final RowMetaInterface rowMeta = meta.getRowMeta();
// Building search filter
FilterCollection filter = new FilterCollection();
for ( int i = 0; i < meta.getFilterList().size(); i++ ) {
ReadFilter filterItem = meta.getFilterList().get( i );
// Handle logical operators
if ( filterItem.getOperator().equalsIgnoreCase( "not" ) ) {
filter.add( FilterOperator.NOT );
} else if ( filterItem.getOperator().equalsIgnoreCase( "or" ) ) {
filter.add( FilterOperator.OR );
}
filter.add( filterItem.getFieldName(), filterItem.getComparator(), filterItem.getValue() );
this.logBasic( "Setting filter: [" + filterItem.getFieldName() + "," + filterItem.getComparator() + ","
+ filterItem.getValue() + "]" );
}
int rowCount = data.helper.getModelDataCount( meta.getModelName(), filter );
int offset = 0;
int limit = meta.getReadBatchSize();
while ( offset < rowCount ) {
if ( isStopped() ) {
break;
}
RowCollection rows =
data.helper.getModelData( meta.getModelName(), filter, meta.getMappings(), offset, limit );
for ( Row row : rows ) {
try {
putRow( row, rowMeta );
} catch ( KettleStepException e ) {
logError( "An error occurred, processing will be stopped: " + e.getMessage() );
setErrors( 1 );
stopAll();
}
incrementLinesInput();
offset++;
}
}
} catch ( Exception e ) {
throw new KettleException( e.getMessage() );
}
}
this.logBasic( "Process Ended." );
setOutputDone();
return false;
}
public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
meta = (OpenERPObjectInputMeta) smi;
data = (OpenERPObjectInputData) sdi;
if ( super.init( smi, sdi ) ) {
try {
this.logDebug( "Initializing OpenERP Session" );
data.helper = new OpenERPHelper( meta.getDatabaseMeta() );
data.helper.StartSession();
return true;
} catch ( Exception e ) {
logError( "An error occurred, processing will be stopped: " + e.getMessage() );
setErrors( 1 );
stopAll();
}
}
return false;
}
}