/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 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.trans.steps.jsoninput.reader;
import java.util.Map;
import net.minidev.json.JSONObject;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleValueException;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.core.row.RowDataUtil;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.trans.steps.jsoninput.JsonInputData;
/**
* Converts raw reader to output row values
*/
public class RowOutputConverter {
private final LogChannelInterface log;
public RowOutputConverter( LogChannelInterface log ) {
this.log = log;
}
private Object getValue( ValueMetaInterface targetMeta, ValueMetaInterface strConvertMeta, Object value )
throws KettleValueException {
if ( targetMeta.isNumeric() ) {
try {
// attempt direct conversion
return targetMeta.getNativeDataType( value );
} catch ( KettleValueException e ) {
if ( log.isDebug() ) {
log.logDebug( e.getLocalizedMessage(), e );
}
}
}
// convert from string
String strValue = getStringValue( value );
return targetMeta.convertDataFromString( strValue, strConvertMeta, null, null, targetMeta.getTrimType() );
}
private String getStringValue( Object jo ) {
String nodevalue = null;
if ( jo != null ) {
if ( jo instanceof Map ) {
@SuppressWarnings( "unchecked" )
Map<String, ?> asStrMap = (Map<String, ?>) jo;
nodevalue = JSONObject.toJSONString( asStrMap );
} else {
nodevalue = jo.toString();
}
}
return nodevalue;
}
public Object[] getRow( Object[] baseOutputRow, Object[] rawPartRow, JsonInputData data ) throws KettleException {
if ( rawPartRow == null ) {
return null;
}
for ( int i = 0; i < rawPartRow.length; i++ ) {
int outIdx = data.totalpreviousfields + i;
Object val =
getValue( data.outputRowMeta.getValueMeta( outIdx ), data.convertRowMeta.getValueMeta( outIdx ),
rawPartRow[i] );
rawPartRow[i] = val;
if ( val == null && data.repeatedFields.get( i ) && data.previousRow != null ) {
rawPartRow[i] = data.previousRow[outIdx];
}
}
data.previousRow = RowDataUtil.addRowData( baseOutputRow, data.totalpreviousfields, rawPartRow );
return data.previousRow;
}
}