diff --git a/core/src/main/java/pt/webdetails/cda/utils/TableModelUtils.java b/core/src/main/java/pt/webdetails/cda/utils/TableModelUtils.java index fb24b9b142..2ad9fee395 100644 --- a/core/src/main/java/pt/webdetails/cda/utils/TableModelUtils.java +++ b/core/src/main/java/pt/webdetails/cda/utils/TableModelUtils.java @@ -471,6 +471,12 @@ public static TableModel appendTableModel( final TableModel tableModelA, final T final TypedTableModel typedTableModel = new TypedTableModel( colNames, colTypes, rowCount ); for ( int r = 0; r < tableModelA.getRowCount(); r++ ) { for ( int c = 0; c < colTypes.length; c++ ) { + if ( c < typedTableModel.getColumnCount() && c < tableModelA.getColumnCount() ) { + if ( !typedTableModel.getColumnClass( c ).equals( tableModelA.getColumnClass( c ) ) ) { + logger.error( "type mismatch, appending '" + tableModelA.getColumnClass( c ).getName() + "' to '" + + typedTableModel.getColumnClass( c ).getName() + "'" ); + } + } typedTableModel.setValueAt( tableModelA.getValueAt( r, c ), r, c ); } } @@ -479,6 +485,12 @@ public static TableModel appendTableModel( final TableModel tableModelA, final T int rowCountOffset = tableModelA.getRowCount(); for ( int r = 0; r < tableModelB.getRowCount(); r++ ) { for ( int c = 0; c < colTypes.length; c++ ) { + if ( c < typedTableModel.getColumnCount() && c < tableModelB.getColumnCount() ) { + if ( !typedTableModel.getColumnClass( c ).equals( tableModelB.getColumnClass( c ) ) ) { + logger.error( "type mismatch, appending '" + tableModelB.getColumnClass( c ).getName() + "' to '" + + typedTableModel.getColumnClass( c ).getName() + "'" ); + } + } typedTableModel.setValueAt( tableModelB.getValueAt( r, c ), r + rowCountOffset, c ); } } diff --git a/core/src/main/java/pt/webdetails/robochef/TableModelInput.java b/core/src/main/java/pt/webdetails/robochef/TableModelInput.java index 2f003e20dc..c00d121377 100644 --- a/core/src/main/java/pt/webdetails/robochef/TableModelInput.java +++ b/core/src/main/java/pt/webdetails/robochef/TableModelInput.java @@ -17,6 +17,8 @@ import javax.swing.table.TableModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.pentaho.di.core.row.RowMeta; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.core.row.ValueMetaInterface; @@ -28,6 +30,7 @@ import org.pentaho.di.core.row.value.ValueMetaString; public class TableModelInput extends RowProducerBridge { + private static final Log logger = LogFactory.getLog( TableModelInput.class ); public synchronized Callable getCallableRowProducer( final TableModel tableModel, final boolean markFinished ) { final Callable callable = new Callable() { @@ -60,42 +63,48 @@ private Object getDataObjectForColumn( final ValueMetaInterface valueMeta, final } Object newValue; - switch( valueMeta.getType() ) { - case ValueMetaInterface.TYPE_STRING: - newValue = String.valueOf( value ); - break; - case ValueMetaInterface.TYPE_NUMBER: - if ( value instanceof Double ) { - newValue = value; - } else { - newValue = Double.valueOf( value.toString() ); - } - break; - case ValueMetaInterface.TYPE_INTEGER: - if ( value instanceof Long ) { + try { + switch ( valueMeta.getType() ) { + case ValueMetaInterface.TYPE_STRING: + newValue = String.valueOf( value ); + break; + case ValueMetaInterface.TYPE_NUMBER: + if ( value instanceof Double ) { + newValue = value; + } else { + newValue = Double.valueOf( value.toString() ); + } + break; + case ValueMetaInterface.TYPE_INTEGER: + if ( value instanceof Long ) { + newValue = value; + } else { + newValue = Long.valueOf( value.toString() ); + } + break; + case ValueMetaInterface.TYPE_DATE: newValue = value; - } else { - newValue = Long.valueOf( value.toString() ); - } - break; - case ValueMetaInterface.TYPE_DATE: - newValue = value; - break; - case ValueMetaInterface.TYPE_BIGNUMBER: - if ( value instanceof java.math.BigDecimal ) { + break; + case ValueMetaInterface.TYPE_BIGNUMBER: + if ( value instanceof java.math.BigDecimal ) { + newValue = value; + } else { + newValue = java.math.BigDecimal.valueOf( ( (java.math.BigInteger) value ).doubleValue() ); + } + break; + case ValueMetaInterface.TYPE_BOOLEAN: newValue = value; - } else { - newValue = java.math.BigDecimal.valueOf( ( (java.math.BigInteger) value ).doubleValue() ); - } - break; - case ValueMetaInterface.TYPE_BOOLEAN: - newValue = value; - break; - default: - throw new IllegalArgumentException( - String.format( "ValueMeta mismatch %s (%s)", valueMeta.toString(), value ) ); + break; + default: + throw new IllegalArgumentException( + String.format( "ValueMeta mismatch %s (%s)", valueMeta.toString(), value ) ); + } + return newValue; + } catch ( NumberFormatException e ) { + logger.error( "type mismatch in column '" + valueMeta.getName() + "' expecting '" + valueMeta.getTypeDesc() + + "' received '" + value.getClass().getName() + "'" ); + throw e; } - return newValue; } private RowMetaInterface getRowMetaForTableModel( final TableModel tableModel ) throws IllegalArgumentException {