Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   *  Copyright 2009-2014 Pavel Ponec
   *
   *  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.ujorm.orm;
 
 import java.awt.Color;
 import java.sql.Blob;
 import java.sql.Clob;
 import java.util.List;
A type service for popular Java types and more.

Author(s):
Ponec
 
 public class TypeService implements ITypeService<Object,Object> {
 
     // --- Java type book: ---
 
     public static final char UNDEFINED = (char) 0;
     public static final char BOOLEAN = 1;
     public static final char BYTE = 2;
     public static final char CHAR = 3;
     public static final char SHORT = 4;
     public static final char INT = 5;
     public static final char LONG = 6;
     public static final char FLOAT = 7;
     public static final char DOUBLE = 8;
     public static final char BIG_DECI = 9;
     public static final char BIG_INTE = 10;
     public static final char STRING = 11;
     public static final char BYTES = 12;
     public static final char DATE_UTIL = 13;
     public static final char DATE_SQL = 14;
     public static final char TIME_SQL = 15;
     public static final char TIMESTAMP = 16;
     public static final char BLOB = 17;
     public static final char CLOB = 18;
     public static final char EXPORT_ENUM = 19;
     public static final char STRING_WRAP = 20;
     public static final char BYTES_WRAP = 21;
     public static final char ENUM = 22;
     public static final char COLOR = 23;

    
Constructor for the String argument type
 
     private static final Class[] STR_ARGS = new Class[] {String.class};

    
Constructor for the byte[] argument type
 
     private static final Class[] BYTES_ARGS = new Class[] {byte[].class};

    
The method returns a Java data type code.

Parameters:
column Colum provides a Type, there is supported a relation types too.
Returns:
Java type code for frequently used types.
 
     public static char getTypeCode(final MetaColumn column) {
         final Class type = column.getType();
         if (StringWrapper.class.isAssignableFrom(type)) return type.isEnum()
                 ? 
                 : ;
         if (BytesWrapper.class.isAssignableFrom(type)) return ;
         if (type==String.classreturn ;
         if (type==Boolean.classreturn ;
         if (type==Byte.classreturn ;
         if (type==Character.classreturn ;
         if (type==Short.classreturn ;
         if (type==Integer.classreturn ;
         if (type==Long.classreturn ;
         if (type==Float.classreturn ;
         if (type==Double.classreturn ;
         if (type==BigDecimal.classreturn ;
         if (type==BigInteger.classreturn ;
         if (type==byte[].classreturn ;
         if (type==java.util.Date.classreturn ;
         if (type==java.sql.Date.classreturn ;
         if (type==java.sql.Time.classreturn ;
         if (type==java.sql.Timestamp.classreturn ;
         if (type==java.sql.Blob.classreturn ;
         if (type==java.sql.Clob.classreturn ;
        if (type.isEnum()) return ;
        if (type==Color.classreturn ;
        if (column.isForeignKey()) {
            List<MetaColumncolumns = column.getForeignColumns();
            if (columns.size()==1) {
                return getTypeCode(columns.get(0));
            }
        }
        return ;
    }

    
GetValue from the result set by position It must be the same implementation as of(org.ujorm.orm.metaModel.MetaColumn,java.sql.CallableStatement,int).

Parameters:
mColumn Meta-model column, where the typeCode must be assigned before.
rs The ResultSet instance
c Catabase column index starting at #1
Returns:
Value form the result set.
Throws:
java.sql.SQLException
    public Object getValue(final MetaColumn mColumnfinal ResultSet rsfinal int cthrows SQLException {
        final Object r;
        switch (mColumn.getTypeCode()) {
            case   : r = rs.getBoolean(c); break;
            case      : r = rs.getByte(c); break;
            case      : String s = rs.getString(c); return (s != null && s.length() > 0) ? s.charAt(0) : null;
            case     : r = rs.getShort(c); break;
            case       : r = rs.getInt(c); break;
            case      : r = rs.getLong(c); break;
            case     : r = rs.getFloat(c); break;
            case    : r = rs.getDouble(c); break;
            case  : return rs.getBigDecimal(c);
            case  : BigDecimal d = rs.getBigDecimal(c);
                            return d!=null ? d.toBigInteger() : null;
            case    : return rs.getString(c);
            case     : return rs.getBytes(c);
            case java.sql.Timestamp t = rs.getTimestamp(c);
                            return t!=null ? new java.util.Date(t.getTime()) : null;
            case  : return rs.getDate(c);
            case  : return rs.getTime(c);
            case return rs.getTimestamp(c);
            case      : return rs.getBlob(c);
            case      : return rs.getClob(c);
            case      : int i = rs.getInt(c);
                            return i==0 && rs.wasNull()
                            ? null
                            : mColumn.getType().getEnumConstants()[i] ;
            case     : i = rs.getInt(c);
                            return i==0 && rs.wasNull()
                            ? null
                            : new Color(i);
            case return createStringWrapper(rs.getString(c), mColumn);
            case  : return createBytesWrapper(rs.getBytes(c), mColumn);
            case return findEnum(rs.getString(c), mColumn);
            default       : return rs.getObject(c);
        }
        return rs.wasNull() ? null : r;
    }

    
GetValue from the stored precedure by position. It must be the same implementation as of(org.ujorm.orm.metaModel.MetaColumn,java.sql.ResultSet,int).

Parameters:
mColumn Meta-model column, where the typeCode must be assigned before.
rs The CallableStatement instance
c Catabase column index starting at #1
Returns:
Value form the result set.
Throws:
java.sql.SQLException
    public Object getValue(final MetaColumn mColumnfinal CallableStatement rsfinal int cthrows SQLException {
        final Object r;
        switch (mColumn.getTypeCode()) {
            case   : r = rs.getBoolean(c); break;
            case      : r = rs.getByte(c); break;
            case      : String s = rs.getString(c); return (s != null && s.length() > 0) ? s.charAt(0) : null;
            case     : r = rs.getShort(c); break;
            case       : r = rs.getInt(c); break;
            case      : r = rs.getLong(c); break;
            case     : r = rs.getFloat(c); break;
            case    : r = rs.getDouble(c); break;
            case  : return rs.getBigDecimal(c);
            case  : BigDecimal d = rs.getBigDecimal(c);
                            return d!=null ? d.toBigInteger() : null;
            case    : return rs.getString(c);
            case     : return rs.getBytes(c);
            case java.sql.Timestamp t = rs.getTimestamp(c);
                            return t!=null ? new java.util.Date(t.getTime()) : null;
            case  : return rs.getDate(c);
            case  : return rs.getTime(c);
            case return rs.getTimestamp(c);
            case      : return rs.getBlob(c);
            case      : return rs.getClob(c);
            case      : int i = rs.getInt(c);
                            return i==0 && rs.wasNull()
                            ? null
                            : mColumn.getType().getEnumConstants()[i] ;
            case     : i = rs.getInt(c);
                            return i==0 && rs.wasNull()
                            ? null
                            : new Color(i);
            case return createStringWrapper(rs.getString(c), mColumn);
            case  : return createBytesWrapper(rs.getBytes(c), mColumn);
            case return findEnum(rs.getString(c), mColumn);
            default       : return rs.getObject(c);
        }
        return rs.wasNull() ? null : r;
    }

    
GetValue from the result set by position.

Parameters:
mColumn Meta-model column, where the typeCode must be assigned before.
rs PreparedStatement
value Value to assign
c The database column index starts at #1
Throws:
java.sql.SQLException
    public void setValue
        ( final MetaColumn mColumn
        , final PreparedStatement rs
        , final Object value
        , final int c
        ) throws SQLException {
        if (value==null) {
           final int sqlType = ..of(mColumn).getSqlType();
           rs.setNull(csqlType);
           return;
        }
        switch (mColumn.getTypeCode()) {
            case   : rs.setBoolean(c, (Boolean)value); break;
            case      : rs.setByte(c, (Byte)value); break;
            case      : rs.setString(c, String.valueOf(value)); break;
            case     : rs.setShort(c, (Short)value); break;
            case       : rs.setInt(c, (Integer)value); break;
            case      : rs.setLong(c, (Long)value); break;
            case     : rs.setFloat(c, (Float)value); break;
            case    : rs.setDouble(c, (Double)value); break;
            case  : rs.setBigDecimal(c, (BigDecimalvalue); break;
            case  : rs.setBigDecimal(cnew BigDecimal((BigInteger)value)); break;
            case    : rs.setString(c, (String)value); break;
            case     : rs.setBytes(c, (byte[]) value); break;
            case rs.setTimestamp(cnew java.sql.Timestamp(((java.util.Date)value).getTime()) ); break;
            case  : rs.setDate(c, (java.sql.Datevalue); break;
            case  : rs.setTime(c, (java.sql.Time)value); break;
            case rs.setTimestamp(c, (java.sql.Timestamp)value); break;
            case      : rs.setBlob(c, (Blob)value); break;
            case      : rs.setClob(c, (Clob)value); break;
            case      : rs.setInt(c, ((Enum)value).ordinal()); break;
            case     : rs.setInt(c, ((Color)value).getRGB()); break;
            case :
            case :rs.setString(cvalue!=null ? ((StringWrapper)value).exportToString() : null ); break;
            case  :rs.setBytes(cvalue!=null ? ((BytesWrapper)value).exportToBytes() : null ); break;
            default       : rs.setObject(cvalue);  break;
        }
    }

    
Find enum by KEY.
    private Object findEnum(final String keyfinal MetaColumn mColumnthrows IllegalArgumentException {
        if (key==null || key.length()==0) {
            return null;
        }
        for (Object o : mColumn.getType().getEnumConstants()) {
            if (key.equals(((StringWrapper)o).exportToString())) {
                return o;
            }
        }
        String msg = String.format("No enum was found for the key %s type of %s using the value: '%s'."
                , mColumn
                , mColumn.getType().getSimpleName()
                , key );
        throw new IllegalArgumentException(msg);
    }

    
Create the new StringWrapper by the KEY.
    @SuppressWarnings("unchecked")
    private Object createStringWrapper(final String keyfinal MetaColumn mColumnthrows IllegalArgumentException {
        if (key==null || key.length()==0) {
            return null;
        }
        try {
            final Object result = mColumn.getType().getConstructor().newInstance(key);
            return result;
        } catch (Exception e) {
            throw new IllegalArgumentException("Bad value export " + mColumn.getType() + "." + keye);
        }
    }

    
Create the new BytesWrapper by the KEY.
    @SuppressWarnings("unchecked")
    private Object createBytesWrapper(final byte[] keyfinal MetaColumn mColumnthrows IllegalArgumentException {
        if (key==null || key.length==0) {
            return null;
        }
        try {
            final Object result = mColumn.getType().getConstructor().newInstance(key);
            return result;
        } catch (Exception e) {
            throw new IllegalArgumentException("Bad value export " + mColumn.getType() + "." + keye);
        }
    }

    
Return an converted Java type to database DDL statements by a generic test.
    public Class getDbTypeClass(final MetaColumn column) {
        assert column.getConverter()==this : "Invalid column for this service: " + column;
        switch (column.getTypeCode()) {
            case return column.getType();
            case return column.getType();
        }
        final Class type = column.getType();
        Object testValue = column.getKey().getDefault();
        if (testValue != null) {
            // It is OK;
        } else if (type.isEnum()) {
            testValue = type.getEnumConstants()[0];
        } else if (false) {
            // TODO: to assign another sample value for next types (?)
        } else {
            return type;
        }
        // Column type code may not be intializad:
        if (!column.readOnly() && column.getTypeCode()==) {
            column.initTypeCode();
        }
        // Convert the testValue using current TypeService implementation:
        Object dbValue = new UjoStatement().getDatabaseValue(columntestValue);
        // The default number of an Enum type is the Short type:
        if (dbValue instanceof Integer) {
            switch (column.getTypeCode()) {
                case return Short.class;
            }
        }
        // Return a type of the dbValue:
        return dbValue != null
                ? dbValue.getClass()
                : type;
    }
New to GrepCode? Check out our FAQ X