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:11 UTC

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

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