@Override public ValueMetaInterface getValueFromSQLType( DatabaseMeta databaseMeta, String name, ResultSetMetaData rm, int index, boolean ignoreLength, boolean lazyConversion ) throws KettleDatabaseException { try { int type = rm.getColumnType( index ); if ( type == java.sql.Types.OTHER ) { String columnTypeName = rm.getColumnTypeName( index ); if ( "INET".equalsIgnoreCase( columnTypeName ) ) { ValueMetaInternetAddress valueMeta = new ValueMetaInternetAddress( name ); // Also get original column details, comment, etc. // getOriginalColumnMetadata( valueMeta, rm, index, ignoreLength ); return valueMeta; } } return null; } catch ( Exception e ) { throw new KettleDatabaseException( "Error evaluating Internet address value metadata", e ); } }
@Override public Object getNativeDataType( Object object ) throws KettleValueException { return getInternetAddress( object ); }
return (InetAddress) object; case STORAGE_TYPE_BINARY_STRING: return (InetAddress) convertBinaryStringToNativeType( (byte[]) object ); case STORAGE_TYPE_INDEXED: return (InetAddress) index[( (Integer) object )]; default: throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." ); return convertStringToInternetAddress( (String) object ); case STORAGE_TYPE_BINARY_STRING: return convertStringToInternetAddress( (String) convertBinaryStringToNativeType( (byte[]) object ) ); case STORAGE_TYPE_INDEXED: return convertStringToInternetAddress( (String) index[( (Integer) object ).intValue()] ); default: throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." ); return convertNumberToInternetAddress( (Double) object ); case STORAGE_TYPE_BINARY_STRING: return convertNumberToInternetAddress( (Double) convertBinaryStringToNativeType( (byte[]) object ) ); case STORAGE_TYPE_INDEXED: return convertNumberToInternetAddress( (Double) index[( (Integer) object ).intValue()] ); default: throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." ); return convertIntegerToInternetAddress( (Long) object ); case STORAGE_TYPE_BINARY_STRING: return convertIntegerToInternetAddress( (Long) convertBinaryStringToNativeType( (byte[]) object ) ); case STORAGE_TYPE_INDEXED: return convertIntegerToInternetAddress( (Long) index[( (Integer) object ).intValue()] );
@Override public String getString( Object object ) throws KettleValueException { return convertInternetAddressToString( getInternetAddress( object ) ); }
@Override public byte[] getBinaryString( Object object ) throws KettleValueException { if ( isStorageBinaryString() && identicalFormat ) { return (byte[]) object; // shortcut it directly for better performance. } if ( object == null ) { return null; } switch ( storageType ) { case STORAGE_TYPE_NORMAL: return convertStringToBinaryString( getString( object ) ); case STORAGE_TYPE_BINARY_STRING: return convertStringToBinaryString( getString( convertStringToInternetAddress( convertBinaryStringToString( (byte[]) object ) ) ) ); case STORAGE_TYPE_INDEXED: return convertStringToBinaryString( convertInternetAddressToString( (InetAddress) index[( (Integer) object )] ) ); default: throw new KettleValueException( toString() + " : Unknown storage type " + storageType + " specified." ); } }
@Override public int compare( Object data1, Object data2 ) throws KettleValueException { InetAddress inet1 = getInternetAddress( data1 ); InetAddress inet2 = getInternetAddress( data2 ); int cmp = 0; if ( inet1 == null ) { if ( inet2 == null ) { cmp = 0; } else { cmp = -1; } } else if ( inet2 == null ) { cmp = 1; } else { BigDecimal bd1 = getBigNumber( inet1 ); BigDecimal bd2 = getBigNumber( inet2 ); cmp = bd1.compareTo( bd2 ); } if ( isSortedDescending() ) { return -cmp; } else { return cmp; } }
@Test public void setValue_InetAddress() throws Exception { ValueMetaInternetAddress v = new ValueMetaInternetAddress( "IP" ); RowMetaInterface row = mock( RowMetaInterface.class ); doReturn( v ).when( row ).searchValueMeta( anyString() ); doReturn( 0 ).when( row ).indexOfValue( anyString() ); Object[] data = new Object[1]; new FieldHelper( row, "IP" ).setValue( data, InetAddress.getLoopbackAddress() ); assertEquals( InetAddress.getLoopbackAddress(), data[0] ); }
@Override public Long getInteger( Object object ) throws KettleValueException { InetAddress address = getInternetAddress( object ); if ( address == null ) { return null; } long total = 0L; byte[] addr = address.getAddress(); if ( addr.length > 8 ) { throw new KettleValueException( "Unable to convert Internet Address v6 to an Integer: " + getString( object ) + " (The precision is too high to be contained in a long integer value)" ); } for ( int i = 0; i < addr.length; i++ ) { total += ( addr[i] & 0xFF ) * ( (long) Math.pow( 256, ( addr.length - 1 - i ) ) ); } return total; }
/** * Convert the specified data to the data type specified in this object. * * @param meta2 * the metadata of the object to be converted * @param data2 * the data of the object to be converted * @return the object in the data type of this value metadata object * @throws KettleValueException * in case there is a data conversion error */ @Override public Object convertData( ValueMetaInterface meta2, Object data2 ) throws KettleValueException { switch ( meta2.getType() ) { case TYPE_STRING: return convertStringToInternetAddress( meta2.getString( data2 ) ); case TYPE_INTEGER: return convertIntegerToInternetAddress( meta2.getInteger( data2 ) ); case TYPE_NUMBER: return convertNumberToInternetAddress( meta2.getNumber( data2 ) ); case TYPE_BIGNUMBER: return convertBigNumberToInternetAddress( meta2.getBigNumber( data2 ) ); default: throw new KettleValueException( meta2.toStringMeta() + " : can't be converted to an Internet Address" ); } }
protected InetAddress convertBigNumberToInternetAddress( BigDecimal bd ) throws KettleValueException { if ( bd == null ) { return null; } return convertIntegerToInternetAddress( bd.longValue() ); }
return convertData( convertMeta, pol );
@Test public void getInetAddress_Test() throws Exception { ValueMetaInternetAddress v = new ValueMetaInternetAddress( "IP" ); RowMetaInterface row = mock( RowMetaInterface.class ); doReturn( v ).when( row ).searchValueMeta( anyString() ); doReturn( 0 ).when( row ).indexOfValue( anyString() ); assertEquals( InetAddress.getLoopbackAddress(), new FieldHelper( row, "IP" ).getInetAddress( new Object[] { InetAddress.getLoopbackAddress() } ) ); }
protected InetAddress convertNumberToInternetAddress( Double d ) throws KettleValueException { if ( d == null ) { return null; } long nanos = d.longValue(); return convertIntegerToInternetAddress( nanos ); }
valueMeta = new ValueMetaTimestamp(); } else if ( type.equals( "Internet Address" ) ) { valueMeta = new ValueMetaInternetAddress();
public InetAddress getInetAddress( Object[] dataRow ) throws KettleValueException { return ( (ValueMetaInternetAddress) meta ).getInternetAddress( dataRow[index] ); }
@Test public void getNativeDataTypeSimpleName_InetAddress() { ValueMetaInternetAddress v = new ValueMetaInternetAddress(); assertEquals( "InetAddress", FieldHelper.getNativeDataTypeSimpleName( v ) ); }
@Override public BigDecimal getBigNumber( Object object ) throws KettleValueException { InetAddress address = getInternetAddress( object ); if ( null == address ) { return null; } BigInteger bi = BigInteger.ZERO; byte[] addr = address.getAddress(); for ( byte aByte : addr ) { bi = bi.shiftLeft( 8 ).add( BigInteger.valueOf( aByte & 0xFF ) ); } return new BigDecimal( bi ); }
@Override public ValueMetaInterface getMetadataPreview( DatabaseMeta databaseMeta, ResultSet rs ) throws KettleDatabaseException { try { if ( "INET".equalsIgnoreCase( rs.getString( "TYPE_NAME" ) ) ) { ValueMetaInterface vmi = super.getMetadataPreview( databaseMeta, rs ); ValueMetaInterface valueMeta = new ValueMetaInternetAddress( name ); valueMeta.setLength( vmi.getLength() ); valueMeta.setOriginalColumnType( vmi.getOriginalColumnType() ); valueMeta.setOriginalColumnTypeName( vmi.getOriginalColumnTypeName() ); valueMeta.setOriginalNullable( vmi.getOriginalNullable() ); valueMeta.setOriginalPrecision( vmi.getOriginalPrecision() ); valueMeta.setOriginalScale( vmi.getOriginalScale() ); valueMeta.setOriginalSigned( vmi.getOriginalSigned() ); return valueMeta; } } catch ( SQLException e ) { throw new KettleDatabaseException( e ); } return null; }
@Override public Object cloneValueData( Object object ) throws KettleValueException { InetAddress inetAddress = getInternetAddress( object ); if ( inetAddress == null ) { return null; } try { return InetAddress.getByAddress( inetAddress.getAddress() ); } catch ( Exception e ) { throw new KettleValueException( "Unable to clone Internet Address", e ); } }
@Test public void getGetSignature_InetAddress() { ValueMetaInternetAddress v = new ValueMetaInternetAddress( "IP" ); String accessor = FieldHelper.getAccessor( true, "IP" ); assertEquals( "InetAddress IP = get(Fields.In, \"IP\").getInetAddress(r);", FieldHelper.getGetSignature( accessor, v ) ); assertNotNull( getMethod( FieldHelper.class, "getInetAddress", Object[].class ) ); }