You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2017/01/24 13:23:05 UTC

[1/7] cayenne git commit: CAY-2050 | Fast hack for Cayenne Crypto

Repository: cayenne
Updated Branches:
  refs/heads/master ee021067a -> 27849ce59


CAY-2050 | Fast hack for Cayenne Crypto


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

Branch: refs/heads/master
Commit: e9e1e73a9b5c39aae649a062996787a29f01070c
Parents: b99c2b4
Author: Savva Kolbachev <s....@gmail.com>
Authored: Sat Jan 21 18:00:52 2017 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Sat Jan 21 18:16:02 2017 +0300

----------------------------------------------------------------------
 .../crypto/transformer/DefaultBindingsTransformer.java        | 1 +
 .../java/org/apache/cayenne/log/CommonsJdbcEventLogger.java   | 7 ++++++-
 2 files changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e1e73a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
index e8aeb4b..4844795 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
@@ -46,6 +46,7 @@ public class DefaultBindingsTransformer implements BindingsTransformer {
             DbAttributeBinding b = bindings[positions[i]];
             Object transformed = transformers[i].encrypt(encryptor, b.getValue());
             b.setValue(transformed);
+            b.setExtendedType(null); // TODO fast hack
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e1e73a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
index c10daad..83994dc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
@@ -376,7 +376,12 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 				}
 
 				buffer.append(":");
-				buffer.append(b.getExtendedType().toString(b.getValue()));
+
+				if (b.getExtendedType() != null) {
+					buffer.append(b.getExtendedType().toString(b.getValue()));
+				} else {
+					buffer.append(b.getValue());
+				}
 			}
 
 			if (hasIncluded) {


[7/7] cayenne git commit: CAY-2050 Refactoring: ParameterBinding to contain ExtendedType property

Posted by aa...@apache.org.
CAY-2050 Refactoring: ParameterBinding to contain ExtendedType property

* do not enclose NULL in quotation marks, as it will make it indistinguishable for a a String "null"
* refactoring


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

Branch: refs/heads/master
Commit: 27849ce595b291989aa830fdbb8f0f77923d71e8
Parents: 0161822
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Tue Jan 24 15:08:03 2017 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Jan 24 16:22:52 2017 +0300

----------------------------------------------------------------------
 .../java8/access/types/LocalDateTimeType.java   |  6 ++--
 .../java8/access/types/LocalDateType.java       |  6 ++--
 .../java8/access/types/LocalTimeType.java       |  6 ++--
 .../cayenne/joda/access/types/DateTimeType.java |  8 ++---
 .../joda/access/types/LocalDateTimeType.java    |  8 ++---
 .../joda/access/types/LocalDateType.java        |  8 ++---
 .../joda/access/types/LocalTimeType.java        | 12 +++----
 .../cayenne/access/types/BigDecimalType.java    |  2 +-
 .../cayenne/access/types/BigIntegerType.java    |  6 ++--
 .../cayenne/access/types/BooleanType.java       |  2 +-
 .../cayenne/access/types/ByteArrayType.java     | 36 ++++++++++++++++----
 .../access/types/ByteOrCharArrayFactory.java    | 10 +++---
 .../apache/cayenne/access/types/ByteType.java   |  6 ++--
 .../cayenne/access/types/CalendarType.java      |  8 ++---
 .../apache/cayenne/access/types/CharType.java   | 12 ++++---
 .../apache/cayenne/access/types/DateType.java   |  2 +-
 .../apache/cayenne/access/types/DoubleType.java |  2 +-
 .../apache/cayenne/access/types/EnumType.java   | 21 ++++++------
 .../cayenne/access/types/ExtendedEnumType.java  |  2 +-
 .../cayenne/access/types/ExtendedType.java      | 20 +++++++----
 .../access/types/ExtendedTypeDecorator.java     |  2 +-
 .../apache/cayenne/access/types/FloatType.java  |  2 +-
 .../cayenne/access/types/IntegerType.java       |  2 +-
 .../apache/cayenne/access/types/LongType.java   |  2 +-
 .../apache/cayenne/access/types/ObjectType.java |  2 +-
 .../apache/cayenne/access/types/ShortType.java  |  2 +-
 .../apache/cayenne/access/types/TimeType.java   |  2 +-
 .../cayenne/access/types/TimestampType.java     |  2 +-
 .../apache/cayenne/access/types/UUIDType.java   |  6 ++--
 .../cayenne/access/types/UtilDateType.java      |  6 ++--
 .../apache/cayenne/access/types/VoidType.java   |  2 +-
 .../cayenne/dba/oracle/OracleAdapter.java       | 22 ++++++------
 .../dba/sqlite/SQLiteBigDecimalType.java        |  6 ++--
 .../cayenne/dba/sqlite/SQLiteByteArrayType.java | 10 +++---
 .../cayenne/dba/sqlite/SQLiteCalendarType.java  |  8 ++---
 .../cayenne/dba/sqlite/SQLiteFloatType.java     |  6 ++--
 .../cayenne/log/CommonsJdbcEventLogger.java     | 29 +++++++++++-----
 .../java/org/apache/cayenne/util/IDUtil.java    | 34 ++----------------
 .../cayenne/access/types/MockExtendedType.java  |  2 +-
 .../extended_type/StringET1ExtendedType.java    |  6 ++--
 .../cayenne/unit/jira/CAY_207StringType1.java   |  6 ++--
 .../cayenne/unit/jira/CAY_207StringType2.java   |  6 ++--
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  1 +
 43 files changed, 182 insertions(+), 167 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 f47e247..6242574 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,14 +19,14 @@
 
 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;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 public class LocalDateTimeType implements ExtendedType<LocalDateTime> {
 
     @Override
@@ -54,7 +54,7 @@ public class LocalDateTimeType implements ExtendedType<LocalDateTime> {
     @Override
     public String toString(LocalDateTime value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 ee602d5..0d0b431 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,14 +19,14 @@
 
 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;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 public class LocalDateType implements ExtendedType<LocalDate> {
 
     @Override
@@ -54,7 +54,7 @@ public class LocalDateType implements ExtendedType<LocalDate> {
     @Override
     public String toString(LocalDate value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 f1a8dea..1b0afb4 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,14 +19,14 @@
 
 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;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 public class LocalTimeType implements ExtendedType<LocalTime> {
 
     @Override
@@ -54,7 +54,7 @@ public class LocalTimeType implements ExtendedType<LocalTime> {
     @Override
     public String toString(LocalTime value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 a042b3d..5b8bb63 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,14 +19,14 @@
 
 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.
  *
@@ -70,7 +70,7 @@ public class DateTimeType implements ExtendedType<DateTime> {
     @Override
     public String toString(DateTime value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 97d3900..e12ab04 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,15 +19,15 @@
 
 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.
  *
@@ -71,7 +71,7 @@ public class LocalDateTimeType implements ExtendedType<LocalDateTime> {
     @Override
     public String toString(LocalDateTime value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 19f05b6..c59a371 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
@@ -19,6 +19,9 @@
 
 package org.apache.cayenne.joda.access.types;
 
+import org.apache.cayenne.access.types.ExtendedType;
+import org.joda.time.LocalDate;
+
 import java.sql.CallableStatement;
 import java.sql.Date;
 import java.sql.PreparedStatement;
@@ -26,9 +29,6 @@ import java.sql.ResultSet;
 import java.sql.Timestamp;
 import java.sql.Types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-import org.joda.time.LocalDate;
-
 /**
  * Handles <code>org.joda.time.LocalDate</code> type mapping.
  *
@@ -81,7 +81,7 @@ public class LocalDateType implements ExtendedType<LocalDate> {
     @Override
     public String toString(LocalDate value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 501f889..87d4fca 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
@@ -19,6 +19,11 @@
 
 package org.apache.cayenne.joda.access.types;
 
+import org.apache.cayenne.access.types.ExtendedType;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalTime;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -26,11 +31,6 @@ import java.sql.Time;
 import java.sql.Timestamp;
 import java.sql.Types;
 
-import org.apache.cayenne.access.types.ExtendedType;
-import org.joda.time.DateTimeZone;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalTime;
-
 /**
  * Handles <code>org.joda.time.LocalTime</code> type mapping.
  *
@@ -86,7 +86,7 @@ public class LocalTimeType implements ExtendedType<LocalTime> {
     @Override
     public String toString(LocalTime value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 11e9860..626e794 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
@@ -63,7 +63,7 @@ public class BigDecimalType implements ExtendedType<BigDecimal> {
     @Override
     public String toString(BigDecimal value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 a3d1752..f6c10b1 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
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.dba.TypesMapping;
+
 import java.math.BigInteger;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.dba.TypesMapping;
-
 /**
  * @since 3.0
  */
@@ -80,7 +80,7 @@ public class BigIntegerType implements ExtendedType<BigInteger> {
     @Override
     public String toString(BigInteger value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 be0d597..8de103d 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
@@ -75,7 +75,7 @@ public class BooleanType implements ExtendedType<Boolean> {
     @Override
     public String toString(Boolean value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 3ad6898..21fc5b7 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
@@ -19,6 +19,10 @@
 
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.CayenneException;
+import org.apache.cayenne.util.IDUtil;
+import org.apache.cayenne.util.MemoryBlob;
+
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -29,10 +33,6 @@ import java.sql.ResultSet;
 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.
@@ -44,6 +44,30 @@ public class ByteArrayType implements ExtendedType<byte[]> {
 	protected boolean trimmingBytes;
 	protected boolean usingBlobs;
 
+    public static void logBytes(StringBuilder buffer, byte[] bytes) {
+        buffer.append("< ");
+
+        int len = bytes.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, bytes[i]);
+        }
+
+        if (trimming) {
+            buffer.append("...");
+        }
+
+        buffer.append('>');
+    }
+
 	/**
 	 * Strips null bytes from the byte array, returning a potentially smaller
 	 * array that contains no trailing zero bytes.
@@ -141,11 +165,11 @@ public class ByteArrayType implements ExtendedType<byte[]> {
 	@Override
 	public String toString(byte[] value) {
 		if (value == null) {
-			return "\'null\'";
+			return "NULL";
 		}
 
 		StringBuilder buffer = new StringBuilder();
-		IDUtil.appendFormattedBytes(buffer, value);
+		logBytes(buffer, value);
 		return buffer.toString();
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 8db28ce..2b1b83f 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,11 +18,9 @@
  ****************************************************************/
 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;
+import java.lang.reflect.Array;
 
 /**
  * A factory that dynamically creates ExtendedTypes for Character, Character[], Byte[] and
@@ -123,7 +121,7 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory {
         @Override
         public String toString(char[] value) {
             if (value == null) {
-                return "\'null\'";
+                return "NULL";
             }
 
             StringBuilder buffer = new StringBuilder();
@@ -194,7 +192,7 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory {
         @Override
         public String toString(Character[] value) {
             if (value == null) {
-                return "\'null\'";
+                return "NULL";
             }
 
             StringBuilder buffer = new StringBuilder();
@@ -265,7 +263,7 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory {
         @Override
         public String toString(Byte[] value) {
             if (value == null) {
-                return "\'null\'";
+                return "NULL";
             }
 
             StringBuilder buffer = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 c11191d..b363bbf 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
@@ -19,12 +19,12 @@
 
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.util.IDUtil;
+
 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
@@ -83,7 +83,7 @@ public class ByteType implements ExtendedType<Byte> {
     @Override
     public String toString(Byte value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         StringBuilder buffer = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 acc53b2..0b60548 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
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.dba.TypesMapping;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -26,9 +29,6 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
 
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.dba.TypesMapping;
-
 /**
  * ExtendedType that handles {@link java.util.Calendar} fields.
  * 
@@ -172,7 +172,7 @@ public class CalendarType<T extends Calendar> implements ExtendedType<Calendar>
     @Override
     public String toString(Calendar value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.getClass().getName() + '(' + new java.sql.Timestamp(value.getTimeInMillis()) + ')';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 5da2bae..cf807a9 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,6 +19,8 @@
 
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.CayenneException;
+
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringWriter;
@@ -29,8 +31,6 @@ 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.
@@ -117,18 +117,19 @@ public class CharType implements ExtendedType<String> {
 	@Override
 	public String toString(String value) {
 		if (value == null) {
-			return "\'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) + "...";
 		}
 
+		// escape quotes
 		int curPos = 0;
 		int endPos = 0;
 
@@ -137,8 +138,9 @@ public class CharType implements ExtendedType<String> {
 			curPos = endPos + 1;
 		}
 
-		if (curPos < literal.length())
+		if (curPos < literal.length()) {
 			buffer.append(literal.substring(curPos));
+		}
 
 		buffer.append('\'');
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 0e158fc..654e1fe 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
@@ -63,7 +63,7 @@ public class DateType implements ExtendedType<Date> {
     @Override
     public String toString(Date value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 66186c6..cfdd91f 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
@@ -64,7 +64,7 @@ public class DoubleType implements ExtendedType<Double> {
     @Override
     public String toString(Double value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 e1af1db..f8c4192 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
@@ -19,14 +19,14 @@
 
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.ExtendedEnumeration;
+import org.apache.cayenne.dba.TypesMapping;
+
 import java.lang.reflect.Method;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.ExtendedEnumeration;
-import org.apache.cayenne.dba.TypesMapping;
-
 /**
  * An ExtendedType that handles an enum class. If Enum is mapped to a character column,
  * its name is used as persistent value; if it is mapped to a numeric column, its ordinal
@@ -116,22 +116,21 @@ public class EnumType<T extends Enum<T>> implements ExtendedType<T> {
     @Override
     public String toString(T value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         StringBuilder buffer = new StringBuilder();
-        // buffer.append(object.getClass().getName()).append(".");
-        buffer.append(value.name()).append("=");
+        buffer.append(value.name());
         if (value instanceof ExtendedEnumeration) {
+            buffer.append("=");
             Object dbValue = ((ExtendedEnumeration) value).getDatabaseValue();
-            if (dbValue instanceof String)
+            if (dbValue instanceof String) {
                 buffer.append("'");
+            }
             buffer.append(value);
-            if (dbValue instanceof String)
+            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/27849ce5/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 50dc48c..3ac8dc9 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
@@ -159,7 +159,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType<T> {
     @Override
     public String toString(T value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         StringBuilder buffer = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 0836290..b30f674 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
@@ -24,11 +24,16 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
 /**
- * Defines methods to read Java objects from JDBC ResultSets and write as parameters of
- * PreparedStatements.
+ * Defines methods to read Java objects from JDBC ResultSets and write as parameters of PreparedStatements.
  */
 public interface ExtendedType<T> {
 
+
+    /**
+     * Defines trimming constant for toString method that helps to limit logging of large values.
+     */
+    int TRIM_VALUES_THRESHOLD = 30;
+
     /**
      * Returns a full name of Java class that this ExtendedType supports.
      */
@@ -47,23 +52,26 @@ public interface ExtendedType<T> {
     /**
      * Reads an object from JDBC ResultSet column, converting it to class returned by
      * 'getClassName' method.
-     * 
+     *
      * @throws Exception if read error occurred, or an object can't be converted to a
-     *             target Java class.
+     *                   target Java class.
      */
     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 occurred, or an object can't be converted to a
-     *             target Java class.
+     *                   target Java class.
      */
     T materializeObject(CallableStatement rs, int index, int type) throws Exception;
 
     /**
+     * Converts value of the supported type to a human-readable String representation.
      *
+     * @param value a vlue to convert to String.
+     * @since 4.0
      */
     String toString(T value);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 970aaa1..388b8e0 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
@@ -66,7 +66,7 @@ abstract class ExtendedTypeDecorator<T, E> implements ExtendedType<T> {
     @Override
     public String toString(T value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 822e9df..51713db 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
@@ -64,7 +64,7 @@ public class FloatType implements ExtendedType<Float> {
     @Override
     public String toString(Float value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 64ee766..0d2ec62 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
@@ -64,7 +64,7 @@ public class IntegerType implements ExtendedType<Integer> {
     @Override
     public String toString(Integer value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 decab14..287190e 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
@@ -64,7 +64,7 @@ public class LongType implements ExtendedType<Long> {
     @Override
     public String toString(Long value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 6fb2d3e..2473177 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
@@ -63,7 +63,7 @@ public class ObjectType implements ExtendedType<Object> {
     @Override
     public String toString(Object value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 72ed935..257f7cc 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
@@ -82,7 +82,7 @@ public class ShortType implements ExtendedType<Short> {
     @Override
     public String toString(Short value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/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 3026954..8966f82 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
@@ -63,7 +63,7 @@ public class TimeType implements ExtendedType<Time> {
     @Override
     public String toString(Time value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
index 8b877a0..d6b6aca 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
@@ -63,7 +63,7 @@ public class TimestampType implements ExtendedType<Timestamp> {
     @Override
     public String toString(Timestamp value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
index 8ff5eae..fd700ea 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.CayenneRuntimeException;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.util.UUID;
 
-import org.apache.cayenne.CayenneRuntimeException;
-
 /**
  * An ExtendedType to map Java UUIDs as persistent attributes.
  * 
@@ -87,7 +87,7 @@ public class UUIDType implements ExtendedType<UUID> {
     @Override
     public String toString(UUID value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
index dafd472..9fa5010 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
@@ -19,14 +19,14 @@
 
 package org.apache.cayenne.access.types;
 
+import org.apache.cayenne.dba.TypesMapping;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.Types;
 import java.util.Date;
 
-import org.apache.cayenne.dba.TypesMapping;
-
 /**
  * Maps <code>java.util.Date</code> to any of the three database date/time types: TIME,
  * DATE, TIMESTAMP.
@@ -122,7 +122,7 @@ public class UtilDateType implements ExtendedType<Date> {
     @Override
     public String toString(Date value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         long time = value.getTime();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
index 52ff9fb..d842d96 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
@@ -60,7 +60,7 @@ public class VoidType implements ExtendedType<Void> {
     @Override
     public String toString(Void value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
index c0ac4f0..00ff222 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
@@ -19,16 +19,6 @@
 
 package org.apache.cayenne.dba.oracle;
 
-import java.lang.reflect.Field;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.translator.ParameterBinding;
@@ -57,6 +47,16 @@ import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.UpdateBatchQuery;
 import org.apache.cayenne.resource.ResourceLocator;
 
+import java.lang.reflect.Field;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * DbAdapter implementation for <a href="http://www.oracle.com">Oracle RDBMS
  * </a>. Sample connection settings to use with Oracle are shown below:
@@ -345,7 +345,7 @@ public class OracleAdapter extends JdbcAdapter {
 		@Override
 		public String toString(Boolean value) {
 			if (value == null) {
-				return "\'null\'";
+				return "NULL";
 			}
 
 			return '\'' + value.toString() + '\'';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
index e834bbc..440d9d8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.dba.sqlite;
 
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.math.BigDecimal;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 /**
  * @since 3.0
  */
@@ -73,7 +73,7 @@ class SQLiteBigDecimalType implements ExtendedType<BigDecimal> {
     @Override
     public String toString(BigDecimal value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
index 11526e0..dca1e48 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.dba.sqlite;
 
+import org.apache.cayenne.access.types.ByteArrayType;
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.util.IDUtil;
-
 /**
  * @since 3.0
  */
@@ -70,11 +70,11 @@ class SQLiteByteArrayType implements ExtendedType<byte[]> {
     @Override
     public String toString(byte[] value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         StringBuilder buffer = new StringBuilder();
-        IDUtil.appendFormattedBytes(buffer, value);
+        ByteArrayType.logBytes(buffer, value);
         return buffer.toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
index e099b2b..7749032 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.dba.sqlite;
 
+import org.apache.cayenne.access.types.CalendarType;
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -25,9 +28,6 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
 
-import org.apache.cayenne.access.types.CalendarType;
-import org.apache.cayenne.access.types.ExtendedType;
-
 /**
  * @since 3.0
  */
@@ -85,7 +85,7 @@ class SQLiteCalendarType<T extends Calendar> implements ExtendedType<Calendar> {
     @Override
     public String toString(Calendar value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.getClass().getName() + '(' + new java.sql.Timestamp(value.getTimeInMillis()) + ')';

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
index c80961a..100dfba 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
@@ -18,12 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.dba.sqlite;
 
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 /**
  * @since 3.0
  */
@@ -70,7 +70,7 @@ class SQLiteFloatType implements ExtendedType<Float> {
     @Override
     public String toString(Float value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
index 83994dc..27a9d65 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
@@ -18,11 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.log;
 
-import java.lang.reflect.Array;
-import java.sql.SQLException;
-import java.util.Iterator;
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ExtendedEnumeration;
 import org.apache.cayenne.access.jdbc.SQLParameterBinding;
@@ -37,6 +32,11 @@ import org.apache.cayenne.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.lang.reflect.Array;
+import java.sql.SQLException;
+import java.util.Iterator;
+import java.util.List;
+
 /**
  * A {@link JdbcEventLogger} built on top of commons-logging.
  * 
@@ -46,7 +46,10 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 
 	private static final Log logger = LogFactory.getLog(CommonsJdbcEventLogger.class);
 
-	public static final int TRIM_VALUES_THRESHOLD = 30;
+    /**
+     * @deprecated  since 4.0
+     */
+	private static final int TRIM_VALUES_THRESHOLD = 30;
 
 	protected long queryExecutionTimeLoggingThreshold;
 
@@ -55,6 +58,8 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 				Constants.QUERY_EXECUTION_TIME_LOGGING_THRESHOLD_PROPERTY, 0);
 	}
 
+	// this should go away once we can remove 4.0 deprecated API. The actual logic for printing a value is now
+    // spread around the ExtendedTypes
 	void sqlLiteralForObject(StringBuilder buffer, Object object) {
 		if (object == null) {
 			buffer.append("NULL");
@@ -320,6 +325,9 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 		}
 	}
 
+	/**
+	 * @deprecated since 4.0
+	 */
 	@Deprecated
 	@Override
 	public void logQueryParameters(String label, List<DbAttribute> attrs, List<Object> parameters, boolean isInserting) {
@@ -379,8 +387,13 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 
 				if (b.getExtendedType() != null) {
 					buffer.append(b.getExtendedType().toString(b.getValue()));
-				} else {
-					buffer.append(b.getValue());
+				} else if(b.getValue() == null) {
+				    buffer.append("NULL");
+                }
+                else {
+					buffer.append(b.getValue().getClass().getName())
+                            .append("@")
+                            .append(System.identityHashCode(b.getValue()));
 				}
 			}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java b/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
index 6f4df35..ccda74c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
@@ -19,15 +19,13 @@
 
 package org.apache.cayenne.util;
 
+import org.apache.cayenne.CayenneRuntimeException;
+
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 
-import org.apache.cayenne.CayenneRuntimeException;
-
-import static org.apache.cayenne.log.CommonsJdbcEventLogger.TRIM_VALUES_THRESHOLD;
-
 /**
  * helper class to generate pseudo-GUID sequences.
  *
@@ -86,34 +84,6 @@ public class IDUtil {
         }
     }
 
-    public static void appendFormattedBytes(Appendable buffer, byte[] bytes) {
-        try {
-            buffer.append("< ");
-
-            int len = bytes.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(",");
-                }
-                appendFormattedByte(buffer, bytes[i]);
-            }
-
-            if (trimming) {
-                buffer.append("...");
-            }
-
-            buffer.append('>');
-        } catch (IOException e) {
-            throw new CayenneRuntimeException("Error appending data to buffer", e);
-        }
-    }
-
     /**
      * @param length the length of returned byte[]
      * @return A pseudo-unique byte array of the specified length. Length must be at least

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java b/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
index 0f7a2af..4a81ed7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
@@ -63,7 +63,7 @@ public class MockExtendedType implements ExtendedType<Object> {
     @Override
     public String toString(Object value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
index 826c5ea..28cd3db 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
@@ -18,12 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.testdo.extended_type;
 
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 public class StringET1ExtendedType implements ExtendedType<StringET1> {
 
     @Override
@@ -63,7 +63,7 @@ public class StringET1ExtendedType implements ExtendedType<StringET1> {
     @Override
     public String toString(StringET1 value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
index 7c70441..1284e70 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
@@ -19,12 +19,12 @@
 
 package org.apache.cayenne.unit.jira;
 
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 public class CAY_207StringType1 implements ExtendedType<CAY_207String1> {
 
     @Override
@@ -62,7 +62,7 @@ public class CAY_207StringType1 implements ExtendedType<CAY_207String1> {
     @Override
     public String toString(CAY_207String1 value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
index 8483651..0d1a54f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
@@ -19,12 +19,12 @@
 
 package org.apache.cayenne.unit.jira;
 
+import org.apache.cayenne.access.types.ExtendedType;
+
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 /**
  */
 public class CAY_207StringType2 implements ExtendedType<CAY_207String2> {
@@ -64,7 +64,7 @@ public class CAY_207StringType2 implements ExtendedType<CAY_207String2> {
     @Override
     public String toString(CAY_207String2 value) {
         if (value == null) {
-            return "\'null\'";
+            return "NULL";
         }
 
         return value.toString();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/27849ce5/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index bdd5abc..9572224 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -14,6 +14,7 @@ Date:
 Changes/New Features:
 
 CAY-2139 Upgrade HSQLDB dependency to the most recent version (2.3.4)
+CAY-2150 Refactoring: ParameterBinding to contain ExtendedType property
 CAY-2163 Property.path() , ExpressionFactory.pathExp()
 CAY-2164 Relocate builder bootstrap methods from ServerRuntimeBuilder to ServerRuntime
 CAY-2165 Explicit "contribution" API for easier expansion of DI collections and maps


[4/7] cayenne git commit: CAY-2050 | Choosing ExtendedType based on object class

Posted by aa...@apache.org.
CAY-2050 | Choosing ExtendedType based on object class


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

Branch: refs/heads/master
Commit: b99c2b4b1200a4acfb6a44fc7312b020dc3b1e25
Parents: efa48e5
Author: Savva Kolbachev <s....@gmail.com>
Authored: Sat Jan 21 17:17:34 2017 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Sat Jan 21 18:16:02 2017 +0300

----------------------------------------------------------------------
 .../cayenne/access/jdbc/SQLTemplateAction.java  | 33 ++++++------
 .../access/translator/DbAttributeBinding.java   |  5 +-
 .../access/translator/ParameterBinding.java     | 11 ++--
 .../translator/ProcedureParameterBinding.java   |  5 +-
 .../translator/batch/DeleteBatchTranslator.java | 20 ++++----
 .../translator/batch/InsertBatchTranslator.java | 18 ++++---
 .../batch/SoftDeleteBatchTranslator.java        | 11 ++--
 .../translator/batch/UpdateBatchTranslator.java | 31 ++++++------
 .../procedure/ProcedureTranslator.java          | 23 +++++----
 .../translator/select/QueryAssembler.java       | 23 +++++----
 .../org/apache/cayenne/dba/JdbcAdapter.java     | 37 +++++++-------
 .../dba/oracle/Oracle8LOBBatchAction.java       | 53 ++++++++++++--------
 .../dba/oracle/Oracle8LOBBatchTranslator.java   | 22 ++++----
 13 files changed, 160 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
index eea8470..c8369a0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
@@ -19,6 +19,19 @@
 
 package org.apache.cayenne.access.jdbc;
 
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.cayenne.CayenneException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ResultIterator;
@@ -40,19 +53,6 @@ import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.util.Util;
 import org.apache.commons.collections.IteratorUtils;
 
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Implements a strategy for execution of SQLTemplates.
  * 
@@ -235,9 +235,7 @@ public class SQLTemplateAction implements SQLAction {
 		RowDescriptorBuilder builder = configureRowDescriptorBuilder(compiled, resultSet);
 		RowReader<?> rowReader = dataNode.rowReader(builder.getDescriptor(types), queryMetadata);
 
-		JDBCResultIterator result = new JDBCResultIterator(statement, resultSet, rowReader);
-
-		ResultIterator it = result;
+		ResultIterator it = new JDBCResultIterator(statement, resultSet, rowReader);
 
 		if (iteratedResult) {
 
@@ -357,10 +355,11 @@ public class SQLTemplateAction implements SQLAction {
 						? getAdapter().getExtendedTypes().getRegisteredType(value.getClass())
 						: getAdapter().getExtendedTypes().getDefaultType();
 
-				ParameterBinding binding = new ParameterBinding(extendedType);
+				ParameterBinding binding = new ParameterBinding();
 				binding.setType(bindings[i].getJdbcType());
 				binding.setStatementPosition(i + 1);
 				binding.setValue(value);
+				binding.setExtendedType(extendedType);
 				dataNode.getAdapter().bindParameter(preparedStatement, binding);
 			}
 		}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/DbAttributeBinding.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/DbAttributeBinding.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/DbAttributeBinding.java
index 523c473..78b6d71 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/DbAttributeBinding.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/DbAttributeBinding.java
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.access.translator;
 
-import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.map.DbAttribute;
 
 /**
@@ -30,8 +29,8 @@ public class DbAttributeBinding extends ParameterBinding {
 
 	private final DbAttribute attribute;
 
-	public DbAttributeBinding(DbAttribute attribute, ExtendedType extendedType) {
-		super(extendedType);
+	public DbAttributeBinding(DbAttribute attribute) {
+		super();
 		this.attribute = attribute;
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java
index 8ef6b28..68d68ba 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java
@@ -35,9 +35,8 @@ public class ParameterBinding {
 	private Integer type;
 	private int scale;
 
-	public ParameterBinding(ExtendedType extendedType) {
+	public ParameterBinding() {
 		this.statementPosition = EXCLUDED_POSITION;
-		this.extendedType = extendedType;
 	}
 
 	public Object getValue() {
@@ -64,21 +63,27 @@ public class ParameterBinding {
 		return extendedType;
 	}
 
+	public void setExtendedType(ExtendedType extendedType) {
+		this.extendedType = extendedType;
+	}
+
 	/**
 	 * Marks the binding object as excluded for the current iteration.
 	 */
 	public void exclude() {
 		this.statementPosition = EXCLUDED_POSITION;
 		this.value = null;
+		this.extendedType = null;
 	}
 
 	/**
 	 * Sets the value of the binding and initializes statement position var,
 	 * thus "including" this binding in the current iteration.
 	 */
-	public void include(int statementPosition, Object value) {
+	public void include(int statementPosition, Object value, ExtendedType extendedType) {
 		this.statementPosition = statementPosition;
 		this.value = value;
+		this.extendedType = extendedType;
 	}
 
 	public Integer getType() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ProcedureParameterBinding.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ProcedureParameterBinding.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ProcedureParameterBinding.java
index df15c96..6ccfaf2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ProcedureParameterBinding.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ProcedureParameterBinding.java
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.access.translator;
 
-import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.map.ProcedureParameter;
 
 /**
@@ -30,8 +29,8 @@ public class ProcedureParameterBinding extends ParameterBinding {
 
 	private final ProcedureParameter parameter;
 
-	public ProcedureParameterBinding(ProcedureParameter procedureParameter, ExtendedType extendedType) {
-		super(extendedType);
+	public ProcedureParameterBinding(ProcedureParameter procedureParameter) {
+		super();
 		this.parameter = procedureParameter;
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
index 9660b3f..d42240e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
@@ -19,18 +19,17 @@
 
 package org.apache.cayenne.access.translator.batch;
 
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.BatchQueryRow;
 import org.apache.cayenne.query.DeleteBatchQuery;
 
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * Translator for delete BatchQueries. Creates parameterized DELETE SQL
  * statements.
@@ -82,11 +81,7 @@ public class DeleteBatchTranslator extends DefaultBatchTranslator {
         DbAttributeBinding[] bindings = new DbAttributeBinding[len];
 
         for (int i = 0; i < len; i++) {
-            DbAttribute a = attributes.get(i);
-
-            String typeName = TypesMapping.getJavaBySqlType(a.getType());
-            ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
-            bindings[i] = new DbAttributeBinding(a, extendedType);
+            bindings[i] = new DbAttributeBinding(attributes.get(i));
         }
 
         return bindings;
@@ -107,7 +102,12 @@ public class DeleteBatchTranslator extends DefaultBatchTranslator {
             if (deleteBatch.isNull(b.getAttribute())) {
                 b.exclude();
             } else {
-                b.include(j++, row.getValue(i));
+                Object value = row.getValue(i);
+                ExtendedType extendedType = value != null
+                        ? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+                        : adapter.getExtendedTypes().getDefaultType();
+
+                b.include(j++, value, extendedType);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
index cf52929..d597f38 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
@@ -19,17 +19,16 @@
 
 package org.apache.cayenne.access.translator.batch;
 
+import java.util.List;
+
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.BatchQueryRow;
 import org.apache.cayenne.query.InsertBatchQuery;
 
-import java.util.List;
-
 /**
  * Translator of InsertBatchQueries.
  */
@@ -93,16 +92,14 @@ public class InsertBatchTranslator extends DefaultBatchTranslator {
         for (int i = 0; i < len; i++) {
             DbAttribute a = attributes.get(i);
 
-            String typeName = TypesMapping.getJavaBySqlType(a.getType());
-            ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
-            bindings[i] = new DbAttributeBinding(a, extendedType);
+            bindings[i] = new DbAttributeBinding(a);
 
             // include/exclude state depends on DbAttribute only and can be
             // precompiled here
             if (includeInBatch(a)) {
                 // setting fake position here... all we care about is that it is
                 // > -1
-                bindings[i].include(1, null);
+                bindings[i].include(1, null, null);
             } else {
                 bindings[i].exclude();
             }
@@ -121,7 +118,12 @@ public class InsertBatchTranslator extends DefaultBatchTranslator {
 
             // exclusions are permanent
             if (!b.isExcluded()) {
-                b.include(j++, row.getValue(i));
+                Object value = row.getValue(i);
+                ExtendedType extendedType = value != null
+                        ? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+                        : adapter.getExtendedTypes().getDefaultType();
+
+                b.include(j++, value, extendedType);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
index 514ca26..ed28cc5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
@@ -68,8 +68,8 @@ public class SoftDeleteBatchTranslator extends DeleteBatchTranslator {
         String typeName = TypesMapping.getJavaBySqlType(deleteAttribute.getType());
         ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
 
-        bindings[0] = new DbAttributeBinding(deleteAttribute, extendedType);
-        bindings[0].include(1, true);
+        bindings[0] = new DbAttributeBinding(deleteAttribute);
+        bindings[0].include(1, true, extendedType);
         
         System.arraycopy(superBindings, 0, bindings, 1, slen);
 
@@ -91,7 +91,12 @@ public class SoftDeleteBatchTranslator extends DeleteBatchTranslator {
             if (deleteBatch.isNull(b.getAttribute())) {
                 b.exclude();
             } else {
-                b.include(j++, row.getValue(i - 1));
+                Object value = row.getValue(i - 1);
+                ExtendedType extendedType = value != null
+                        ? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+                        : adapter.getExtendedTypes().getDefaultType();
+
+                b.include(j++, value, extendedType);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
index cb34b99..ecd2619 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
@@ -19,18 +19,17 @@
 
 package org.apache.cayenne.access.translator.batch;
 
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.BatchQueryRow;
 import org.apache.cayenne.query.UpdateBatchQuery;
 
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * A translator for UpdateBatchQueries that produces parameterized SQL.
  */
@@ -93,19 +92,11 @@ public class UpdateBatchTranslator extends DefaultBatchTranslator {
         DbAttributeBinding[] bindings = new DbAttributeBinding[ul + ql];
 
         for (int i = 0; i < ul; i++) {
-            DbAttribute a = updatedDbAttributes.get(i);
-
-            String typeName = TypesMapping.getJavaBySqlType(a.getType());
-            ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
-            bindings[i] = new DbAttributeBinding(a, extendedType);
+            bindings[i] = new DbAttributeBinding(updatedDbAttributes.get(i));
         }
 
         for (int i = 0; i < ql; i++) {
-            DbAttribute a = qualifierAttributes.get(i);
-
-            String typeName = TypesMapping.getJavaBySqlType(a.getType());
-            ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
-            bindings[ul + i] = new DbAttributeBinding(a, extendedType);
+            bindings[ul + i] = new DbAttributeBinding(qualifierAttributes.get(i));
         }
 
         return bindings;
@@ -126,7 +117,11 @@ public class UpdateBatchTranslator extends DefaultBatchTranslator {
 
         for (int i = 0; i < ul; i++) {
             Object value = row.getValue(i);
-            bindings[i].include(j++, value);
+            ExtendedType extendedType = value != null
+                    ? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+                    : adapter.getExtendedTypes().getDefaultType();
+
+            bindings[i].include(j++, value, extendedType);
         }
 
         for (int i = 0; i < ql; i++) {
@@ -139,7 +134,11 @@ public class UpdateBatchTranslator extends DefaultBatchTranslator {
             }
 
             Object value = row.getValue(ul + i);
-            bindings[ul + i].include(j++, value);
+            ExtendedType extendedType = value != null
+                    ? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+                    : adapter.getExtendedTypes().getDefaultType();
+
+            bindings[ul + i].include(j++, value, extendedType);
         }
 
         return bindings;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
index f919a8b..92feb2c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
@@ -19,6 +19,13 @@
 
 package org.apache.cayenne.access.translator.procedure;
 
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.cayenne.access.translator.ProcedureParameterBinding;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
@@ -29,13 +36,6 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.query.ProcedureQuery;
 
-import java.sql.CallableStatement;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Stored procedure query translator.
  */
@@ -229,11 +229,14 @@ public class ProcedureTranslator {
 			ProcedureParameter param,
 			Object val,
 			int pos) throws Exception {
-		ExtendedType extendedType = val != null ? adapter.getExtendedTypes().getRegisteredType(val.getClass())
+		ExtendedType extendedType = val != null
+				? adapter.getExtendedTypes().getRegisteredType(val.getClass())
 				: adapter.getExtendedTypes().getDefaultType();
-		ProcedureParameterBinding binding = new ProcedureParameterBinding(param, extendedType);
-		binding.setValue(val);
+
+		ProcedureParameterBinding binding = new ProcedureParameterBinding(param);
 		binding.setStatementPosition(pos);
+		binding.setValue(val);
+		binding.setExtendedType(extendedType);
 		adapter.bindParameter(stmt, binding);
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssembler.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssembler.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssembler.java
index 1128e22..3293168 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssembler.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssembler.java
@@ -19,10 +19,13 @@
 
 package org.apache.cayenne.access.translator.select;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbRelationship;
@@ -31,10 +34,6 @@ import org.apache.cayenne.map.JoinType;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.QueryMetadata;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Abstract superclass of Query translators.
  */
@@ -155,13 +154,15 @@ public abstract class QueryAssembler {
 	 *            DbAttribute being processed.
 	 */
 	public void addToParamList(DbAttribute dbAttr, Object anObject) {
-		String typeName = TypesMapping.SQL_NULL;
-		if (dbAttr != null) typeName = TypesMapping.getJavaBySqlType(dbAttr.getType());
-		ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
-		
-		DbAttributeBinding binding = new DbAttributeBinding(dbAttr, extendedType);
-		binding.setValue(anObject);
+		ExtendedType extendedType = anObject != null
+				? adapter.getExtendedTypes().getRegisteredType(anObject.getClass())
+				: adapter.getExtendedTypes().getDefaultType();
+
+		DbAttributeBinding binding = new DbAttributeBinding(dbAttr);
 		binding.setStatementPosition(bindings.size() + 1);
+		binding.setValue(anObject);
+		binding.setExtendedType(extendedType);
+
 		bindings.add(binding);
 		if(addBindingListener != null) {
 			addBindingListener.onAdd(binding);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index 979b425..b058719 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -19,6 +19,15 @@
 
 package org.apache.cayenne.dba;
 
+import java.net.URL;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.translator.ParameterBinding;
@@ -48,15 +57,6 @@ import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.ResourceLocator;
 import org.apache.cayenne.util.Util;
 
-import java.net.URL;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * A generic DbAdapter implementation. Can be used as a default adapter or as a
  * superclass of a concrete adapter implementation.
@@ -443,7 +443,7 @@ public class JdbcAdapter implements DbAdapter {
 	@Override
 	public String createFkConstraint(DbRelationship rel) {
 
-		DbEntity source = (DbEntity) rel.getSourceEntity();
+		DbEntity source = rel.getSourceEntity();
 		StringBuilder buf = new StringBuilder();
 		StringBuilder refBuf = new StringBuilder();
 
@@ -468,7 +468,7 @@ public class JdbcAdapter implements DbAdapter {
 
 		buf.append(") REFERENCES ");
 
-		buf.append(quotingStrategy.quotedFullyQualifiedName((DbEntity) rel.getTargetEntity()));
+		buf.append(quotingStrategy.quotedFullyQualifiedName(rel.getTargetEntity()));
 
 		buf.append(" (").append(refBuf.toString()).append(')');
 		return buf.toString();
@@ -545,12 +545,15 @@ public class JdbcAdapter implements DbAdapter {
 		if (binding.getValue() == null) {
 			statement.setNull(binding.getStatementPosition(), binding.getType());
 		} else {
-			ExtendedType typeProcessor = getExtendedTypes().getRegisteredType(binding.getValue().getClass());
-			typeProcessor.setJdbcObject(statement
-					, binding.getValue()
-					, binding.getStatementPosition()
-					, binding.getType()
-					, binding.getScale());
+			ExtendedType typeProcessor = binding.getExtendedType() != null
+					? binding.getExtendedType()
+					: getExtendedTypes().getRegisteredType(binding.getValue().getClass());
+
+			typeProcessor.setJdbcObject(statement,
+					binding.getValue(),
+					binding.getStatementPosition(),
+					binding.getType(),
+					binding.getScale());
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
index 8cfdc2c..93fda77 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
@@ -19,23 +19,34 @@
 
 package org.apache.cayenne.dba.oracle;
 
+import java.io.OutputStream;
+import java.io.Writer;
+import java.lang.reflect.Method;
+import java.sql.Blob;
+import java.sql.Clob;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.cayenne.CayenneException;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.OperationObserver;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
+import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.query.*;
+import org.apache.cayenne.query.BatchQuery;
+import org.apache.cayenne.query.BatchQueryRow;
+import org.apache.cayenne.query.InsertBatchQuery;
+import org.apache.cayenne.query.SQLAction;
+import org.apache.cayenne.query.UpdateBatchQuery;
 import org.apache.cayenne.util.Util;
 
-import java.io.OutputStream;
-import java.io.Writer;
-import java.lang.reflect.Method;
-import java.sql.*;
-import java.util.Collections;
-import java.util.List;
-
 /**
  * @since 3.0
  */
@@ -49,8 +60,7 @@ class Oracle8LOBBatchAction implements SQLAction {
 			throws SQLException, Exception {
 
 		for (DbAttributeBinding b : bindings) {
-			DbAttributeBinding binding = new DbAttributeBinding(b.getAttribute(), adapter.getExtendedTypes()
-					.getRegisteredType(b.getValue().getClass()));
+			DbAttributeBinding binding = new DbAttributeBinding(b.getAttribute());
 			adapter.bindParameter(statement, binding);
 		}
 	}
@@ -95,7 +105,7 @@ class Oracle8LOBBatchAction implements SQLAction {
 			// 1. run row update
 			logger.logQuery(updateStr, Collections.EMPTY_LIST);
 
-			try (PreparedStatement statement = connection.prepareStatement(updateStr);) {
+			try (PreparedStatement statement = connection.prepareStatement(updateStr)) {
 
 				DbAttributeBinding[] bindings = translator.updateBindings(row);
 				logger.logQueryParameters("bind", bindings);
@@ -136,19 +146,22 @@ class Oracle8LOBBatchAction implements SQLAction {
 			logger.logQueryParameters("write LOB", null, lobValues, false);
 		}
 
-		try (PreparedStatement selectStatement = con.prepareStatement(selectStr);) {
+		try (PreparedStatement selectStatement = con.prepareStatement(selectStr)) {
 			for (int i = 0; i < parametersSize; i++) {
-				Object value = qualifierValues.get(i);
 				DbAttribute attribute = qualifierAttributes.get(i);
+				Object value = qualifierValues.get(i);
+				ExtendedType extendedType = value != null
+						? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+						: adapter.getExtendedTypes().getDefaultType();
 
-				DbAttributeBinding binding = new DbAttributeBinding(attribute, adapter.getExtendedTypes()
-						.getRegisteredType(value.getClass()));
+				DbAttributeBinding binding = new DbAttributeBinding(attribute);
 				binding.setStatementPosition(i + 1);
 				binding.setValue(value);
-				adapter.bindParameter(selectStatement,binding);
+				binding.setExtendedType(extendedType);
+				adapter.bindParameter(selectStatement, binding);
 			}
 
-			try (ResultSet result = selectStatement.executeQuery();) {
+			try (ResultSet result = selectStatement.executeQuery()) {
 				if (!result.next()) {
 					throw new CayenneRuntimeException("Missing LOB row.");
 				}
@@ -200,7 +213,7 @@ class Oracle8LOBBatchAction implements SQLAction {
 		Method getBinaryStreamMethod = Oracle8Adapter.getOutputStreamFromBlobMethod();
 		try {
 
-			try (OutputStream out = (OutputStream) getBinaryStreamMethod.invoke(blob, (Object[]) null);) {
+			try (OutputStream out = (OutputStream) getBinaryStreamMethod.invoke(blob, (Object[]) null)) {
 				out.write(value);
 				out.flush();
 			}
@@ -217,7 +230,7 @@ class Oracle8LOBBatchAction implements SQLAction {
 		Method getWriterMethod = Oracle8Adapter.getWriterFromClobMethod();
 		try {
 
-			try (Writer out = (Writer) getWriterMethod.invoke(clob, (Object[]) null);) {
+			try (Writer out = (Writer) getWriterMethod.invoke(clob, (Object[]) null)) {
 				out.write(value);
 				out.flush();
 			}
@@ -235,7 +248,7 @@ class Oracle8LOBBatchAction implements SQLAction {
 		Method getWriterMethod = Oracle8Adapter.getWriterFromClobMethod();
 		try {
 
-			try (Writer out = (Writer) getWriterMethod.invoke(clob, (Object[]) null);) {
+			try (Writer out = (Writer) getWriterMethod.invoke(clob, (Object[]) null)) {
 				out.write(value);
 				out.flush();
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b99c2b4b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
index d25d32f..4900ec0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
@@ -19,6 +19,10 @@
 
 package org.apache.cayenne.dba.oracle;
 
+import java.sql.Types;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.access.translator.batch.DefaultBatchTranslator;
@@ -30,10 +34,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.BatchQueryRow;
 
-import java.sql.Types;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * Superclass of query builders for the DML operations involving LOBs.
  * 
@@ -76,7 +76,7 @@ abstract class Oracle8LOBBatchTranslator extends DefaultBatchTranslator {
 
         it = qualifierAttributes.iterator();
         while (it.hasNext()) {
-            DbAttribute attribute = (DbAttribute) it.next();
+            DbAttribute attribute = it.next();
             appendDbAttribute(buf, attribute);
             buf.append(" = ?");
             if (it.hasNext()) {
@@ -118,11 +118,7 @@ abstract class Oracle8LOBBatchTranslator extends DefaultBatchTranslator {
         DbAttributeBinding[] bindings = new DbAttributeBinding[len];
 
         for (int i = 0; i < len; i++) {
-            DbAttribute attribute = dbAttributes.get(i);
-
-            String typeName = TypesMapping.getJavaBySqlType(attribute.getType());
-            ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
-            bindings[i] = new DbAttributeBinding(attribute, extendedType);
+            bindings[i] = new DbAttributeBinding(dbAttributes.get(i));
         }
 
         return bindings;
@@ -144,7 +140,11 @@ abstract class Oracle8LOBBatchTranslator extends DefaultBatchTranslator {
             // TODO: (Andrus) This works as long as there is no LOBs in
             // qualifier
             if (isUpdateableColumn(value, type)) {
-                b.include(j++, value);
+                ExtendedType extendedType = value != null
+                        ? adapter.getExtendedTypes().getRegisteredType(value.getClass())
+                        : adapter.getExtendedTypes().getDefaultType();
+
+                b.include(j++, value, extendedType);
             } else {
                 b.exclude();
             }


[2/7] cayenne git commit: CAY-2050 | Generics for ExtendedType | Improving CommonsJdbcEventLogger parameter logging

Posted by aa...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
index 9f2581f..8b877a0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimestampType.java
@@ -26,7 +26,7 @@ import java.sql.Timestamp;
 /**
  * @since 3.0
  */
-public class TimestampType implements ExtendedType {
+public class TimestampType implements ExtendedType<Timestamp> {
 
     @Override
     public String getClassName() {
@@ -47,7 +47,7 @@ public class TimestampType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Timestamp value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -56,8 +56,16 @@ public class TimestampType implements ExtendedType {
             statement.setNull(pos, type);
         }
         else {
-            statement.setTimestamp(pos, (Timestamp) value);
+            statement.setTimestamp(pos, value);
         }
     }
 
+    @Override
+    public String toString(Timestamp 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/UUIDType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
index 9e488c3..8ff5eae 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UUIDType.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.CayenneRuntimeException;
  * 
  * @since 3.0
  */
-public class UUIDType implements ExtendedType {
+public class UUIDType implements ExtendedType<UUID> {
 
     @Override
     public String getClassName() {
@@ -38,7 +38,7 @@ public class UUIDType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+    public UUID materializeObject(ResultSet rs, int index, int type) throws Exception {
         String uuid = rs.getString(index);
         if (uuid == null) {
             return null;
@@ -53,7 +53,7 @@ public class UUIDType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public UUID materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
 
         String uuid = rs.getString(index);
@@ -72,21 +72,24 @@ public class UUIDType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            UUID value,
             int pos,
             int type,
             int scale) throws Exception {
 
         if (value == null) {
             statement.setNull(pos, type);
-        }
-        else if (value instanceof UUID) {
+        } else {
             statement.setObject(pos, value.toString(), type);
         }
-        else {
-            throw new IllegalArgumentException("Expected java.util.UUID, got "
-                    + value.getClass().getName());
-        }
     }
 
+    @Override
+    public String toString(UUID 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/UtilDateType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
index febfe5d..dafd472 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/UtilDateType.java
@@ -31,7 +31,7 @@ import org.apache.cayenne.dba.TypesMapping;
  * Maps <code>java.util.Date</code> to any of the three database date/time types: TIME,
  * DATE, TIMESTAMP.
  */
-public class UtilDateType implements ExtendedType {
+public class UtilDateType implements ExtendedType<Date> {
 
     /**
      * Returns "java.util.Date".
@@ -41,13 +41,13 @@ public class UtilDateType implements ExtendedType {
         return Date.class.getName();
     }
 
-    protected Object convertToJdbcObject(Object val, int type) throws Exception {
+    protected Object convertToJdbcObject(Date val, int type) throws Exception {
         if (type == Types.DATE)
-            return new java.sql.Date(((Date) val).getTime());
+            return new java.sql.Date(val.getTime());
         else if (type == Types.TIME)
-            return new java.sql.Time(((Date) val).getTime());
+            return new java.sql.Time(val.getTime());
         else if (type == Types.TIMESTAMP)
-            return new java.sql.Timestamp(((Date) val).getTime());
+            return new java.sql.Timestamp(val.getTime());
         else
             throw new IllegalArgumentException(
                     "Only DATE, TIME or TIMESTAMP can be mapped as '"
@@ -106,7 +106,7 @@ public class UtilDateType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Date value,
             int pos,
             int type,
             int scale) throws Exception {
@@ -118,4 +118,14 @@ public class UtilDateType implements ExtendedType {
             statement.setObject(pos, convertToJdbcObject(value, type), type);
         }
     }
+
+    @Override
+    public String toString(Date value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        long time = value.getTime();
+        return "\'" + new java.sql.Timestamp(time) + "\'";
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
index 561187c..52ff9fb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/VoidType.java
@@ -29,7 +29,7 @@ import java.sql.ResultSet;
  * 
  * @since 1.2
  */
-public class VoidType implements ExtendedType {
+public class VoidType implements ExtendedType<Void> {
 
     @Override
     public String getClassName() {
@@ -39,7 +39,7 @@ public class VoidType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Void value,
             int pos,
             int type,
             int precision) throws Exception {
@@ -47,13 +47,22 @@ public class VoidType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+    public Void materializeObject(ResultSet rs, int index, int type) throws Exception {
         return null;
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Void materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return null;
     }
+
+    @Override
+    public String toString(Void value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
index 6ad3f5a..6e9245a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
@@ -19,6 +19,10 @@
 
 package org.apache.cayenne.dba.db2;
 
+import java.sql.PreparedStatement;
+import java.sql.Types;
+import java.util.List;
+
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.translator.ParameterBinding;
@@ -42,10 +46,6 @@ import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.resource.ResourceLocator;
 
-import java.sql.PreparedStatement;
-import java.sql.Types;
-import java.util.List;
-
 /**
  * DbAdapter implementation for the <a href="http://www.ibm.com/db2/"> DB2 RDBMS </a>.
  * Sample connection settings to use with DB2 are shown below:
@@ -203,9 +203,9 @@ public class DB2Adapter extends JdbcAdapter {
 
     final class DB2BooleanType extends BooleanType {
         @Override
-        public void setJdbcObject(PreparedStatement st, Object val, int pos, int type, int precision) throws Exception {
+        public void setJdbcObject(PreparedStatement st, Boolean val, int pos, int type, int precision) throws Exception {
             if (val != null) {
-                st.setInt(pos, ((Boolean) val) ? 1 : 0);
+                st.setInt(pos, val ? 1 : 0);
             } else {
                 st.setNull(pos, type);
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseBooleanType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseBooleanType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseBooleanType.java
index fb7d29f..a617453 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseBooleanType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseBooleanType.java
@@ -35,7 +35,7 @@ class FrontBaseBooleanType extends BooleanType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            Boolean val,
             int pos,
             int type,
             int precision) throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseByteArrayType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseByteArrayType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseByteArrayType.java
index 981ed6b..db3ce13 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseByteArrayType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseByteArrayType.java
@@ -36,7 +36,7 @@ class FrontBaseByteArrayType extends ByteArrayType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            byte[] val,
             int pos,
             int type,
             int precision) throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseCharType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseCharType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseCharType.java
index b4ad09b..8a70ac8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseCharType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseCharType.java
@@ -42,13 +42,13 @@ class FrontBaseCharType extends CharType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            String val,
             int pos,
             int type,
             int precision) throws Exception {
 
         if (type == Types.CLOB) {
-            st.setClob(pos, writeClob((String) val));
+            st.setClob(pos, writeClob(val));
         }
         else {
             super.setJdbcObject(st, val, pos, type, precision);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresBooleanType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresBooleanType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresBooleanType.java
index 4b4c88f..15f2ebd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresBooleanType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresBooleanType.java
@@ -28,13 +28,13 @@ public class IngresBooleanType extends BooleanType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            Boolean val,
             int pos,
             int type,
             int precision) throws Exception {
 
         if (val != null) {
-            st.setInt(pos, ((Boolean) val).booleanValue() ? 1 : 0);
+            st.setInt(pos, val.booleanValue() ? 1 : 0);
         } else {
             st.setNull(pos, type);
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresCharType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresCharType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresCharType.java
index 53ea69b..2635d77 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresCharType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresCharType.java
@@ -36,13 +36,13 @@ class IngresCharType extends CharType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            String val,
             int pos,
             int type,
             int precision) throws Exception {
 
         if (val != null && type == Types.CHAR) {
-            st.setString(pos, val.toString());
+            st.setString(pos, val);
         }
         else {
             super.setJdbcObject(st, val, pos, type, precision);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
index a426332..2f244f1 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
@@ -19,6 +19,13 @@
 
 package org.apache.cayenne.dba.openbase;
 
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Types;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.translator.select.QualifierTranslator;
 import org.apache.cayenne.access.translator.select.QueryAssembler;
@@ -42,13 +49,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.resource.ResourceLocator;
 
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.Types;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * DbAdapter implementation for <a href="http://www.openbase.com">OpenBase</a>.
  * Sample connection settings to use with OpenBase are shown below:
@@ -259,19 +259,19 @@ public class OpenBaseAdapter extends JdbcAdapter {
         }
 
         @Override
-        public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+        public Byte materializeObject(ResultSet rs, int index, int type) throws Exception {
 
             // read value as int, and then narrow it down
             int val = rs.getInt(index);
-            return (rs.wasNull()) ? null : Byte.valueOf((byte) val);
+            return (rs.wasNull()) ? null : (byte) val;
         }
 
         @Override
-        public Object materializeObject(CallableStatement rs, int index, int type) throws Exception {
+        public Byte materializeObject(CallableStatement rs, int index, int type) throws Exception {
 
             // read value as int, and then narrow it down
             int val = rs.getInt(index);
-            return (rs.wasNull()) ? null : Byte.valueOf((byte) val);
+            return (rs.wasNull()) ? null : (byte) val;
         }
     }
 
@@ -282,12 +282,12 @@ public class OpenBaseAdapter extends JdbcAdapter {
         }
 
         @Override
-        public void setJdbcObject(PreparedStatement st, Object val, int pos, int type, int precision) throws Exception {
+        public void setJdbcObject(PreparedStatement st, String val, int pos, int type, int precision) throws Exception {
 
             // These to types map to "text"; and when setting "text" as object
             // OB assumes that the object is the actual CLOB... weird
             if (type == Types.CLOB || type == Types.LONGVARCHAR) {
-                st.setString(pos, (String) val);
+                st.setString(pos, val);
             } else {
                 super.setJdbcObject(st, val, pos, type, precision);
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
index 668676f..c0ac4f0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
@@ -19,6 +19,16 @@
 
 package org.apache.cayenne.dba.oracle;
 
+import java.lang.reflect.Field;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.translator.ParameterBinding;
@@ -47,24 +57,14 @@ import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.UpdateBatchQuery;
 import org.apache.cayenne.resource.ResourceLocator;
 
-import java.lang.reflect.Field;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
 /**
  * DbAdapter implementation for <a href="http://www.oracle.com">Oracle RDBMS
  * </a>. Sample connection settings to use with Oracle are shown below:
- * 
+ *
  * <pre>
  *          test-oracle.jdbc.username = test
  *          test-oracle.jdbc.password = secret
- *          test-oracle.jdbc.url = jdbc:oracle:thin:@//192.168.0.20:1521/ora1 
+ *          test-oracle.jdbc.url = jdbc:oracle:thin:@//192.168.0.20:1521/ora1
  *          test-oracle.jdbc.driver = oracle.jdbc.driver.OracleDriver
  * </pre>
  */
@@ -116,7 +116,7 @@ public class OracleAdapter extends JdbcAdapter {
 	/**
 	 * Utility method that returns <code>true</code> if the query will update at
 	 * least one BLOB or CLOB DbAttribute.
-	 * 
+	 *
 	 * @since 1.2
 	 */
 	static boolean updatesLOBColumns(BatchQuery query) {
@@ -220,7 +220,7 @@ public class OracleAdapter extends JdbcAdapter {
 	 * Returns a query string to drop a table corresponding to <code>ent</code>
 	 * DbEntity. Changes superclass behavior to drop all related foreign key
 	 * constraints.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	@Override
@@ -290,7 +290,7 @@ public class OracleAdapter extends JdbcAdapter {
 
 	/**
 	 * Uses OracleActionBuilder to create the right action.
-	 * 
+	 *
 	 * @since 1.2
 	 */
 	@Override
@@ -301,7 +301,7 @@ public class OracleAdapter extends JdbcAdapter {
 	/**
 	 * @since 3.0
 	 */
-	final class OracleBooleanType implements ExtendedType {
+	final class OracleBooleanType implements ExtendedType<Boolean> {
 
 		@Override
 		public String getClassName() {
@@ -309,7 +309,7 @@ public class OracleAdapter extends JdbcAdapter {
 		}
 
 		@Override
-		public void setJdbcObject(PreparedStatement st, Object val, int pos, int type, int precision) throws Exception {
+		public void setJdbcObject(PreparedStatement st, Boolean val, int pos, int type, int precision) throws Exception {
 
 			// Oracle does not support Types.BOOLEAN, so we have to override
 			// user mapping
@@ -323,7 +323,7 @@ public class OracleAdapter extends JdbcAdapter {
 		}
 
 		@Override
-		public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+		public Boolean materializeObject(ResultSet rs, int index, int type) throws Exception {
 
 			// Oracle does not support Types.BOOLEAN, so we have to override
 			// user mapping
@@ -333,7 +333,7 @@ public class OracleAdapter extends JdbcAdapter {
 		}
 
 		@Override
-		public Object materializeObject(CallableStatement st, int index, int type) throws Exception {
+		public Boolean materializeObject(CallableStatement st, int index, int type) throws Exception {
 
 			// Oracle does not support Types.BOOLEAN, so we have to override
 			// user mapping
@@ -341,5 +341,15 @@ public class OracleAdapter extends JdbcAdapter {
 			int i = st.getInt(index);
 			return st.wasNull() ? null : i == 0 ? Boolean.FALSE : Boolean.TRUE;
 		}
+
+		@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/dba/oracle/OracleByteArrayType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java
index 74e4662..752cce0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java
@@ -34,7 +34,7 @@ public class OracleByteArrayType extends ByteArrayType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            byte[] val,
             int pos,
             int type,
             int scale) throws Exception {
@@ -42,11 +42,11 @@ public class OracleByteArrayType extends ByteArrayType {
             if (isUsingBlobs()) {
                 
                 Blob blob = st.getConnection().createBlob();
-                blob.setBytes(1,  (byte[]) val);
+                blob.setBytes(1, val);
                 st.setBlob(pos, blob);
                 
             } else {
-                st.setBytes(pos, (byte[]) val);
+                st.setBytes(pos, val);
             }
         }
         else {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java
index 179e244..55beef1 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java
@@ -41,7 +41,7 @@ public class OracleCharType extends CharType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            String val,
             int pos,
             int type,
             int precision) throws Exception {
@@ -50,11 +50,11 @@ public class OracleCharType extends CharType {
             if (isUsingClobs()) {
 
                 Clob clob = st.getConnection().createClob();
-                clob.setString(1, (String) val);
+                clob.setString(1, val);
                 st.setClob(pos, clob);
                 
             } else {
-                st.setString(pos, (String) val);
+                st.setString(pos, val);
             }
         }
         else {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresByteArrayType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresByteArrayType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresByteArrayType.java
index 0c2388b..4af5fd3 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresByteArrayType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresByteArrayType.java
@@ -40,7 +40,7 @@ class PostgresByteArrayType extends ByteArrayType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            byte[] val,
             int pos,
             int type,
             int precision) throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
index 44d6562..e834bbc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteBigDecimalType.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.access.types.ExtendedType;
 /**
  * @since 3.0
  */
-class SQLiteBigDecimalType implements ExtendedType {
+class SQLiteBigDecimalType implements ExtendedType<BigDecimal> {
 
     @Override
     public String getClassName() {
@@ -36,7 +36,7 @@ class SQLiteBigDecimalType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public BigDecimal materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         // BigDecimals are not supported by the zentus driver... in addition the driver
         // throws an NPE on 'getDouble' if the value is null, and also there are rounding
@@ -46,7 +46,7 @@ class SQLiteBigDecimalType 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 {
         // BigDecimals are not supported by the zentus driver... in addition the driver
         // throws an NPE on 'getDouble' if the value is null, and also there are rounding
         // errors. So will read it as a String...
@@ -57,7 +57,7 @@ class SQLiteBigDecimalType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            BigDecimal val,
             int pos,
             int type,
             int scale) throws Exception {
@@ -69,4 +69,13 @@ class SQLiteBigDecimalType implements ExtendedType {
             st.setObject(pos, val, type);
         }
     }
+
+    @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/dba/sqlite/SQLiteByteArrayType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
index 9267d9c..11526e0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java
@@ -23,11 +23,12 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
 import org.apache.cayenne.access.types.ExtendedType;
+import org.apache.cayenne.util.IDUtil;
 
 /**
  * @since 3.0
  */
-class SQLiteByteArrayType implements ExtendedType {
+class SQLiteByteArrayType implements ExtendedType<byte[]> {
 
     @Override
     public String getClassName() {
@@ -37,13 +38,13 @@ class SQLiteByteArrayType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            byte[] val,
             int pos,
             int type,
             int scale) throws Exception {
 
-        if (val instanceof byte[]) {
-            st.setBytes(pos, (byte[]) val);
+        if (val != null) {
+            st.setBytes(pos, val);
         }
         else {
             if (scale != -1) {
@@ -56,13 +57,24 @@ class SQLiteByteArrayType 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 {
         return rs.getBytes(index);
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public byte[] materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return rs.getBytes(index);
     }
+
+    @Override
+    public String toString(byte[] value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        StringBuilder buffer = new StringBuilder();
+        IDUtil.appendFormattedBytes(buffer, value);
+        return buffer.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
index 2fa21e7..e099b2b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteCalendarType.java
@@ -31,13 +31,13 @@ import org.apache.cayenne.access.types.ExtendedType;
 /**
  * @since 3.0
  */
-class SQLiteCalendarType implements ExtendedType {
+class SQLiteCalendarType<T extends Calendar> implements ExtendedType<Calendar> {
 
-    protected ExtendedType delegateCalendarType;
-    protected ExtendedType delegateDateType;
+    protected ExtendedType<Calendar> delegateCalendarType;
+    protected ExtendedType<Date> delegateDateType;
 
-    public <T extends Calendar> SQLiteCalendarType(Class<T> calendarClass) {
-        this.delegateCalendarType = new CalendarType<T>(calendarClass);
+    public SQLiteCalendarType(Class<T> calendarClass) {
+        this.delegateCalendarType = new CalendarType<>(calendarClass);
         this.delegateDateType = new SQLiteDateType();
     }
 
@@ -47,10 +47,10 @@ class SQLiteCalendarType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Calendar materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
 
-        Date date = (Date) delegateDateType.materializeObject(rs, index, type);
+        Date date = delegateDateType.materializeObject(rs, index, type);
         if (date == null) {
             return null;
         }
@@ -61,8 +61,8 @@ class SQLiteCalendarType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
-        Date date = (Date) delegateDateType.materializeObject(rs, index, type);
+    public Calendar materializeObject(ResultSet rs, int index, int type) throws Exception {
+        Date date = delegateDateType.materializeObject(rs, index, type);
         if (date == null) {
             return null;
         }
@@ -75,11 +75,19 @@ class SQLiteCalendarType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            Calendar value,
             int pos,
             int type,
             int precision) throws Exception {
         delegateCalendarType.setJdbcObject(statement, value, pos, type, precision);
     }
 
+    @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/dba/sqlite/SQLiteFloatType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
index d8db44b..c80961a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteFloatType.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.access.types.ExtendedType;
 /**
  * @since 3.0
  */
-class SQLiteFloatType implements ExtendedType {
+class SQLiteFloatType implements ExtendedType<Float> {
 
     @Override
     public String getClassName() {
@@ -35,26 +35,26 @@ class SQLiteFloatType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public Float materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         // the driver throws an NPE on 'getFloat' if the value is null, so must read it as
         // an object.
         Number n = (Number) rs.getObject(index);
-        return n == null ? null : new Float(n.floatValue());
+        return n == null ? null : n.floatValue();
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+    public Float materializeObject(ResultSet rs, int index, int type) throws Exception {
         // the driver throws an NPE on 'getFloat' if the value is null, so must read it as
         // an object.
         Number n = (Number) rs.getObject(index);
-        return n == null ? null : new Float(n.floatValue());
+        return n == null ? null : n.floatValue();
     }
     
     @Override
     public void setJdbcObject(
             PreparedStatement st,
-            Object val,
+            Float val,
             int pos,
             int type,
             int scale) throws Exception {
@@ -66,4 +66,13 @@ class SQLiteFloatType implements ExtendedType {
             st.setObject(pos, val, type);
         }
     }
+
+    @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/log/CommonsJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
index f9351bf..c10daad 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
@@ -46,7 +46,7 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 
 	private static final Log logger = LogFactory.getLog(CommonsJdbcEventLogger.class);
 
-	private static final int TRIM_VALUES_THRESHOLD = 30;
+	public static final int TRIM_VALUES_THRESHOLD = 30;
 
 	protected long queryExecutionTimeLoggingThreshold;
 
@@ -263,7 +263,7 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 				while (attributeIterator != null && attributeIterator.hasNext()) {
 					attribute = attributeIterator.next();
 
-					if (isInserting == false || attribute.isGenerated() == false)
+					if (!isInserting || !attribute.isGenerated())
 						break;
 				}
 
@@ -288,10 +288,7 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 
 		char firstCharacter = query.charAt(0);
 
-		if (firstCharacter == 'I' || firstCharacter == 'i')
-			return true;
-		else
-			return false;
+		return firstCharacter == 'I' || firstCharacter == 'i';
 	}
 
 	@Override
@@ -379,7 +376,7 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 				}
 
 				buffer.append(":");
-				sqlLiteralForObject(buffer, b.getValue());
+				buffer.append(b.getExtendedType().toString(b.getValue()));
 			}
 
 			if (hasIncluded) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java b/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
index 0ed247e..6f4df35 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/IDUtil.java
@@ -26,9 +26,11 @@ import java.security.NoSuchAlgorithmException;
 
 import org.apache.cayenne.CayenneRuntimeException;
 
+import static org.apache.cayenne.log.CommonsJdbcEventLogger.TRIM_VALUES_THRESHOLD;
+
 /**
  * helper class to generate pseudo-GUID sequences.
- * 
+ *
  */
 public class IDUtil {
 
@@ -69,7 +71,7 @@ public class IDUtil {
 
     /**
      * Prints a byte value to a StringBuffer as a double digit hex value.
-     * 
+     *
      * @since 1.2 Since 3.0 signature has changed to take Appendable argument.
      */
     public static void appendFormattedByte(Appendable buffer, byte byteValue) {
@@ -84,6 +86,34 @@ public class IDUtil {
         }
     }
 
+    public static void appendFormattedBytes(Appendable buffer, byte[] bytes) {
+        try {
+            buffer.append("< ");
+
+            int len = bytes.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(",");
+                }
+                appendFormattedByte(buffer, bytes[i]);
+            }
+
+            if (trimming) {
+                buffer.append("...");
+            }
+
+            buffer.append('>');
+        } catch (IOException e) {
+            throw new CayenneRuntimeException("Error appending data to buffer", e);
+        }
+    }
+
     /**
      * @param length the length of returned byte[]
      * @return A pseudo-unique byte array of the specified length. Length must be at least

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java b/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
index c36f6c5..0f7a2af 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/types/MockExtendedType.java
@@ -23,7 +23,7 @@ import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-public class MockExtendedType implements ExtendedType {
+public class MockExtendedType implements ExtendedType<Object> {
 
     protected Class<?> objectClass;
 
@@ -59,4 +59,13 @@ public class MockExtendedType implements ExtendedType {
             throws Exception {
         return objectClass.newInstance();
     }
+
+    @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/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
index 69cfd39..826c5ea 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/extended_type/StringET1ExtendedType.java
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.testdo.extended_type;
 
-import org.apache.cayenne.access.types.ExtendedType;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
-public class StringET1ExtendedType implements ExtendedType {
+import org.apache.cayenne.access.types.ExtendedType;
+
+public class StringET1ExtendedType implements ExtendedType<StringET1> {
 
     @Override
     public String getClassName() {
@@ -32,13 +32,13 @@ public class StringET1ExtendedType implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+    public StringET1 materializeObject(ResultSet rs, int index, int type) throws Exception {
         String string = rs.getString(index);
         return string != null ? new StringET1(string) : null;
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public StringET1 materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         String string = rs.getString(index);
         return string != null ? new StringET1(string) : null;
@@ -47,16 +47,25 @@ public class StringET1ExtendedType implements ExtendedType {
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            StringET1 value,
             int pos,
             int type,
             int precision) throws Exception {
 
-        if (value instanceof StringET1) {
-            statement.setString(pos, ((StringET1) value).getString());
+        if (value != null) {
+            statement.setString(pos, value.getString());
         }
         else {
             statement.setNull(pos, type);
         }
     }
+
+    @Override
+    public String toString(StringET1 value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
index 4f010e2..7c70441 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType1.java
@@ -25,7 +25,7 @@ import java.sql.ResultSet;
 
 import org.apache.cayenne.access.types.ExtendedType;
 
-public class CAY_207StringType1 implements ExtendedType {
+public class CAY_207StringType1 implements ExtendedType<CAY_207String1> {
 
     @Override
     public String getClassName() {
@@ -33,34 +33,38 @@ public class CAY_207StringType1 implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public CAY_207String1 materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return new CAY_207String1(rs.getString(index));
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+    public CAY_207String1 materializeObject(ResultSet rs, int index, int type) throws Exception {
         return new CAY_207String1(rs.getString(index));
     }
 
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            CAY_207String1 value,
             int pos,
             int type,
             int scale) throws Exception {
 
-        if (value instanceof CAY_207String1) {
-            value = ((CAY_207String1) value).string;
-        }
-
         if (scale != -1) {
-            statement.setObject(pos, value, type, scale);
+            statement.setObject(pos, value.string, type, scale);
         }
         else {
-            statement.setObject(pos, value, type);
+            statement.setObject(pos, value.string, type);
         }
     }
 
+    @Override
+    public String toString(CAY_207String1 value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
index 2282847..8483651 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_207StringType2.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.access.types.ExtendedType;
 
 /**
  */
-public class CAY_207StringType2 implements ExtendedType {
+public class CAY_207StringType2 implements ExtendedType<CAY_207String2> {
 
     @Override
     public String getClassName() {
@@ -35,34 +35,38 @@ public class CAY_207StringType2 implements ExtendedType {
     }
 
     @Override
-    public Object materializeObject(CallableStatement rs, int index, int type)
+    public CAY_207String2 materializeObject(CallableStatement rs, int index, int type)
             throws Exception {
         return new CAY_207String2(rs.getString(index));
     }
 
     @Override
-    public Object materializeObject(ResultSet rs, int index, int type) throws Exception {
+    public CAY_207String2 materializeObject(ResultSet rs, int index, int type) throws Exception {
         return new CAY_207String2(rs.getString(index));
     }
 
     @Override
     public void setJdbcObject(
             PreparedStatement statement,
-            Object value,
+            CAY_207String2 value,
             int pos,
             int type,
             int scale) throws Exception {
 
-        if (value instanceof CAY_207String2) {
-            value = ((CAY_207String2) value).string;
-        }
-
         if (scale != -1) {
-            statement.setObject(pos, value, type, scale);
+            statement.setObject(pos, value.string, type, scale);
         }
         else {
-            statement.setObject(pos, value, type);
+            statement.setObject(pos, value.string, type);
         }
     }
 
+    @Override
+    public String toString(CAY_207String2 value) {
+        if (value == null) {
+            return "\'null\'";
+        }
+
+        return value.toString();
+    }
 }


[6/7] cayenne git commit: CAY-2050 Refactoring: ParameterBinding to contain ExtendedType property

Posted by aa...@apache.org.
CAY-2050 Refactoring: ParameterBinding to contain ExtendedType property

* explicit extended types in cayenne-crypto
* assuming ParameterBinding always has an ET


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

Branch: refs/heads/master
Commit: 0161822270ba51844073fdb292330af6ed742256
Parents: e6585ef
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Tue Jan 24 15:08:03 2017 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Jan 24 15:08:03 2017 +0300

----------------------------------------------------------------------
 .../CryptoBatchTranslatorFactoryDecorator.java  |  4 ++--
 .../transformer/DefaultBindingsTransformer.java | 16 +++++++++++--
 .../transformer/DefaultTransformerFactory.java  |  5 ++--
 .../crypto/transformer/TransformerFactory.java  |  3 ++-
 .../org/apache/cayenne/dba/JdbcAdapter.java     | 24 ++++++++------------
 5 files changed, 31 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/01618222/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
index 4b8a471..5d3d319 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
@@ -44,7 +44,7 @@ public class CryptoBatchTranslatorFactoryDecorator implements BatchTranslatorFac
     }
 
     @Override
-    public BatchTranslator translator(BatchQuery query, DbAdapter adapter, String trimFunction) {
+    public BatchTranslator translator(BatchQuery query, final DbAdapter adapter, String trimFunction) {
         final BatchTranslator delegateTranslator = delegate.translator(query, adapter, trimFunction);
 
         return new BatchTranslator() {
@@ -54,7 +54,7 @@ public class CryptoBatchTranslatorFactoryDecorator implements BatchTranslatorFac
 
             private void ensureEncryptorCompiled() {
                 if (!encryptorCompiled) {
-                    encryptor = cryptoFactory.encryptor(getBindings());
+                    encryptor = cryptoFactory.encryptor(getBindings(), adapter.getExtendedTypes());
                     encryptorCompiled = true;
                 }
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/01618222/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
index 4844795..3524b41 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
@@ -19,6 +19,8 @@
 package org.apache.cayenne.crypto.transformer;
 
 import org.apache.cayenne.access.translator.DbAttributeBinding;
+import org.apache.cayenne.access.types.ExtendedType;
+import org.apache.cayenne.access.types.ExtendedTypeMap;
 import org.apache.cayenne.crypto.transformer.bytes.BytesEncryptor;
 import org.apache.cayenne.crypto.transformer.value.ValueEncryptor;
 
@@ -30,11 +32,16 @@ public class DefaultBindingsTransformer implements BindingsTransformer {
     private int[] positions;
     private ValueEncryptor[] transformers;
     private BytesEncryptor encryptor;
+    private ExtendedTypeMap extendedTypeMap;
 
-    public DefaultBindingsTransformer(int[] positions, ValueEncryptor[] transformers, BytesEncryptor encryptor) {
+    public DefaultBindingsTransformer(int[] positions,
+                                      ValueEncryptor[] transformers,
+                                      BytesEncryptor encryptor,
+                                      ExtendedTypeMap extendedTypeMap) {
         this.positions = positions;
         this.transformers = transformers;
         this.encryptor = encryptor;
+        this.extendedTypeMap = extendedTypeMap;
     }
 
     @Override
@@ -46,7 +53,12 @@ public class DefaultBindingsTransformer implements BindingsTransformer {
             DbAttributeBinding b = bindings[positions[i]];
             Object transformed = transformers[i].encrypt(encryptor, b.getValue());
             b.setValue(transformed);
-            b.setExtendedType(null); // TODO fast hack
+
+            ExtendedType extendedType = transformed != null
+                    ? extendedTypeMap.getRegisteredType(transformed.getClass())
+                    : extendedTypeMap.getDefaultType();
+
+            b.setExtendedType(extendedType);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/01618222/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
index 9e1cc72..935a2f8 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
@@ -20,6 +20,7 @@ package org.apache.cayenne.crypto.transformer;
 
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
+import org.apache.cayenne.access.types.ExtendedTypeMap;
 import org.apache.cayenne.crypto.map.ColumnMapper;
 import org.apache.cayenne.crypto.transformer.bytes.BytesTransformerFactory;
 import org.apache.cayenne.crypto.transformer.value.ValueDecryptor;
@@ -90,7 +91,7 @@ public class DefaultTransformerFactory implements TransformerFactory {
     }
 
     @Override
-    public BindingsTransformer encryptor(DbAttributeBinding[] bindings) {
+    public BindingsTransformer encryptor(DbAttributeBinding[] bindings, ExtendedTypeMap extendedTypeMap) {
         int len = bindings.length;
         List<Integer> cryptoColumns = null;
 
@@ -120,7 +121,7 @@ public class DefaultTransformerFactory implements TransformerFactory {
                 transformers[i] = transformerFactory.encryptor(b.getAttribute());
             }
 
-            return new DefaultBindingsTransformer(positions, transformers, bytesTransformerFactory.encryptor());
+            return new DefaultBindingsTransformer(positions, transformers, bytesTransformerFactory.encryptor(), extendedTypeMap);
         }
 
         return null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/01618222/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java
index a8893d1..64f1389 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java
@@ -20,6 +20,7 @@ package org.apache.cayenne.crypto.transformer;
 
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
+import org.apache.cayenne.access.types.ExtendedTypeMap;
 
 /**
  * A factory that creates encryption transformers used for processing batch
@@ -29,7 +30,7 @@ import org.apache.cayenne.access.translator.DbAttributeBinding;
  */
 public interface TransformerFactory {
 
-    BindingsTransformer encryptor(DbAttributeBinding[] bindings);
+    BindingsTransformer encryptor(DbAttributeBinding[] bindings, ExtendedTypeMap extendedTypeMap);
 
     MapTransformer decryptor(ColumnDescriptor[] columns, Object sampleRow);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/01618222/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index b058719..74f9035 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -19,15 +19,6 @@
 
 package org.apache.cayenne.dba;
 
-import java.net.URL;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.translator.ParameterBinding;
@@ -57,6 +48,15 @@ import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.ResourceLocator;
 import org.apache.cayenne.util.Util;
 
+import java.net.URL;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
 /**
  * A generic DbAdapter implementation. Can be used as a default adapter or as a
  * superclass of a concrete adapter implementation.
@@ -545,11 +545,7 @@ public class JdbcAdapter implements DbAdapter {
 		if (binding.getValue() == null) {
 			statement.setNull(binding.getStatementPosition(), binding.getType());
 		} else {
-			ExtendedType typeProcessor = binding.getExtendedType() != null
-					? binding.getExtendedType()
-					: getExtendedTypes().getRegisteredType(binding.getValue().getClass());
-
-			typeProcessor.setJdbcObject(statement,
+			binding.getExtendedType().setJdbcObject(statement,
 					binding.getValue(),
 					binding.getStatementPosition(),
 					binding.getType(),


[5/7] cayenne git commit: Merge branch '172'

Posted by aa...@apache.org.
Merge branch '172'


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

Branch: refs/heads/master
Commit: e6585efdaba30565dbe51c7a64ca314b40654783
Parents: ee02106 e9e1e73
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Tue Jan 24 14:37:20 2017 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Jan 24 14:37:20 2017 +0300

----------------------------------------------------------------------
 .../transformer/DefaultBindingsTransformer.java |   1 +
 .../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/jdbc/SQLTemplateAction.java  |  33 ++--
 .../access/translator/DbAttributeBinding.java   |   5 +-
 .../access/translator/ParameterBinding.java     |  11 +-
 .../translator/ProcedureParameterBinding.java   |   5 +-
 .../translator/batch/DeleteBatchTranslator.java |  20 +--
 .../translator/batch/InsertBatchTranslator.java |  18 +-
 .../batch/SoftDeleteBatchTranslator.java        |  11 +-
 .../translator/batch/UpdateBatchTranslator.java |  31 ++--
 .../procedure/ProcedureTranslator.java          |  23 +--
 .../translator/select/QueryAssembler.java       |  23 +--
 .../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/JdbcAdapter.java     |  37 ++--
 .../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 +--
 .../dba/oracle/Oracle8LOBBatchAction.java       |  53 +++---
 .../dba/oracle/Oracle8LOBBatchTranslator.java   |  22 +--
 .../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     |  16 +-
 .../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 +--
 67 files changed, 1136 insertions(+), 637 deletions(-)
----------------------------------------------------------------------



[3/7] cayenne git commit: CAY-2050 | Generics for ExtendedType | Improving CommonsJdbcEventLogger parameter logging

Posted by aa...@apache.org.
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....@gmail.com>
Authored: Wed Dec 28 20:34:53 2016 +0300
Committer: Savva Kolbachev <s....@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() + '\'';
+    }
 }