CAY-2050 | Generics for ExtendedType | Improving CommonsJdbcEventLogger 
parameter logging


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/efa48e5c
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/efa48e5c
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/efa48e5c

Branch: refs/heads/master
Commit: efa48e5c26e38768ca6d719221b270ae5ab1757a
Parents: da222d2
Author: Savva Kolbachev <s.kolbac...@gmail.com>
Authored: Wed Dec 28 20:34:53 2016 +0300
Committer: Savva Kolbachev <s.kolbac...@gmail.com>
Committed: Sat Jan 21 18:16:02 2017 +0300

----------------------------------------------------------------------
 .../java8/access/types/LocalDateTimeType.java   |  21 ++-
 .../java8/access/types/LocalDateType.java       |  18 +-
 .../java8/access/types/LocalTimeType.java       |  21 ++-
 .../cayenne/joda/access/types/DateTimeType.java |  78 ++++----
 .../joda/access/types/LocalDateTimeType.java    |  79 ++++----
 .../joda/access/types/LocalDateType.java        |  88 ++++-----
 .../joda/access/types/LocalTimeType.java        |  90 +++++-----
 .../cayenne/access/types/BigDecimalType.java    |  18 +-
 .../cayenne/access/types/BigIntegerType.java    |  17 +-
 .../cayenne/access/types/BooleanType.java       |  17 +-
 .../cayenne/access/types/ByteArrayType.java     |  24 ++-
 .../access/types/ByteOrCharArrayFactory.java    | 179 ++++++++++++++-----
 .../apache/cayenne/access/types/ByteType.java   |  31 ++--
 .../cayenne/access/types/CalendarType.java      |  33 ++--
 .../apache/cayenne/access/types/CharType.java   |  48 ++++-
 .../apache/cayenne/access/types/DateType.java   |  18 +-
 .../apache/cayenne/access/types/DoubleType.java |  19 +-
 .../apache/cayenne/access/types/EnumType.java   |  47 +++--
 .../cayenne/access/types/ExtendedEnumType.java  |  44 +++--
 .../cayenne/access/types/ExtendedType.java      |  16 +-
 .../access/types/ExtendedTypeDecorator.java     |  25 ++-
 .../apache/cayenne/access/types/FloatType.java  |  18 +-
 .../cayenne/access/types/IntegerType.java       |  18 +-
 .../apache/cayenne/access/types/LongType.java   |  18 +-
 .../apache/cayenne/access/types/ObjectType.java |  11 +-
 .../access/types/SerializableTypeFactory.java   |  27 +--
 .../apache/cayenne/access/types/ShortType.java  |  22 ++-
 .../apache/cayenne/access/types/TimeType.java   |  19 +-
 .../cayenne/access/types/TimestampType.java     |  14 +-
 .../apache/cayenne/access/types/UUIDType.java   |  23 +--
 .../cayenne/access/types/UtilDateType.java      |  22 ++-
 .../apache/cayenne/access/types/VoidType.java   |  17 +-
 .../org/apache/cayenne/dba/db2/DB2Adapter.java  |  12 +-
 .../dba/frontbase/FrontBaseBooleanType.java     |   2 +-
 .../dba/frontbase/FrontBaseByteArrayType.java   |   2 +-
 .../dba/frontbase/FrontBaseCharType.java        |   4 +-
 .../cayenne/dba/ingres/IngresBooleanType.java   |   4 +-
 .../cayenne/dba/ingres/IngresCharType.java      |   4 +-
 .../cayenne/dba/openbase/OpenBaseAdapter.java   |  26 +--
 .../cayenne/dba/oracle/OracleAdapter.java       |  48 +++--
 .../cayenne/dba/oracle/OracleByteArrayType.java |   6 +-
 .../cayenne/dba/oracle/OracleCharType.java      |   6 +-
 .../dba/postgres/PostgresByteArrayType.java     |   2 +-
 .../dba/sqlite/SQLiteBigDecimalType.java        |  17 +-
 .../cayenne/dba/sqlite/SQLiteByteArrayType.java |  24 ++-
 .../cayenne/dba/sqlite/SQLiteCalendarType.java  |  28 +--
 .../cayenne/dba/sqlite/SQLiteFloatType.java     |  21 ++-
 .../cayenne/log/CommonsJdbcEventLogger.java     |  11 +-
 .../java/org/apache/cayenne/util/IDUtil.java    |  34 +++-
 .../cayenne/access/types/MockExtendedType.java  |  11 +-
 .../extended_type/StringET1ExtendedType.java    |  25 ++-
 .../cayenne/unit/jira/CAY_207StringType1.java   |  24 +--
 .../cayenne/unit/jira/CAY_207StringType2.java   |  24 +--
 53 files changed, 970 insertions(+), 505 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java
 
b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java
index aa47c22..f47e247 100644
--- 
a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java
+++ 
b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java
@@ -19,15 +19,15 @@
 
 package org.apache.cayenne.java8.access.types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
 
-public class LocalDateTimeType implements ExtendedType {
+import org.apache.cayenne.access.types.ExtendedType;
+
+public class LocalDateTimeType implements ExtendedType<LocalDateTime> {
 
     @Override
     public String getClassName() {
@@ -35,8 +35,8 @@ public class LocalDateTimeType implements ExtendedType {
     }
 
     @Override
-    public void setJdbcObject(PreparedStatement statement, Object value, int 
pos, int type, int scale) throws Exception {
-        statement.setTimestamp(pos, Timestamp.valueOf((LocalDateTime) value));
+    public void setJdbcObject(PreparedStatement statement, LocalDateTime 
value, int pos, int type, int scale) throws Exception {
+        statement.setTimestamp(pos, Timestamp.valueOf(value));
     }
 
     @Override
@@ -46,8 +46,17 @@ public class LocalDateTimeType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type) 
throws Exception {
+    public LocalDateTime materializeObject(CallableStatement rs, int index, 
int type) throws Exception {
         Timestamp timestamp = rs.getTimestamp(index);
         return timestamp != null ? timestamp.toLocalDateTime() : null;
     }
+
+    @Override
+    public String toString(LocalDateTime value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return '\'' + value.toString() + '\'';
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java
 
b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java
index 72cfff7..ee602d5 100644
--- 
a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java
+++ 
b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java
@@ -19,15 +19,15 @@
 
 package org.apache.cayenne.java8.access.types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 import java.sql.CallableStatement;
 import java.sql.Date;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.time.LocalDate;
 
-public class LocalDateType implements ExtendedType {
+import org.apache.cayenne.access.types.ExtendedType;
+
+public class LocalDateType implements ExtendedType<LocalDate> {
 
     @Override
     public String getClassName() {
@@ -35,8 +35,8 @@ public class LocalDateType implements ExtendedType {
     }
 
     @Override
-    public void setJdbcObject(PreparedStatement statement, Object value, int 
pos, int type, int scale) throws Exception {
-        statement.setDate(pos, Date.valueOf((LocalDate) value));
+    public void setJdbcObject(PreparedStatement statement, LocalDate value, 
int pos, int type, int scale) throws Exception {
+        statement.setDate(pos, Date.valueOf(value));
     }
 
     @Override
@@ -51,4 +51,12 @@ public class LocalDateType implements ExtendedType {
         return date != null ? date.toLocalDate() : null;
     }
 
+    @Override
+    public String toString(LocalDate value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return '\'' + value.toString() + '\'';
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java
 
b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java
index 2d109ba..f1a8dea 100644
--- 
a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java
+++ 
b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java
@@ -19,15 +19,15 @@
 
 package org.apache.cayenne.java8.access.types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.Time;
 import java.time.LocalTime;
 
-public class LocalTimeType implements ExtendedType {
+import org.apache.cayenne.access.types.ExtendedType;
+
+public class LocalTimeType implements ExtendedType<LocalTime> {
 
     @Override
     public String getClassName() {
@@ -35,8 +35,8 @@ public class LocalTimeType implements ExtendedType {
     }
 
     @Override
-    public void setJdbcObject(PreparedStatement statement, Object value, int 
pos, int type, int scale) throws Exception {
-        statement.setTime(pos, Time.valueOf((LocalTime) value));
+    public void setJdbcObject(PreparedStatement statement, LocalTime value, 
int pos, int type, int scale) throws Exception {
+        statement.setTime(pos, Time.valueOf(value));
     }
 
     @Override
@@ -46,9 +46,18 @@ public class LocalTimeType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type) 
throws Exception {
+    public LocalTime materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
         Time time = rs.getTime(index);
         return time != null ? time.toLocalTime() : null;
     }
 
+    @Override
+    public String toString(LocalTime value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return '\'' + value.toString() + '\'';
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java
 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java
index 2af5e91..a042b3d 100644
--- 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java
+++ 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java
@@ -19,57 +19,61 @@
 
 package org.apache.cayenne.joda.access.types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-import org.joda.time.DateTime;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.Timestamp;
 
+import org.apache.cayenne.access.types.ExtendedType;
+import org.joda.time.DateTime;
+
 /**
  * Handles <code>org.joda.time.DateTime</code> type mapping.
- * 
+ *
  * @since 4.0
  */
-public class DateTimeType implements ExtendedType {
+public class DateTimeType implements ExtendedType<DateTime> {
 
-       @Override
-       public String getClassName() {
-               return DateTime.class.getName();
-       }
+    @Override
+    public String getClassName() {
+        return DateTime.class.getName();
+    }
 
-       @Override
-       public DateTime materializeObject(ResultSet rs, int index, int type) 
throws Exception {
-               if (rs.getTimestamp(index) != null) {
-                       return new DateTime(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+    @Override
+    public void setJdbcObject(PreparedStatement statement, DateTime value, int 
pos, int type, int scale) throws Exception {
+        if (value == null) {
+            statement.setNull(pos, type);
+        } else {
+            Timestamp ts = new Timestamp(value.getMillis());
+            statement.setTimestamp(pos, ts);
+        }
+    }
 
-       @Override
-       public DateTime materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
-               if (rs.getTimestamp(index) != null) {
-                       return new DateTime(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+    @Override
+    public DateTime materializeObject(ResultSet rs, int index, int type) 
throws Exception {
+        if (rs.getTimestamp(index) != null) {
+            return new DateTime(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-       @Override
-       public void setJdbcObject(PreparedStatement statement, Object value, 
int pos, int type, int scale) throws Exception {
+    @Override
+    public DateTime materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
+        if (rs.getTimestamp(index) != null) {
+            return new DateTime(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-               if (value == null) {
-                       statement.setNull(pos, type);
-               } else {
-                       Timestamp ts = new Timestamp(getMillis(value));
-                       statement.setTimestamp(pos, ts);
-               }
-       }
+    @Override
+    public String toString(DateTime value) {
+        if (value == null) {
+            return "\'null\'";
+        }
 
-       protected long getMillis(Object value) {
-               return ((DateTime) value).getMillis();
-       }
+        return '\'' + value.toString() + '\'';
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java
 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java
index ea7fab7..97d3900 100644
--- 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java
+++ 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java
@@ -19,58 +19,61 @@
 
 package org.apache.cayenne.joda.access.types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-import org.joda.time.LocalDateTime;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.Timestamp;
 import java.sql.Types;
 
+import org.apache.cayenne.access.types.ExtendedType;
+import org.joda.time.LocalDateTime;
+
 /**
  * Handles <code>org.joda.time.LocalDateTime</code> type mapping.
- * 
+ *
  * @since 4.0
  */
-public class LocalDateTimeType implements ExtendedType {
-
-       @Override
-       public String getClassName() {
-               return LocalDateTime.class.getName();
-       }
+public class LocalDateTimeType implements ExtendedType<LocalDateTime> {
 
-       @Override
-       public LocalDateTime materializeObject(ResultSet rs, int index, int 
type) throws Exception {
-               if (rs.getTimestamp(index) != null) {
-                       return new 
LocalDateTime(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+    @Override
+    public String getClassName() {
+        return LocalDateTime.class.getName();
+    }
 
-       @Override
-       public LocalDateTime materializeObject(CallableStatement rs, int index, 
int type) throws Exception {
-               if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) {
-                       return new 
LocalDateTime(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+    @Override
+    public void setJdbcObject(PreparedStatement statement, LocalDateTime 
value, int pos, int type, int scale) throws Exception {
+        if (value == null) {
+            statement.setNull(pos, type);
+        } else {
+            Timestamp ts = new Timestamp(value.toDateTime().getMillis());
+            statement.setTimestamp(pos, ts);
+        }
+    }
 
-       @Override
-       public void setJdbcObject(PreparedStatement statement, Object value, 
int pos, int type, int scale) throws Exception {
+    @Override
+    public LocalDateTime materializeObject(ResultSet rs, int index, int type) 
throws Exception {
+        if (rs.getTimestamp(index) != null) {
+            return new LocalDateTime(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-               if (value == null) {
-                       statement.setNull(pos, type);
-               } else {
-                       Timestamp ts = new Timestamp(getMillis(value));
-                       statement.setTimestamp(pos, ts);
-               }
-       }
+    @Override
+    public LocalDateTime materializeObject(CallableStatement rs, int index, 
int type) throws Exception {
+        if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) {
+            return new LocalDateTime(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-       protected long getMillis(Object value) {
-               return ((LocalDateTime) value).toDateTime().getMillis();
-       }
+    @Override
+    public String toString(LocalDateTime value) {
+        if (value == null) {
+            return "\'null\'";
+        }
 
+        return '\'' + value.toString() + '\'';
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java
 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java
index 7a0a9a0..19f05b6 100644
--- 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java
+++ 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java
@@ -31,54 +31,60 @@ import org.joda.time.LocalDate;
 
 /**
  * Handles <code>org.joda.time.LocalDate</code> type mapping.
- * 
+ *
  * @since 4.0
  */
-public class LocalDateType implements ExtendedType {
+public class LocalDateType implements ExtendedType<LocalDate> {
+
+    @Override
+    public String getClassName() {
+        return LocalDate.class.getName();
+    }
 
-       @Override
-       public String getClassName() {
-               return LocalDate.class.getName();
-       }
+    @Override
+    public void setJdbcObject(PreparedStatement statement, LocalDate value, 
int pos, int type, int scale) throws Exception {
+        if (value == null) {
+            statement.setNull(pos, type);
+        } else {
+            long time = value.toDate().getTime();
 
-       @Override
-       public LocalDate materializeObject(ResultSet rs, int index, int type) 
throws Exception {
-               if (type == Types.DATE && rs.getDate(index) != null) {
-                       return new LocalDate(rs.getDate(index).getTime());
-               } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != 
null) {
-                       return new LocalDate(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+            if (type == Types.DATE) {
+                statement.setDate(pos, new Date(time));
+            } else {
+                statement.setTimestamp(pos, new Timestamp(time));
+            }
+        }
+    }
 
-       @Override
-       public LocalDate materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
-               if (type == Types.DATE && rs.getDate(index) != null) {
-                       return new LocalDate(rs.getDate(index).getTime());
-               } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != 
null) {
-                       return new LocalDate(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+    @Override
+    public LocalDate materializeObject(ResultSet rs, int index, int type) 
throws Exception {
+        if (type == Types.DATE && rs.getDate(index) != null) {
+            return new LocalDate(rs.getDate(index).getTime());
+        } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) {
+            return new LocalDate(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-       @Override
-       public void setJdbcObject(PreparedStatement statement, Object value, 
int pos, int type, int scale) throws Exception {
+    @Override
+    public LocalDate materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
+        if (type == Types.DATE && rs.getDate(index) != null) {
+            return new LocalDate(rs.getDate(index).getTime());
+        } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) {
+            return new LocalDate(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-               if (value == null) {
-                       statement.setNull(pos, type);
-               } else {
-                       if (type == Types.DATE) {
-                               statement.setDate(pos, new 
Date(getMillis(value)));
-                       } else {
-                               statement.setTimestamp(pos, new 
Timestamp(getMillis(value)));
-                       }
-               }
-       }
+    @Override
+    public String toString(LocalDate value) {
+        if (value == null) {
+            return "\'null\'";
+        }
 
-       protected long getMillis(Object value) {
-               return ((LocalDate) value).toDate().getTime();
-       }
+        return '\'' + value.toString() + '\'';
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java
 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java
index 765c4ad..501f889 100644
--- 
a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java
+++ 
b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java
@@ -33,56 +33,62 @@ import org.joda.time.LocalTime;
 
 /**
  * Handles <code>org.joda.time.LocalTime</code> type mapping.
- * 
+ *
  * @since 4.0
  */
-public class LocalTimeType implements ExtendedType {
+public class LocalTimeType implements ExtendedType<LocalTime> {
+
+    private static final LocalDate EPOCH = new LocalDate(0, DateTimeZone.UTC);
 
-       private static final LocalDate EPOCH = new LocalDate(0, 
DateTimeZone.UTC);
+    @Override
+    public String getClassName() {
+        return LocalTime.class.getName();
+    }
 
-       @Override
-       public String getClassName() {
-               return LocalTime.class.getName();
-       }
+    @Override
+    public void setJdbcObject(PreparedStatement statement, LocalTime value, 
int pos, int type, int scale) throws Exception {
 
-       @Override
-       public LocalTime materializeObject(ResultSet rs, int index, int type) 
throws Exception {
-               if (type == Types.TIME && rs.getTime(index) != null) {
-                       return new LocalTime(rs.getTime(index).getTime());
-               } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != 
null) {
-                       return new LocalTime(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+        if (value == null) {
+            statement.setNull(pos, type);
+        } else {
+            long millis = EPOCH.toDateTime(value).getMillis();
 
-       @Override
-       public LocalTime materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
-               if (type == Types.TIME && rs.getTime(index) != null) {
-                       return new LocalTime(rs.getTime(index).getTime());
-               } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != 
null) {
-                       return new LocalTime(rs.getTimestamp(index).getTime());
-               } else {
-                       return null;
-               }
-       }
+            if (type == Types.TIME) {
+                statement.setTime(pos, new Time(millis));
+            } else {
+                statement.setTimestamp(pos, new Timestamp(millis));
+            }
+        }
+    }
 
-       @Override
-       public void setJdbcObject(PreparedStatement statement, Object value, 
int pos, int type, int scale) throws Exception {
+    @Override
+    public LocalTime materializeObject(ResultSet rs, int index, int type) 
throws Exception {
+        if (type == Types.TIME && rs.getTime(index) != null) {
+            return new LocalTime(rs.getTime(index).getTime());
+        } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) {
+            return new LocalTime(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-               if (value == null) {
-                       statement.setNull(pos, type);
-               } else {
-                       if (type == Types.TIME) {
-                               statement.setTime(pos, new 
Time(getMillis(value)));
-                       } else {
-                               statement.setTimestamp(pos, new 
Timestamp(getMillis(value)));
-                       }
-               }
-       }
+    @Override
+    public LocalTime materializeObject(CallableStatement rs, int index, int 
type) throws Exception {
+        if (type == Types.TIME && rs.getTime(index) != null) {
+            return new LocalTime(rs.getTime(index).getTime());
+        } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) {
+            return new LocalTime(rs.getTimestamp(index).getTime());
+        } else {
+            return null;
+        }
+    }
 
-       protected long getMillis(Object value) {
-               return EPOCH.toDateTime((LocalTime) value).getMillis();
-       }
+    @Override
+    public String toString(LocalTime value) {
+        if (value == null) {
+            return "\'null\'";
+        }
 
+        return '\'' + value.toString() + '\'';
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java
index eb46adf..11e9860 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java
@@ -26,7 +26,7 @@ import java.sql.ResultSet;
 /**
  * @since 3.0
  */
-public class BigDecimalType implements ExtendedType {
+public class BigDecimalType implements ExtendedType<BigDecimal> {
 
     @Override
     public String getClassName() {
@@ -34,12 +34,12 @@ public class BigDecimalType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public BigDecimal materializeObject(ResultSet rs, int index, int type) 
throws Exception {
         return rs.getBigDecimal(index);
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public BigDecimal materializeObject(CallableStatement rs, int index, int 
type)
             throws Exception {
         return rs.getBigDecimal(index);
     }
@@ -47,7 +47,7 @@ public class BigDecimalType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            BigDecimal value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -56,8 +56,16 @@ public class BigDecimalType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setBigDecimal(pos, (BigDecimal) value);
+            statement.setBigDecimal(pos, value);
         }
     }
 
+    @Override
+    public String toString(BigDecimal value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java
index 3c5c645..a3d1752 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.dba.TypesMapping;
 /**
  * @since 3.0
  */
-public class BigIntegerType implements ExtendedType {
+public class BigIntegerType implements ExtendedType<BigInteger> {
 
     @Override
     public String getClassName() {
@@ -36,7 +36,7 @@ public class BigIntegerType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public BigInteger materializeObject(ResultSet rs, int index, int type) 
throws Exception {
         Object object = rs.getObject(index);
         if (object == null) {
             return null;
@@ -46,7 +46,7 @@ public class BigIntegerType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public BigInteger materializeObject(CallableStatement rs, int index, int 
type)
             throws Exception {
         Object object = rs.getObject(index);
         if (object == null) {
@@ -59,7 +59,7 @@ public class BigIntegerType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            BigInteger value,
             int pos,
             int type,
             int precision) throws Exception {
@@ -76,4 +76,13 @@ public class BigIntegerType implements ExtendedType {
                             + TypesMapping.getSqlNameByType(type));
         }
     }
+
+    @Override
+    public String toString(BigInteger value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java
index a14dcd2..be0d597 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java
@@ -32,7 +32,7 @@ import java.sql.Types;
  * 
  * @since 1.2
  */
-public class BooleanType implements ExtendedType {
+public class BooleanType implements ExtendedType<Boolean> {
 
     @Override
     public String getClassName() {
@@ -42,7 +42,7 @@ public class BooleanType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            Boolean val,
             int pos,
             int type,
             int precision) throws Exception {
@@ -60,15 +60,24 @@ public class BooleanType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Boolean materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         boolean b = rs.getBoolean(index);
         return (rs.wasNull()) ? null : b ? Boolean.TRUE : Boolean.FALSE;
     }
 
     @Override
-    public Object materializeObject(CallableStatement st, int index, int type)
+    public Boolean materializeObject(CallableStatement st, int index, int type)
             throws Exception {
         boolean b = st.getBoolean(index);
         return (st.wasNull()) ? null : b ? Boolean.TRUE : Boolean.FALSE;
     }
+
+    @Override
+    public String toString(Boolean value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return '\'' + value.toString() + '\'';
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
index 8b42a65..3ad6898 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
@@ -30,13 +30,14 @@ import java.sql.SQLException;
 import java.sql.Types;
 
 import org.apache.cayenne.CayenneException;
+import org.apache.cayenne.util.IDUtil;
 import org.apache.cayenne.util.MemoryBlob;
 
 /**
  * Handles <code>byte[]</code>, mapping it as either of JDBC types - BLOB or
  * (VAR)BINARY. Can be configured to trim trailing zero bytes.
  */
-public class ByteArrayType implements ExtendedType {
+public class ByteArrayType implements ExtendedType<byte[]> {
 
        private static final int BUF_SIZE = 8 * 1024;
 
@@ -76,7 +77,7 @@ public class ByteArrayType implements ExtendedType {
        }
 
        @Override
-       public Object materializeObject(ResultSet rs, int index, int type) 
throws Exception {
+       public byte[] materializeObject(ResultSet rs, int index, int type) 
throws Exception {
 
                byte[] bytes = null;
 
@@ -95,7 +96,7 @@ public class ByteArrayType implements ExtendedType {
        }
 
        @Override
-       public Object materializeObject(CallableStatement cs, int index, int 
type) throws Exception {
+       public byte[] materializeObject(CallableStatement cs, int index, int 
type) throws Exception {
 
                byte[] bytes = null;
 
@@ -118,15 +119,15 @@ public class ByteArrayType implements ExtendedType {
        }
 
        @Override
-       public void setJdbcObject(PreparedStatement st, Object val, int pos, 
int type, int scale) throws Exception {
+       public void setJdbcObject(PreparedStatement st, byte[] val, int pos, 
int type, int scale) throws Exception {
 
                // if this is a BLOB column, set the value as "bytes"
                // instead. This should work with most drivers
                if (type == Types.BLOB) {
                        if (isUsingBlobs()) {
-                               st.setBlob(pos, writeBlob((byte[]) val));
+                               st.setBlob(pos, writeBlob(val));
                        } else {
-                               st.setBytes(pos, (byte[]) val);
+                               st.setBytes(pos, val);
                        }
                } else {
                        if (scale != -1) {
@@ -137,6 +138,17 @@ public class ByteArrayType implements ExtendedType {
                }
        }
 
+       @Override
+       public String toString(byte[] value) {
+               if (value == null) {
+                       return "\'null\'";
+               }
+
+               StringBuilder buffer = new StringBuilder();
+               IDUtil.appendFormattedBytes(buffer, value);
+               return buffer.toString();
+       }
+
        protected Blob writeBlob(byte[] bytes) {
                // TODO: should we use Connection.createBlob() instead? (Like 
Oracle
                // ByteArrayType does)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
index 11ae4a6..8db28ce 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
@@ -18,6 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.access.types;
 
+import java.lang.reflect.Array;
+
+import org.apache.cayenne.util.IDUtil;
+
+import static 
org.apache.cayenne.log.CommonsJdbcEventLogger.TRIM_VALUES_THRESHOLD;
+
 /**
  * A factory that dynamically creates ExtendedTypes for Character, 
Character[], Byte[] and
  * char[] based on adapter configured types for String and byte[].
@@ -40,38 +46,34 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory 
{
 
             if (Character.class.isAssignableFrom(elementType)) {
                 // can't use "getRegisteredType" as it causes infinite 
recursion
-                ExtendedType stringType = map
-                        .getExplictlyRegisteredType("java.lang.String");
-
+                ExtendedType<String> stringType = 
map.getExplictlyRegisteredType("java.lang.String");
                 return new CharacterArrayType(stringType);
             }
             else if (Character.TYPE.isAssignableFrom(elementType)) {
 
                 // can't use "getRegisteredType" as it causes infinite 
recursion
-                ExtendedType stringType = map
-                        .getExplictlyRegisteredType("java.lang.String");
-
+                ExtendedType<String> stringType = 
map.getExplictlyRegisteredType("java.lang.String");
                 return new CharArrayType(stringType);
             }
             else if (Byte.class.isAssignableFrom(elementType)) {
                 // can't use "getRegisteredType" as it causes infinite 
recursion
-                ExtendedType bytesType = 
map.getExplictlyRegisteredType("byte[]");
+                ExtendedType<byte[]> bytesType = 
map.getExplictlyRegisteredType("byte[]");
                 return new ByteWrapperArrayType(bytesType);
             }
         }
         else if (Character.class.isAssignableFrom(objectClass)) {
 
             // can't use "getRegisteredType" as it causes infinite recursion
-            ExtendedType stringType = 
map.getExplictlyRegisteredType("java.lang.String");
+            ExtendedType<String> stringType = 
map.getExplictlyRegisteredType("java.lang.String");
             return new CharacterType(stringType);
         }
 
         return null;
     }
 
-    final class CharacterType extends ExtendedTypeDecorator {
+    final class CharacterType extends ExtendedTypeDecorator<Character, String> 
{
 
-        CharacterType(ExtendedType stringType) {
+        CharacterType(ExtendedType<String> stringType) {
             super(stringType);
         }
 
@@ -81,26 +83,25 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory 
{
         }
 
         @Override
-        Object fromJavaObject(Object object) {
+        String fromJavaObject(Character object) {
             return object != null
-                    ? String.valueOf(((Character) object).charValue())
+                    ? String.valueOf(object.charValue())
                     : null;
         }
 
         @Override
-        Object toJavaObject(Object object) {
-            if (object == null) {
+        Character toJavaObject(String string) {
+            if (string == null) {
                 return null;
             }
 
-            String string = object.toString();
-            return (string.length() > 0) ? Character.valueOf(string.charAt(0)) 
: null;
+            return (string.length() > 0) ? string.charAt(0) : null;
         }
     }
 
-    final class CharArrayType extends ExtendedTypeDecorator {
+    final class CharArrayType extends ExtendedTypeDecorator<char[], String> {
 
-        CharArrayType(ExtendedType stringType) {
+        CharArrayType(ExtendedType<String> stringType) {
             super(stringType);
         }
 
@@ -110,19 +111,50 @@ class ByteOrCharArrayFactory implements 
ExtendedTypeFactory {
         }
 
         @Override
-        Object fromJavaObject(Object object) {
-            return object != null ? new String((char[]) object) : null;
+        String fromJavaObject(char[] object) {
+            return object != null ? new String(object) : null;
         }
 
         @Override
-        Object toJavaObject(Object object) {
-            return object != null ? ((String) object).toCharArray() : null;
+        char[] toJavaObject(String object) {
+            return object != null ? object.toCharArray() : null;
+        }
+
+        @Override
+        public String toString(char[] value) {
+            if (value == null) {
+                return "\'null\'";
+            }
+
+            StringBuilder buffer = new StringBuilder();
+            buffer.append("< ");
+
+            int len = Array.getLength(value);
+            boolean trimming = false;
+            if (len > TRIM_VALUES_THRESHOLD) {
+                len = TRIM_VALUES_THRESHOLD;
+                trimming = true;
+            }
+
+            for (int i = 0; i < len; i++) {
+                if (i > 0) {
+                    buffer.append(",");
+                }
+                buffer.append(Array.get(value, i));
+            }
+
+            if (trimming) {
+                buffer.append("...");
+            }
+
+            buffer.append('>');
+            return buffer.toString();
         }
     }
 
-    final class CharacterArrayType extends ExtendedTypeDecorator {
+    final class CharacterArrayType extends ExtendedTypeDecorator<Character[], 
String> {
 
-        CharacterArrayType(ExtendedType stringType) {
+        CharacterArrayType(ExtendedType<String> stringType) {
             super(stringType);
         }
 
@@ -132,39 +164,68 @@ class ByteOrCharArrayFactory implements 
ExtendedTypeFactory {
         }
 
         @Override
-        Object fromJavaObject(Object object) {
+        String fromJavaObject(Character[] object) {
             if (object == null) {
                 return null;
             }
 
-            Character[] chars = (Character[]) object;
-            StringBuilder buffer = new StringBuilder(chars.length);
-            for (Character aChar : chars) {
-                buffer.append(aChar != null ? aChar.charValue() : 0);
+            StringBuilder buffer = new StringBuilder(object.length);
+            for (Character aChar : object) {
+                buffer.append(aChar != null ? aChar : 0);
             }
 
             return buffer.toString();
         }
 
         @Override
-        Object toJavaObject(Object object) {
+        Character[] toJavaObject(String object) {
             if (object == null) {
                 return null;
             }
 
-            String string = object.toString();
-            Character[] chars = new Character[string.length()];
-            for (int i = 0; i < string.length(); i++) {
-                chars[i] = Character.valueOf(string.charAt(i));
+            Character[] chars = new Character[object.length()];
+            for (int i = 0; i < object.length(); i++) {
+                chars[i] = object.charAt(i);
             }
 
             return chars;
         }
+
+        @Override
+        public String toString(Character[] value) {
+            if (value == null) {
+                return "\'null\'";
+            }
+
+            StringBuilder buffer = new StringBuilder();
+            buffer.append("< ");
+
+            int len = Array.getLength(value);
+            boolean trimming = false;
+            if (len > TRIM_VALUES_THRESHOLD) {
+                len = TRIM_VALUES_THRESHOLD;
+                trimming = true;
+            }
+
+            for (int i = 0; i < len; i++) {
+                if (i > 0) {
+                    buffer.append(",");
+                }
+                buffer.append(Array.get(value, i));
+            }
+
+            if (trimming) {
+                buffer.append("...");
+            }
+
+            buffer.append('>');
+            return buffer.toString();
+        }
     }
 
-    final class ByteWrapperArrayType extends ExtendedTypeDecorator {
+    final class ByteWrapperArrayType extends ExtendedTypeDecorator<Byte[], 
byte[]> {
 
-        ByteWrapperArrayType(ExtendedType byteArrayType) {
+        ByteWrapperArrayType(ExtendedType<byte[]> byteArrayType) {
             super(byteArrayType);
         }
 
@@ -174,34 +235,62 @@ class ByteOrCharArrayFactory implements 
ExtendedTypeFactory {
         }
 
         @Override
-        Object fromJavaObject(Object object) {
-            if (object == null) {
+        byte[] fromJavaObject(Byte[] bytes) {
+            if (bytes == null) {
                 return null;
             }
 
-            Byte[] bytes = (Byte[]) object;
             byte[] buffer = new byte[bytes.length];
             for (int i = 0; i < bytes.length; i++) {
-                buffer[i] = bytes[i] != null ? bytes[i].byteValue() : 0;
+                buffer[i] = bytes[i] != null ? bytes[i] : 0;
             }
 
             return buffer;
         }
 
         @Override
-        Object toJavaObject(Object object) {
-            if (object == null) {
+        Byte[] toJavaObject(byte[] bytes) {
+            if (bytes == null) {
                 return null;
             }
 
-            byte[] bytes = (byte[]) object;
             Byte[] byteWrappers = new Byte[bytes.length];
-
             for (int i = 0; i < bytes.length; i++) {
-                byteWrappers[i] = Byte.valueOf(bytes[i]);
+                byteWrappers[i] = bytes[i];
             }
 
             return byteWrappers;
         }
+
+        @Override
+        public String toString(Byte[] value) {
+            if (value == null) {
+                return "\'null\'";
+            }
+
+            StringBuilder buffer = new StringBuilder();
+            buffer.append("< ");
+
+            int len = value.length;
+            boolean trimming = false;
+            if (len > TRIM_VALUES_THRESHOLD) {
+                len = TRIM_VALUES_THRESHOLD;
+                trimming = true;
+            }
+
+            for (int i = 0; i < len; i++) {
+                if (i > 0) {
+                    buffer.append(",");
+                }
+                IDUtil.appendFormattedByte(buffer, value[i]);
+            }
+
+            if (trimming) {
+                buffer.append("...");
+            }
+
+            buffer.append('>');
+            return buffer.toString();
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java
index 438707f..c11191d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java
@@ -23,15 +23,17 @@ import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
+import org.apache.cayenne.util.IDUtil;
+
 /**
  * Handles <code>java.lang.Byte</code> type mapping. Can be configured to 
recast
  * java.lang.Byte to java.lang.Integer when binding values to 
PreparedStatement. This is a
  * workaround for bugs in certain drivers. Drivers that are proven to have 
issues with
  * byte values are Sybase and Oracle (Mac OS X only).
- * 
+ *
  * @since 1.0.3
  */
-public class ByteType implements ExtendedType {
+public class ByteType implements ExtendedType<Byte> {
 
     protected boolean widenBytes;
 
@@ -45,13 +47,13 @@ public class ByteType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Byte materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         byte b = rs.getByte(index);
         return (rs.wasNull()) ? null : b;
     }
 
     @Override
-    public Object materializeObject(CallableStatement st, int index, int type)
+    public Byte materializeObject(CallableStatement st, int index, int type)
             throws Exception {
         byte b = st.getByte(index);
         return (st.wasNull()) ? null : b;
@@ -60,24 +62,33 @@ public class ByteType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Byte value,
             int pos,
             int type,
             int precision) throws Exception {
 
         if (value == null) {
             statement.setNull(pos, type);
-        }
-        else {
+        } else {
 
-            Byte b = (Byte) value;
+            Byte b = value;
             if (widenBytes) {
                 statement.setInt(pos, b.intValue());
-            }
-            else {
+            } else {
                 statement.setByte(pos, b.byteValue());
             }
         }
     }
 
+    @Override
+    public String toString(Byte value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        StringBuilder buffer = new StringBuilder();
+        IDUtil.appendFormattedByte(buffer, value);
+
+        return buffer.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
index 811e9cc..acc53b2 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
@@ -34,7 +34,7 @@ import org.apache.cayenne.dba.TypesMapping;
  * 
  * @since 3.0
  */
-public class CalendarType<T extends Calendar> implements ExtendedType {
+public class CalendarType<T extends Calendar> implements 
ExtendedType<Calendar> {
 
     protected Class<T> calendarClass;
 
@@ -57,7 +57,7 @@ public class CalendarType<T extends Calendar> implements 
ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Calendar materializeObject(ResultSet rs, int index, int type) 
throws Exception {
 
         Date val = null;
 
@@ -98,7 +98,7 @@ public class CalendarType<T extends Calendar> implements 
ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Calendar materializeObject(CallableStatement rs, int index, int 
type)
             throws Exception {
         Date val = null;
 
@@ -141,7 +141,7 @@ public class CalendarType<T extends Calendar> implements 
ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Calendar value,
             int pos,
             int type,
             int precision) throws Exception {
@@ -149,26 +149,18 @@ public class CalendarType<T extends Calendar> implements 
ExtendedType {
         if (value == null) {
             statement.setNull(pos, type);
         }
-        else if (value instanceof Calendar) {
-
-            Calendar calendar = (Calendar) value;
-            statement.setObject(pos, convertToJdbcObject(calendar, type));
-        }
         else {
-            throw new IllegalArgumentException("Expected java.util.Calendar, 
got "
-                    + value.getClass().getName());
+            statement.setObject(pos, convertToJdbcObject(value, type));
         }
     }
 
     protected Object convertToJdbcObject(Calendar value, int type) throws 
Exception {
-        Calendar calendar = value;
-
         if (type == Types.DATE)
-            return new java.sql.Date(calendar.getTimeInMillis());
+            return new java.sql.Date(value.getTimeInMillis());
         else if (type == Types.TIME)
-            return new java.sql.Time(calendar.getTimeInMillis());
+            return new java.sql.Time(value.getTimeInMillis());
         else if (type == Types.TIMESTAMP)
-            return new java.sql.Timestamp(calendar.getTimeInMillis());
+            return new java.sql.Timestamp(value.getTimeInMillis());
         else
             throw new IllegalArgumentException(
                     "Only DATE, TIME or TIMESTAMP can be mapped as '"
@@ -177,4 +169,13 @@ public class CalendarType<T extends Calendar> implements 
ExtendedType {
                             + TypesMapping.getSqlNameByType(type));
     }
 
+    @Override
+    public String toString(Calendar value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.getClass().getName() + '(' + new 
java.sql.Timestamp(value.getTimeInMillis()) + ')';
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java
index 9f6f990..5da2bae 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.access.types;
 
-import org.apache.cayenne.CayenneException;
-
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringWriter;
@@ -31,13 +29,16 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
 
+import org.apache.cayenne.CayenneException;
+
 /**
  * Handles <code>java.lang.String</code>, mapping it as either of JDBC types -
  * CLOB or (VAR)CHAR. Can be configured to trim trailing spaces.
  */
-public class CharType implements ExtendedType {
+public class CharType implements ExtendedType<String> {
 
        private static final int BUF_SIZE = 8 * 1024;
+       private static final int TRIM_VALUES_THRESHOLD = 30;
 
        protected boolean trimmingChars;
        protected boolean usingClobs;
@@ -57,7 +58,7 @@ public class CharType implements ExtendedType {
 
        /** Return trimmed string. */
        @Override
-       public Object materializeObject(ResultSet rs, int index, int type) 
throws Exception {
+       public String materializeObject(ResultSet rs, int index, int type) 
throws Exception {
 
                if (type == Types.CLOB || type == Types.NCLOB) {
                        return isUsingClobs() ? readClob(rs.getClob(index)) : 
readCharStream(rs, index);
@@ -67,7 +68,7 @@ public class CharType implements ExtendedType {
        }
 
        @Override
-       public Object materializeObject(CallableStatement cs, int index, int 
type) throws Exception {
+       public String materializeObject(CallableStatement cs, int index, int 
type) throws Exception {
 
                if (type == Types.CLOB || type == Types.NCLOB) {
                        if (!isUsingClobs()) {
@@ -80,7 +81,7 @@ public class CharType implements ExtendedType {
                return handleString(cs.getString(index), type);
        }
 
-       private Object handleString(String val, int type) throws SQLException {
+       private String handleString(String val, int type) throws SQLException {
                // trim CHAR type
                if (val != null && (type == Types.CHAR || type == Types.NCHAR) 
&& isTrimmingChars()) {
                        return rtrim(val);
@@ -100,12 +101,12 @@ public class CharType implements ExtendedType {
        }
 
        @Override
-       public void setJdbcObject(PreparedStatement st, Object value, int pos, 
int type, int scale) throws Exception {
+       public void setJdbcObject(PreparedStatement st, String value, int pos, 
int type, int scale) throws Exception {
 
                // if this is a CLOB column, set the value as "String"
                // instead. This should work with most drivers
                if (type == Types.CLOB || type == Types.NCLOB) {
-                       st.setString(pos, (String) value);
+                       st.setString(pos, value);
                } else if (scale != -1) {
                        st.setObject(pos, value, type, scale);
                } else {
@@ -113,6 +114,37 @@ public class CharType implements ExtendedType {
                }
        }
 
+       @Override
+       public String toString(String value) {
+               if (value == null) {
+                       return "\'null\'";
+               }
+
+               StringBuilder buffer = new StringBuilder();
+
+               buffer.append('\'');
+               // lets escape quotes
+               String literal = value;
+               if (literal.length() > TRIM_VALUES_THRESHOLD) {
+                       literal = literal.substring(0, TRIM_VALUES_THRESHOLD) + 
"...";
+               }
+
+               int curPos = 0;
+               int endPos = 0;
+
+               while ((endPos = literal.indexOf('\'', curPos)) >= 0) {
+                       buffer.append(literal.substring(curPos, endPos + 
1)).append('\'');
+                       curPos = endPos + 1;
+               }
+
+               if (curPos < literal.length())
+                       buffer.append(literal.substring(curPos));
+
+               buffer.append('\'');
+
+               return buffer.toString();
+       }
+
        protected String readClob(Clob clob) throws IOException, SQLException {
                if (clob == null) {
                        return null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java
index 853efba..0e158fc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java
@@ -26,7 +26,7 @@ import java.sql.ResultSet;
 /**
  * @since 3.0
  */
-public class DateType implements ExtendedType {
+public class DateType implements ExtendedType<Date> {
 
     @Override
     public String getClassName() {
@@ -34,12 +34,12 @@ public class DateType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Date materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         return rs.getDate(index);
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Date materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return rs.getDate(index);
     }
@@ -47,7 +47,7 @@ public class DateType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Date value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -56,8 +56,16 @@ public class DateType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setDate(pos, (Date) value);
+            statement.setDate(pos, value);
         }
     }
 
+    @Override
+    public String toString(Date value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return '\'' + value.toString() + '\'';
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java
index 5464e0f..66186c6 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java
@@ -25,7 +25,7 @@ import java.sql.ResultSet;
 /**
  * @since 3.0
  */
-public class DoubleType implements ExtendedType {
+public class DoubleType implements ExtendedType<Double> {
 
     @Override
     public String getClassName() {
@@ -33,13 +33,13 @@ public class DoubleType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Double materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         double d = rs.getDouble(index);
         return rs.wasNull() ? null : d;
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Double materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         double d = rs.getDouble(index);
         return rs.wasNull() ? null : d;
@@ -48,7 +48,7 @@ public class DoubleType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Double value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -57,7 +57,16 @@ public class DoubleType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setDouble(pos, ((Number) value).doubleValue());
+            statement.setDouble(pos, value);
         }
     }
+
+    @Override
+    public String toString(Double value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
index 1261a26..e1af1db 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
@@ -24,6 +24,7 @@ import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
+import org.apache.cayenne.ExtendedEnumeration;
 import org.apache.cayenne.dba.TypesMapping;
 
 /**
@@ -36,10 +37,10 @@ import org.apache.cayenne.dba.TypesMapping;
  * 
  * @since 1.2
  */
-public class EnumType<T extends Enum<T>> implements ExtendedType {
+public class EnumType<T extends Enum<T>> implements ExtendedType<T> {
 
     protected Class<T> enumClass;
-    protected Object[] values;
+    protected T[] values;
     protected String canonicalName;
 
     public EnumType(Class<T> enumClass) {
@@ -52,7 +53,7 @@ public class EnumType<T extends Enum<T>> implements 
ExtendedType {
 
         try {
             Method m = enumClass.getMethod("values");
-            this.values = (Object[]) m.invoke(null);
+            this.values = (T[]) m.invoke(null);
         }
         catch (Exception e) {
             throw new IllegalArgumentException("Class "
@@ -69,20 +70,17 @@ public class EnumType<T extends Enum<T>> implements 
ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            T value,
             int pos,
             int type,
             int precision) throws Exception {
 
-        if (value instanceof Enum<?>) {
-
-            Enum<?> e = (Enum<?>) value;
-
+        if (value != null) {
             if (TypesMapping.isNumeric(type)) {
-                statement.setInt(pos, e.ordinal());
+                statement.setInt(pos, value.ordinal());
             }
             else {
-                statement.setString(pos, e.name());
+                statement.setString(pos, value.name());
             }
         }
         else {
@@ -91,7 +89,7 @@ public class EnumType<T extends Enum<T>> implements 
ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public T materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         if (TypesMapping.isNumeric(type)) {
             int i = rs.getInt(index);
             return (rs.wasNull() || index < 0) ? null : values[i];
@@ -103,9 +101,8 @@ public class EnumType<T extends Enum<T>> implements 
ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public T materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
-
         if (TypesMapping.isNumeric(type)) {
             int i = rs.getInt(index);
             return (rs.wasNull() || index < 0) ? null : values[i];
@@ -115,4 +112,28 @@ public class EnumType<T extends Enum<T>> implements 
ExtendedType {
             return string != null ? Enum.valueOf(enumClass, string) : null;
         }
     }
+
+    @Override
+    public String toString(T value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        StringBuilder buffer = new StringBuilder();
+        // buffer.append(object.getClass().getName()).append(".");
+        buffer.append(value.name()).append("=");
+        if (value instanceof ExtendedEnumeration) {
+            Object dbValue = ((ExtendedEnumeration) value).getDatabaseValue();
+            if (dbValue instanceof String)
+                buffer.append("'");
+            buffer.append(value);
+            if (dbValue instanceof String)
+                buffer.append("'");
+        } else {
+            buffer.append((value).ordinal());
+            // FIXME -- this isn't quite right
+        }
+
+        return buffer.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
index b37e07d..50dc48c 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
@@ -38,10 +38,10 @@ import java.util.Map;
  * 
  * @since 3.0
  */
-public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType {
+public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType<T> {
 
     private Class<T> enumerationClass = null;
-    private Object[] values = null;
+    private T[] values = null;
 
     // Contains a mapping of database values (Integer or String) and the
     // Enum for that value. This is to facilitate mapping database values
@@ -57,10 +57,10 @@ public class ExtendedEnumType<T extends Enum<T>> implements 
ExtendedType {
         try {
             Method m = enumerationClass.getMethod("values");
 
-            values = (Object[]) m.invoke(null);
+            values = (T[]) m.invoke(null);
 
             for (int i = 0; i < values.length; i++)
-                register((Enum<T>) values[i], ((ExtendedEnumeration) values[i])
+                register(values[i], ((ExtendedEnumeration) values[i])
                         .getDatabaseValue());
 
         }
@@ -77,7 +77,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements 
ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public T materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         if (TypesMapping.isNumeric(type)) {
             int i = rs.getInt(index);
             return (rs.wasNull() || index < 0) ? null : lookup(i);
@@ -89,7 +89,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements 
ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public T materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         if (TypesMapping.isNumeric(type)) {
             int i = rs.getInt(index);
@@ -104,7 +104,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements 
ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            T value,
             int pos,
             int type,
             int precision) throws Exception {
@@ -138,8 +138,8 @@ public class ExtendedEnumType<T extends Enum<T>> implements 
ExtendedType {
     /**
      * Lookup the giving database value and return the matching enum.
      */
-    private Enum<T> lookup(Object databaseValue) {
-        if (enumerationMappings.containsKey(databaseValue) == false) {
+    private T lookup(Object databaseValue) {
+        if (!enumerationMappings.containsKey(databaseValue)) {
             // All integers enums are mapped. Not necessarily all strings.
             if (databaseValue instanceof Integer)
                 throw new CayenneRuntimeException("Missing enumeration mapping 
for "
@@ -153,7 +153,31 @@ public class ExtendedEnumType<T extends Enum<T>> 
implements ExtendedType {
         }
 
         // Mapped value->enum exists, return it.
-        return enumerationMappings.get(databaseValue);
+        return (T) enumerationMappings.get(databaseValue);
+    }
+
+    @Override
+    public String toString(T value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        StringBuilder buffer = new StringBuilder();
+        // buffer.append(object.getClass().getName()).append(".");
+        buffer.append(value.name()).append("=");
+        if (value instanceof ExtendedEnumeration) {
+            Object dbValue = ((ExtendedEnumeration) value).getDatabaseValue();
+            if (dbValue instanceof String)
+                buffer.append("'");
+            buffer.append(value);
+            if (dbValue instanceof String)
+                buffer.append("'");
+        } else {
+            buffer.append((value).ordinal());
+            // FIXME -- this isn't quite right
+        }
+
+        return buffer.toString();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java
index dd025bf..0836290 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java
@@ -27,7 +27,7 @@ import java.sql.ResultSet;
  * Defines methods to read Java objects from JDBC ResultSets and write as 
parameters of
  * PreparedStatements.
  */
-public interface ExtendedType {
+public interface ExtendedType<T> {
 
     /**
      * Returns a full name of Java class that this ExtendedType supports.
@@ -39,7 +39,7 @@ public interface ExtendedType {
      */
     void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            T value,
             int pos,
             int type,
             int scale) throws Exception;
@@ -51,14 +51,20 @@ public interface ExtendedType {
      * @throws Exception if read error occurred, or an object can't be 
converted to a
      *             target Java class.
      */
-    Object materializeObject(ResultSet rs, int index, int type) throws 
Exception;
+    T materializeObject(ResultSet rs, int index, int type) throws Exception;
 
     /**
      * Reads an object from a stored procedure OUT parameter, converting it to 
class
      * returned by 'getClassName' method.
      * 
-     * @throws Exception if read error ocurred, or an object can't be 
converted to a
+     * @throws Exception if read error occurred, or an object can't be 
converted to a
      *             target Java class.
      */
-    Object materializeObject(CallableStatement rs, int index, int type) throws 
Exception;
+    T materializeObject(CallableStatement rs, int index, int type) throws 
Exception;
+
+    /**
+     *
+     */
+    String toString(T value);
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java
index a9c7f52..970aaa1 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java
@@ -27,39 +27,48 @@ import java.sql.ResultSet;
  * 
  * @since 3.0
  */
-abstract class ExtendedTypeDecorator implements ExtendedType {
+abstract class ExtendedTypeDecorator<T, E> implements ExtendedType<T> {
 
-    private ExtendedType decorated;
+    private ExtendedType<E> decorated;
 
-    ExtendedTypeDecorator(ExtendedType decorated) {
+    ExtendedTypeDecorator(ExtendedType<E> decorated) {
         this.decorated = decorated;
     }
 
-    abstract Object toJavaObject(Object object);
+    abstract T toJavaObject(E object);
 
-    abstract Object fromJavaObject(Object object);
+    abstract E fromJavaObject(T object);
 
     @Override
     public abstract String getClassName();
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public T materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return toJavaObject(decorated.materializeObject(rs, index, type));
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public T materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         return toJavaObject(decorated.materializeObject(rs, index, type));
     }
 
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            T value,
             int pos,
             int type,
             int precision) throws Exception {
         decorated.setJdbcObject(statement, fromJavaObject(value), pos, type, 
precision);
     }
+
+    @Override
+    public String toString(T value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java
index 8a63db4..822e9df 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java
@@ -25,7 +25,7 @@ import java.sql.ResultSet;
 /**
  * @since 3.0
  */
-public class FloatType implements ExtendedType {
+public class FloatType implements ExtendedType<Float> {
 
     @Override
     public String getClassName() {
@@ -33,13 +33,13 @@ public class FloatType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Float materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         float f = rs.getFloat(index);
         return rs.wasNull() ? null : f;
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Float materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         float f = rs.getFloat(index);
         return rs.wasNull() ? null : f;
@@ -48,7 +48,7 @@ public class FloatType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Float value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -57,8 +57,16 @@ public class FloatType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setFloat(pos, ((Number) value).floatValue());
+            statement.setFloat(pos, value);
         }
     }
 
+    @Override
+    public String toString(Float value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java
index 8375562..64ee766 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java
@@ -25,7 +25,7 @@ import java.sql.ResultSet;
 /**
  * @since 3.0
  */
-public class IntegerType implements ExtendedType {
+public class IntegerType implements ExtendedType<Integer> {
 
     @Override
     public String getClassName() {
@@ -33,13 +33,13 @@ public class IntegerType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Integer materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         int value = rs.getInt(index);
         return (rs.wasNull()) ? null : value;
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Integer materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         int value = rs.getInt(index);
         return (rs.wasNull()) ? null : value;
@@ -48,7 +48,7 @@ public class IntegerType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Integer value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -57,8 +57,16 @@ public class IntegerType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setInt(pos, ((Number) value).intValue());
+            statement.setInt(pos, value);
         }
     }
 
+    @Override
+    public String toString(Integer value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java
index 7287d66..decab14 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java
@@ -25,7 +25,7 @@ import java.sql.ResultSet;
 /**
  * @since 3.0
  */
-public class LongType implements ExtendedType {
+public class LongType implements ExtendedType<Long> {
 
     @Override
     public String getClassName() {
@@ -33,13 +33,13 @@ public class LongType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Long materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         long value = rs.getLong(index);
         return (rs.wasNull()) ? null : value;
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Long materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         long value = rs.getLong(index);
         return (rs.wasNull()) ? null : value;
@@ -48,7 +48,7 @@ public class LongType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Long value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -57,8 +57,16 @@ public class LongType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setLong(pos, ((Number) value).longValue());
+            statement.setLong(pos, value);
         }
     }
 
+    @Override
+    public String toString(Long value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java
index c14c340..6fb2d3e 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java
@@ -27,7 +27,7 @@ import java.sql.ResultSet;
  * 
  * @since 3.0
  */
-public class ObjectType implements ExtendedType {
+public class ObjectType implements ExtendedType<Object> {
 
     @Override
     public String getClassName() {
@@ -60,4 +60,13 @@ public class ObjectType implements ExtendedType {
         }
     }
 
+    @Override
+    public String toString(Object value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java
index 214f84b..e37eed5 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java
@@ -18,16 +18,16 @@
  ****************************************************************/
 package org.apache.cayenne.access.types;
 
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 /**
  * ExtendedTypeFactory for handling serializable objects. Returned ExtendedType
  * is simply an object serialization wrapper on top of byte[] ExtendedType.
@@ -59,15 +59,7 @@ class SerializableTypeFactory implements ExtendedTypeFactory 
{
 
                        // note - can't use "getRegisteredType" as it causes 
infinite
                        // recursion
-                       ExtendedType bytesType = 
map.getExplictlyRegisteredType("byte[]");
-
-                       // not sure if this type of recursion can occur, still 
worth
-                       // checking
-                       if (bytesType instanceof SerializableType) {
-                               throw new IllegalStateException("Can't create 
Serializable ExtendedType for "
-                                               + 
objectClass.getCanonicalName() + ": no ExtendedType exists for byte[]");
-                       }
-
+                       ExtendedType<byte[]> bytesType = 
map.getExplictlyRegisteredType("byte[]");
                        return new SerializableType(objectClass, bytesType);
                }
 
@@ -77,11 +69,11 @@ class SerializableTypeFactory implements 
ExtendedTypeFactory {
        /**
         * A serialization wrapper on top of byte[] ExtendedType
         */
-       final class SerializableType extends ExtendedTypeDecorator {
+       final class SerializableType extends ExtendedTypeDecorator<Object, 
byte[]> {
 
                private Class<?> javaClass;
 
-               SerializableType(Class<?> javaClass, ExtendedType bytesType) {
+               SerializableType(Class<?> javaClass, ExtendedType<byte[]> 
bytesType) {
                        super(bytesType);
                        this.javaClass = javaClass;
                }
@@ -92,7 +84,7 @@ class SerializableTypeFactory implements ExtendedTypeFactory {
                }
 
                @Override
-               Object fromJavaObject(Object object) {
+               byte[] fromJavaObject(Object object) {
                        ByteArrayOutputStream bytes = new 
ByteArrayOutputStream() {
 
                                // avoid unneeded array copy...
@@ -112,8 +104,7 @@ class SerializableTypeFactory implements 
ExtendedTypeFactory {
                }
 
                @Override
-               Object toJavaObject(Object object) {
-                       byte[] bytes = (byte[]) object;
+               Object toJavaObject(byte[] bytes) {
                        try {
                                return bytes != null && bytes.length > 0 ? new 
ObjectInputStream(new ByteArrayInputStream(bytes))
                                                .readObject() : null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java
index cfd8ee2..72ed935 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java
@@ -31,7 +31,7 @@ import java.sql.ResultSet;
  * 
  * @since 1.0.2
  */
-public class ShortType implements ExtendedType {
+public class ShortType implements ExtendedType<Short> {
 
     protected boolean widenShorts;
 
@@ -45,13 +45,13 @@ public class ShortType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Short materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         short s = rs.getShort(index);
         return (rs.wasNull()) ? null : s;
     }
 
     @Override
-    public Object materializeObject(CallableStatement st, int index, int type)
+    public Short materializeObject(CallableStatement st, int index, int type)
             throws Exception {
         short s = st.getShort(index);
         return (st.wasNull()) ? null : s;
@@ -60,7 +60,7 @@ public class ShortType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Short value,
             int pos,
             int type,
             int precision) throws Exception {
@@ -70,13 +70,21 @@ public class ShortType implements ExtendedType {
         }
         else {
 
-            Short s = (Short) value;
             if (widenShorts) {
-                statement.setInt(pos, s.intValue());
+                statement.setInt(pos, value.intValue());
             }
             else {
-                statement.setShort(pos, s.shortValue());
+                statement.setShort(pos, value);
             }
         }
     }
+
+    @Override
+    public String toString(Short value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java
index 67b4bd0..3026954 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java
@@ -26,7 +26,7 @@ import java.sql.Time;
 /**
  * @since 3.0
  */
-public class TimeType implements ExtendedType {
+public class TimeType implements ExtendedType<Time> {
 
     @Override
     public String getClassName() {
@@ -34,12 +34,12 @@ public class TimeType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws 
Exception {
+    public Time materializeObject(ResultSet rs, int index, int type) throws 
Exception {
         return rs.getTime(index);
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Time materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return rs.getTime(index);
     }
@@ -47,7 +47,7 @@ public class TimeType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Time value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -56,7 +56,16 @@ public class TimeType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setTime(pos, (Time) value);
+            statement.setTime(pos, value);
         }
     }
+
+    @Override
+    public String toString(Time value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return '\'' + value.toString() + '\'';
+    }
 }

Reply via email to