CAY-2050 | Generics for ExtendedType | Improving CommonsJdbcEventLogger parameter logging
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/efa48e5c Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/efa48e5c Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/efa48e5c Branch: refs/heads/master Commit: efa48e5c26e38768ca6d719221b270ae5ab1757a Parents: da222d2 Author: Savva Kolbachev <s.kolbac...@gmail.com> Authored: Wed Dec 28 20:34:53 2016 +0300 Committer: Savva Kolbachev <s.kolbac...@gmail.com> Committed: Sat Jan 21 18:16:02 2017 +0300 ---------------------------------------------------------------------- .../java8/access/types/LocalDateTimeType.java | 21 ++- .../java8/access/types/LocalDateType.java | 18 +- .../java8/access/types/LocalTimeType.java | 21 ++- .../cayenne/joda/access/types/DateTimeType.java | 78 ++++---- .../joda/access/types/LocalDateTimeType.java | 79 ++++---- .../joda/access/types/LocalDateType.java | 88 ++++----- .../joda/access/types/LocalTimeType.java | 90 +++++----- .../cayenne/access/types/BigDecimalType.java | 18 +- .../cayenne/access/types/BigIntegerType.java | 17 +- .../cayenne/access/types/BooleanType.java | 17 +- .../cayenne/access/types/ByteArrayType.java | 24 ++- .../access/types/ByteOrCharArrayFactory.java | 179 ++++++++++++++----- .../apache/cayenne/access/types/ByteType.java | 31 ++-- .../cayenne/access/types/CalendarType.java | 33 ++-- .../apache/cayenne/access/types/CharType.java | 48 ++++- .../apache/cayenne/access/types/DateType.java | 18 +- .../apache/cayenne/access/types/DoubleType.java | 19 +- .../apache/cayenne/access/types/EnumType.java | 47 +++-- .../cayenne/access/types/ExtendedEnumType.java | 44 +++-- .../cayenne/access/types/ExtendedType.java | 16 +- .../access/types/ExtendedTypeDecorator.java | 25 ++- .../apache/cayenne/access/types/FloatType.java | 18 +- .../cayenne/access/types/IntegerType.java | 18 +- .../apache/cayenne/access/types/LongType.java | 18 +- .../apache/cayenne/access/types/ObjectType.java | 11 +- .../access/types/SerializableTypeFactory.java | 27 +-- .../apache/cayenne/access/types/ShortType.java | 22 ++- .../apache/cayenne/access/types/TimeType.java | 19 +- .../cayenne/access/types/TimestampType.java | 14 +- .../apache/cayenne/access/types/UUIDType.java | 23 +-- .../cayenne/access/types/UtilDateType.java | 22 ++- .../apache/cayenne/access/types/VoidType.java | 17 +- .../org/apache/cayenne/dba/db2/DB2Adapter.java | 12 +- .../dba/frontbase/FrontBaseBooleanType.java | 2 +- .../dba/frontbase/FrontBaseByteArrayType.java | 2 +- .../dba/frontbase/FrontBaseCharType.java | 4 +- .../cayenne/dba/ingres/IngresBooleanType.java | 4 +- .../cayenne/dba/ingres/IngresCharType.java | 4 +- .../cayenne/dba/openbase/OpenBaseAdapter.java | 26 +-- .../cayenne/dba/oracle/OracleAdapter.java | 48 +++-- .../cayenne/dba/oracle/OracleByteArrayType.java | 6 +- .../cayenne/dba/oracle/OracleCharType.java | 6 +- .../dba/postgres/PostgresByteArrayType.java | 2 +- .../dba/sqlite/SQLiteBigDecimalType.java | 17 +- .../cayenne/dba/sqlite/SQLiteByteArrayType.java | 24 ++- .../cayenne/dba/sqlite/SQLiteCalendarType.java | 28 +-- .../cayenne/dba/sqlite/SQLiteFloatType.java | 21 ++- .../cayenne/log/CommonsJdbcEventLogger.java | 11 +- .../java/org/apache/cayenne/util/IDUtil.java | 34 +++- .../cayenne/access/types/MockExtendedType.java | 11 +- .../extended_type/StringET1ExtendedType.java | 25 ++- .../cayenne/unit/jira/CAY_207StringType1.java | 24 +-- .../cayenne/unit/jira/CAY_207StringType2.java | 24 +-- 53 files changed, 970 insertions(+), 505 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java ---------------------------------------------------------------------- diff --git a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java index aa47c22..f47e247 100644 --- a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java +++ b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateTimeType.java @@ -19,15 +19,15 @@ package org.apache.cayenne.java8.access.types; -import org.apache.cayenne.access.types.ExtendedType; - import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; import java.time.LocalDateTime; -public class LocalDateTimeType implements ExtendedType { +import org.apache.cayenne.access.types.ExtendedType; + +public class LocalDateTimeType implements ExtendedType<LocalDateTime> { @Override public String getClassName() { @@ -35,8 +35,8 @@ public class LocalDateTimeType implements ExtendedType { } @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { - statement.setTimestamp(pos, Timestamp.valueOf((LocalDateTime) value)); + public void setJdbcObject(PreparedStatement statement, LocalDateTime value, int pos, int type, int scale) throws Exception { + statement.setTimestamp(pos, Timestamp.valueOf(value)); } @Override @@ -46,8 +46,17 @@ public class LocalDateTimeType implements ExtendedType { } @Override - public Object materializeObject(CallableStatement rs, int index, int type) throws Exception { + public LocalDateTime materializeObject(CallableStatement rs, int index, int type) throws Exception { Timestamp timestamp = rs.getTimestamp(index); return timestamp != null ? timestamp.toLocalDateTime() : null; } + + @Override + public String toString(LocalDateTime value) { + if (value == null) { + return "\'null\'"; + } + + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java ---------------------------------------------------------------------- diff --git a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java index 72cfff7..ee602d5 100644 --- a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java +++ b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalDateType.java @@ -19,15 +19,15 @@ package org.apache.cayenne.java8.access.types; -import org.apache.cayenne.access.types.ExtendedType; - import java.sql.CallableStatement; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.time.LocalDate; -public class LocalDateType implements ExtendedType { +import org.apache.cayenne.access.types.ExtendedType; + +public class LocalDateType implements ExtendedType<LocalDate> { @Override public String getClassName() { @@ -35,8 +35,8 @@ public class LocalDateType implements ExtendedType { } @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { - statement.setDate(pos, Date.valueOf((LocalDate) value)); + public void setJdbcObject(PreparedStatement statement, LocalDate value, int pos, int type, int scale) throws Exception { + statement.setDate(pos, Date.valueOf(value)); } @Override @@ -51,4 +51,12 @@ public class LocalDateType implements ExtendedType { return date != null ? date.toLocalDate() : null; } + @Override + public String toString(LocalDate value) { + if (value == null) { + return "\'null\'"; + } + + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java ---------------------------------------------------------------------- diff --git a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java index 2d109ba..f1a8dea 100644 --- a/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java +++ b/cayenne-java8/src/main/java/org/apache/cayenne/java8/access/types/LocalTimeType.java @@ -19,15 +19,15 @@ package org.apache.cayenne.java8.access.types; -import org.apache.cayenne.access.types.ExtendedType; - import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Time; import java.time.LocalTime; -public class LocalTimeType implements ExtendedType { +import org.apache.cayenne.access.types.ExtendedType; + +public class LocalTimeType implements ExtendedType<LocalTime> { @Override public String getClassName() { @@ -35,8 +35,8 @@ public class LocalTimeType implements ExtendedType { } @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { - statement.setTime(pos, Time.valueOf((LocalTime) value)); + public void setJdbcObject(PreparedStatement statement, LocalTime value, int pos, int type, int scale) throws Exception { + statement.setTime(pos, Time.valueOf(value)); } @Override @@ -46,9 +46,18 @@ public class LocalTimeType implements ExtendedType { } @Override - public Object materializeObject(CallableStatement rs, int index, int type) throws Exception { + public LocalTime materializeObject(CallableStatement rs, int index, int type) throws Exception { Time time = rs.getTime(index); return time != null ? time.toLocalTime() : null; } + @Override + public String toString(LocalTime value) { + if (value == null) { + return "\'null\'"; + } + + return '\'' + value.toString() + '\''; + } + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java ---------------------------------------------------------------------- diff --git a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java index 2af5e91..a042b3d 100644 --- a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java +++ b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/DateTimeType.java @@ -19,57 +19,61 @@ package org.apache.cayenne.joda.access.types; -import org.apache.cayenne.access.types.ExtendedType; -import org.joda.time.DateTime; - import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; +import org.apache.cayenne.access.types.ExtendedType; +import org.joda.time.DateTime; + /** * Handles <code>org.joda.time.DateTime</code> type mapping. - * + * * @since 4.0 */ -public class DateTimeType implements ExtendedType { +public class DateTimeType implements ExtendedType<DateTime> { - @Override - public String getClassName() { - return DateTime.class.getName(); - } + @Override + public String getClassName() { + return DateTime.class.getName(); + } - @Override - public DateTime materializeObject(ResultSet rs, int index, int type) throws Exception { - if (rs.getTimestamp(index) != null) { - return new DateTime(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + @Override + public void setJdbcObject(PreparedStatement statement, DateTime value, int pos, int type, int scale) throws Exception { + if (value == null) { + statement.setNull(pos, type); + } else { + Timestamp ts = new Timestamp(value.getMillis()); + statement.setTimestamp(pos, ts); + } + } - @Override - public DateTime materializeObject(CallableStatement rs, int index, int type) throws Exception { - if (rs.getTimestamp(index) != null) { - return new DateTime(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + @Override + public DateTime materializeObject(ResultSet rs, int index, int type) throws Exception { + if (rs.getTimestamp(index) != null) { + return new DateTime(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { + @Override + public DateTime materializeObject(CallableStatement rs, int index, int type) throws Exception { + if (rs.getTimestamp(index) != null) { + return new DateTime(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - if (value == null) { - statement.setNull(pos, type); - } else { - Timestamp ts = new Timestamp(getMillis(value)); - statement.setTimestamp(pos, ts); - } - } + @Override + public String toString(DateTime value) { + if (value == null) { + return "\'null\'"; + } - protected long getMillis(Object value) { - return ((DateTime) value).getMillis(); - } + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java ---------------------------------------------------------------------- diff --git a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java index ea7fab7..97d3900 100644 --- a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java +++ b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateTimeType.java @@ -19,58 +19,61 @@ package org.apache.cayenne.joda.access.types; -import org.apache.cayenne.access.types.ExtendedType; -import org.joda.time.LocalDateTime; - import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; import java.sql.Types; +import org.apache.cayenne.access.types.ExtendedType; +import org.joda.time.LocalDateTime; + /** * Handles <code>org.joda.time.LocalDateTime</code> type mapping. - * + * * @since 4.0 */ -public class LocalDateTimeType implements ExtendedType { - - @Override - public String getClassName() { - return LocalDateTime.class.getName(); - } +public class LocalDateTimeType implements ExtendedType<LocalDateTime> { - @Override - public LocalDateTime materializeObject(ResultSet rs, int index, int type) throws Exception { - if (rs.getTimestamp(index) != null) { - return new LocalDateTime(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + @Override + public String getClassName() { + return LocalDateTime.class.getName(); + } - @Override - public LocalDateTime materializeObject(CallableStatement rs, int index, int type) throws Exception { - if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { - return new LocalDateTime(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + @Override + public void setJdbcObject(PreparedStatement statement, LocalDateTime value, int pos, int type, int scale) throws Exception { + if (value == null) { + statement.setNull(pos, type); + } else { + Timestamp ts = new Timestamp(value.toDateTime().getMillis()); + statement.setTimestamp(pos, ts); + } + } - @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { + @Override + public LocalDateTime materializeObject(ResultSet rs, int index, int type) throws Exception { + if (rs.getTimestamp(index) != null) { + return new LocalDateTime(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - if (value == null) { - statement.setNull(pos, type); - } else { - Timestamp ts = new Timestamp(getMillis(value)); - statement.setTimestamp(pos, ts); - } - } + @Override + public LocalDateTime materializeObject(CallableStatement rs, int index, int type) throws Exception { + if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { + return new LocalDateTime(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - protected long getMillis(Object value) { - return ((LocalDateTime) value).toDateTime().getMillis(); - } + @Override + public String toString(LocalDateTime value) { + if (value == null) { + return "\'null\'"; + } + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java ---------------------------------------------------------------------- diff --git a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java index 7a0a9a0..19f05b6 100644 --- a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java +++ b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalDateType.java @@ -31,54 +31,60 @@ import org.joda.time.LocalDate; /** * Handles <code>org.joda.time.LocalDate</code> type mapping. - * + * * @since 4.0 */ -public class LocalDateType implements ExtendedType { +public class LocalDateType implements ExtendedType<LocalDate> { + + @Override + public String getClassName() { + return LocalDate.class.getName(); + } - @Override - public String getClassName() { - return LocalDate.class.getName(); - } + @Override + public void setJdbcObject(PreparedStatement statement, LocalDate value, int pos, int type, int scale) throws Exception { + if (value == null) { + statement.setNull(pos, type); + } else { + long time = value.toDate().getTime(); - @Override - public LocalDate materializeObject(ResultSet rs, int index, int type) throws Exception { - if (type == Types.DATE && rs.getDate(index) != null) { - return new LocalDate(rs.getDate(index).getTime()); - } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { - return new LocalDate(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + if (type == Types.DATE) { + statement.setDate(pos, new Date(time)); + } else { + statement.setTimestamp(pos, new Timestamp(time)); + } + } + } - @Override - public LocalDate materializeObject(CallableStatement rs, int index, int type) throws Exception { - if (type == Types.DATE && rs.getDate(index) != null) { - return new LocalDate(rs.getDate(index).getTime()); - } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { - return new LocalDate(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + @Override + public LocalDate materializeObject(ResultSet rs, int index, int type) throws Exception { + if (type == Types.DATE && rs.getDate(index) != null) { + return new LocalDate(rs.getDate(index).getTime()); + } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { + return new LocalDate(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { + @Override + public LocalDate materializeObject(CallableStatement rs, int index, int type) throws Exception { + if (type == Types.DATE && rs.getDate(index) != null) { + return new LocalDate(rs.getDate(index).getTime()); + } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { + return new LocalDate(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - if (value == null) { - statement.setNull(pos, type); - } else { - if (type == Types.DATE) { - statement.setDate(pos, new Date(getMillis(value))); - } else { - statement.setTimestamp(pos, new Timestamp(getMillis(value))); - } - } - } + @Override + public String toString(LocalDate value) { + if (value == null) { + return "\'null\'"; + } - protected long getMillis(Object value) { - return ((LocalDate) value).toDate().getTime(); - } + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java ---------------------------------------------------------------------- diff --git a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java index 765c4ad..501f889 100644 --- a/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java +++ b/cayenne-joda/src/main/java/org/apache/cayenne/joda/access/types/LocalTimeType.java @@ -33,56 +33,62 @@ import org.joda.time.LocalTime; /** * Handles <code>org.joda.time.LocalTime</code> type mapping. - * + * * @since 4.0 */ -public class LocalTimeType implements ExtendedType { +public class LocalTimeType implements ExtendedType<LocalTime> { + + private static final LocalDate EPOCH = new LocalDate(0, DateTimeZone.UTC); - private static final LocalDate EPOCH = new LocalDate(0, DateTimeZone.UTC); + @Override + public String getClassName() { + return LocalTime.class.getName(); + } - @Override - public String getClassName() { - return LocalTime.class.getName(); - } + @Override + public void setJdbcObject(PreparedStatement statement, LocalTime value, int pos, int type, int scale) throws Exception { - @Override - public LocalTime materializeObject(ResultSet rs, int index, int type) throws Exception { - if (type == Types.TIME && rs.getTime(index) != null) { - return new LocalTime(rs.getTime(index).getTime()); - } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { - return new LocalTime(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + if (value == null) { + statement.setNull(pos, type); + } else { + long millis = EPOCH.toDateTime(value).getMillis(); - @Override - public LocalTime materializeObject(CallableStatement rs, int index, int type) throws Exception { - if (type == Types.TIME && rs.getTime(index) != null) { - return new LocalTime(rs.getTime(index).getTime()); - } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { - return new LocalTime(rs.getTimestamp(index).getTime()); - } else { - return null; - } - } + if (type == Types.TIME) { + statement.setTime(pos, new Time(millis)); + } else { + statement.setTimestamp(pos, new Timestamp(millis)); + } + } + } - @Override - public void setJdbcObject(PreparedStatement statement, Object value, int pos, int type, int scale) throws Exception { + @Override + public LocalTime materializeObject(ResultSet rs, int index, int type) throws Exception { + if (type == Types.TIME && rs.getTime(index) != null) { + return new LocalTime(rs.getTime(index).getTime()); + } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { + return new LocalTime(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - if (value == null) { - statement.setNull(pos, type); - } else { - if (type == Types.TIME) { - statement.setTime(pos, new Time(getMillis(value))); - } else { - statement.setTimestamp(pos, new Timestamp(getMillis(value))); - } - } - } + @Override + public LocalTime materializeObject(CallableStatement rs, int index, int type) throws Exception { + if (type == Types.TIME && rs.getTime(index) != null) { + return new LocalTime(rs.getTime(index).getTime()); + } else if (type == Types.TIMESTAMP && rs.getTimestamp(index) != null) { + return new LocalTime(rs.getTimestamp(index).getTime()); + } else { + return null; + } + } - protected long getMillis(Object value) { - return EPOCH.toDateTime((LocalTime) value).getMillis(); - } + @Override + public String toString(LocalTime value) { + if (value == null) { + return "\'null\'"; + } + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java index eb46adf..11e9860 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigDecimalType.java @@ -26,7 +26,7 @@ import java.sql.ResultSet; /** * @since 3.0 */ -public class BigDecimalType implements ExtendedType { +public class BigDecimalType implements ExtendedType<BigDecimal> { @Override public String getClassName() { @@ -34,12 +34,12 @@ public class BigDecimalType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public BigDecimal materializeObject(ResultSet rs, int index, int type) throws Exception { return rs.getBigDecimal(index); } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public BigDecimal materializeObject(CallableStatement rs, int index, int type) throws Exception { return rs.getBigDecimal(index); } @@ -47,7 +47,7 @@ public class BigDecimalType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + BigDecimal value, int pos, int type, int scale) throws Exception { @@ -56,8 +56,16 @@ public class BigDecimalType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setBigDecimal(pos, (BigDecimal) value); + statement.setBigDecimal(pos, value); } } + @Override + public String toString(BigDecimal value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java index 3c5c645..a3d1752 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BigIntegerType.java @@ -28,7 +28,7 @@ import org.apache.cayenne.dba.TypesMapping; /** * @since 3.0 */ -public class BigIntegerType implements ExtendedType { +public class BigIntegerType implements ExtendedType<BigInteger> { @Override public String getClassName() { @@ -36,7 +36,7 @@ public class BigIntegerType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public BigInteger materializeObject(ResultSet rs, int index, int type) throws Exception { Object object = rs.getObject(index); if (object == null) { return null; @@ -46,7 +46,7 @@ public class BigIntegerType implements ExtendedType { } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public BigInteger materializeObject(CallableStatement rs, int index, int type) throws Exception { Object object = rs.getObject(index); if (object == null) { @@ -59,7 +59,7 @@ public class BigIntegerType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + BigInteger value, int pos, int type, int precision) throws Exception { @@ -76,4 +76,13 @@ public class BigIntegerType implements ExtendedType { + TypesMapping.getSqlNameByType(type)); } } + + @Override + public String toString(BigInteger value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java index a14dcd2..be0d597 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/BooleanType.java @@ -32,7 +32,7 @@ import java.sql.Types; * * @since 1.2 */ -public class BooleanType implements ExtendedType { +public class BooleanType implements ExtendedType<Boolean> { @Override public String getClassName() { @@ -42,7 +42,7 @@ public class BooleanType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement st, - Object val, + Boolean val, int pos, int type, int precision) throws Exception { @@ -60,15 +60,24 @@ public class BooleanType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Boolean materializeObject(ResultSet rs, int index, int type) throws Exception { boolean b = rs.getBoolean(index); return (rs.wasNull()) ? null : b ? Boolean.TRUE : Boolean.FALSE; } @Override - public Object materializeObject(CallableStatement st, int index, int type) + public Boolean materializeObject(CallableStatement st, int index, int type) throws Exception { boolean b = st.getBoolean(index); return (st.wasNull()) ? null : b ? Boolean.TRUE : Boolean.FALSE; } + + @Override + public String toString(Boolean value) { + if (value == null) { + return "\'null\'"; + } + + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java index 8b42a65..3ad6898 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java @@ -30,13 +30,14 @@ import java.sql.SQLException; import java.sql.Types; import org.apache.cayenne.CayenneException; +import org.apache.cayenne.util.IDUtil; import org.apache.cayenne.util.MemoryBlob; /** * Handles <code>byte[]</code>, mapping it as either of JDBC types - BLOB or * (VAR)BINARY. Can be configured to trim trailing zero bytes. */ -public class ByteArrayType implements ExtendedType { +public class ByteArrayType implements ExtendedType<byte[]> { private static final int BUF_SIZE = 8 * 1024; @@ -76,7 +77,7 @@ public class ByteArrayType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public byte[] materializeObject(ResultSet rs, int index, int type) throws Exception { byte[] bytes = null; @@ -95,7 +96,7 @@ public class ByteArrayType implements ExtendedType { } @Override - public Object materializeObject(CallableStatement cs, int index, int type) throws Exception { + public byte[] materializeObject(CallableStatement cs, int index, int type) throws Exception { byte[] bytes = null; @@ -118,15 +119,15 @@ public class ByteArrayType implements ExtendedType { } @Override - public void setJdbcObject(PreparedStatement st, Object val, int pos, int type, int scale) throws Exception { + public void setJdbcObject(PreparedStatement st, byte[] val, int pos, int type, int scale) throws Exception { // if this is a BLOB column, set the value as "bytes" // instead. This should work with most drivers if (type == Types.BLOB) { if (isUsingBlobs()) { - st.setBlob(pos, writeBlob((byte[]) val)); + st.setBlob(pos, writeBlob(val)); } else { - st.setBytes(pos, (byte[]) val); + st.setBytes(pos, val); } } else { if (scale != -1) { @@ -137,6 +138,17 @@ public class ByteArrayType implements ExtendedType { } } + @Override + public String toString(byte[] value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + IDUtil.appendFormattedBytes(buffer, value); + return buffer.toString(); + } + protected Blob writeBlob(byte[] bytes) { // TODO: should we use Connection.createBlob() instead? (Like Oracle // ByteArrayType does) http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java index 11ae4a6..8db28ce 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java @@ -18,6 +18,12 @@ ****************************************************************/ package org.apache.cayenne.access.types; +import java.lang.reflect.Array; + +import org.apache.cayenne.util.IDUtil; + +import static org.apache.cayenne.log.CommonsJdbcEventLogger.TRIM_VALUES_THRESHOLD; + /** * A factory that dynamically creates ExtendedTypes for Character, Character[], Byte[] and * char[] based on adapter configured types for String and byte[]. @@ -40,38 +46,34 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { if (Character.class.isAssignableFrom(elementType)) { // can't use "getRegisteredType" as it causes infinite recursion - ExtendedType stringType = map - .getExplictlyRegisteredType("java.lang.String"); - + ExtendedType<String> stringType = map.getExplictlyRegisteredType("java.lang.String"); return new CharacterArrayType(stringType); } else if (Character.TYPE.isAssignableFrom(elementType)) { // can't use "getRegisteredType" as it causes infinite recursion - ExtendedType stringType = map - .getExplictlyRegisteredType("java.lang.String"); - + ExtendedType<String> stringType = map.getExplictlyRegisteredType("java.lang.String"); return new CharArrayType(stringType); } else if (Byte.class.isAssignableFrom(elementType)) { // can't use "getRegisteredType" as it causes infinite recursion - ExtendedType bytesType = map.getExplictlyRegisteredType("byte[]"); + ExtendedType<byte[]> bytesType = map.getExplictlyRegisteredType("byte[]"); return new ByteWrapperArrayType(bytesType); } } else if (Character.class.isAssignableFrom(objectClass)) { // can't use "getRegisteredType" as it causes infinite recursion - ExtendedType stringType = map.getExplictlyRegisteredType("java.lang.String"); + ExtendedType<String> stringType = map.getExplictlyRegisteredType("java.lang.String"); return new CharacterType(stringType); } return null; } - final class CharacterType extends ExtendedTypeDecorator { + final class CharacterType extends ExtendedTypeDecorator<Character, String> { - CharacterType(ExtendedType stringType) { + CharacterType(ExtendedType<String> stringType) { super(stringType); } @@ -81,26 +83,25 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } @Override - Object fromJavaObject(Object object) { + String fromJavaObject(Character object) { return object != null - ? String.valueOf(((Character) object).charValue()) + ? String.valueOf(object.charValue()) : null; } @Override - Object toJavaObject(Object object) { - if (object == null) { + Character toJavaObject(String string) { + if (string == null) { return null; } - String string = object.toString(); - return (string.length() > 0) ? Character.valueOf(string.charAt(0)) : null; + return (string.length() > 0) ? string.charAt(0) : null; } } - final class CharArrayType extends ExtendedTypeDecorator { + final class CharArrayType extends ExtendedTypeDecorator<char[], String> { - CharArrayType(ExtendedType stringType) { + CharArrayType(ExtendedType<String> stringType) { super(stringType); } @@ -110,19 +111,50 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } @Override - Object fromJavaObject(Object object) { - return object != null ? new String((char[]) object) : null; + String fromJavaObject(char[] object) { + return object != null ? new String(object) : null; } @Override - Object toJavaObject(Object object) { - return object != null ? ((String) object).toCharArray() : null; + char[] toJavaObject(String object) { + return object != null ? object.toCharArray() : null; + } + + @Override + public String toString(char[] value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + buffer.append("< "); + + int len = Array.getLength(value); + boolean trimming = false; + if (len > TRIM_VALUES_THRESHOLD) { + len = TRIM_VALUES_THRESHOLD; + trimming = true; + } + + for (int i = 0; i < len; i++) { + if (i > 0) { + buffer.append(","); + } + buffer.append(Array.get(value, i)); + } + + if (trimming) { + buffer.append("..."); + } + + buffer.append('>'); + return buffer.toString(); } } - final class CharacterArrayType extends ExtendedTypeDecorator { + final class CharacterArrayType extends ExtendedTypeDecorator<Character[], String> { - CharacterArrayType(ExtendedType stringType) { + CharacterArrayType(ExtendedType<String> stringType) { super(stringType); } @@ -132,39 +164,68 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } @Override - Object fromJavaObject(Object object) { + String fromJavaObject(Character[] object) { if (object == null) { return null; } - Character[] chars = (Character[]) object; - StringBuilder buffer = new StringBuilder(chars.length); - for (Character aChar : chars) { - buffer.append(aChar != null ? aChar.charValue() : 0); + StringBuilder buffer = new StringBuilder(object.length); + for (Character aChar : object) { + buffer.append(aChar != null ? aChar : 0); } return buffer.toString(); } @Override - Object toJavaObject(Object object) { + Character[] toJavaObject(String object) { if (object == null) { return null; } - String string = object.toString(); - Character[] chars = new Character[string.length()]; - for (int i = 0; i < string.length(); i++) { - chars[i] = Character.valueOf(string.charAt(i)); + Character[] chars = new Character[object.length()]; + for (int i = 0; i < object.length(); i++) { + chars[i] = object.charAt(i); } return chars; } + + @Override + public String toString(Character[] value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + buffer.append("< "); + + int len = Array.getLength(value); + boolean trimming = false; + if (len > TRIM_VALUES_THRESHOLD) { + len = TRIM_VALUES_THRESHOLD; + trimming = true; + } + + for (int i = 0; i < len; i++) { + if (i > 0) { + buffer.append(","); + } + buffer.append(Array.get(value, i)); + } + + if (trimming) { + buffer.append("..."); + } + + buffer.append('>'); + return buffer.toString(); + } } - final class ByteWrapperArrayType extends ExtendedTypeDecorator { + final class ByteWrapperArrayType extends ExtendedTypeDecorator<Byte[], byte[]> { - ByteWrapperArrayType(ExtendedType byteArrayType) { + ByteWrapperArrayType(ExtendedType<byte[]> byteArrayType) { super(byteArrayType); } @@ -174,34 +235,62 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } @Override - Object fromJavaObject(Object object) { - if (object == null) { + byte[] fromJavaObject(Byte[] bytes) { + if (bytes == null) { return null; } - Byte[] bytes = (Byte[]) object; byte[] buffer = new byte[bytes.length]; for (int i = 0; i < bytes.length; i++) { - buffer[i] = bytes[i] != null ? bytes[i].byteValue() : 0; + buffer[i] = bytes[i] != null ? bytes[i] : 0; } return buffer; } @Override - Object toJavaObject(Object object) { - if (object == null) { + Byte[] toJavaObject(byte[] bytes) { + if (bytes == null) { return null; } - byte[] bytes = (byte[]) object; Byte[] byteWrappers = new Byte[bytes.length]; - for (int i = 0; i < bytes.length; i++) { - byteWrappers[i] = Byte.valueOf(bytes[i]); + byteWrappers[i] = bytes[i]; } return byteWrappers; } + + @Override + public String toString(Byte[] value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + buffer.append("< "); + + int len = value.length; + boolean trimming = false; + if (len > TRIM_VALUES_THRESHOLD) { + len = TRIM_VALUES_THRESHOLD; + trimming = true; + } + + for (int i = 0; i < len; i++) { + if (i > 0) { + buffer.append(","); + } + IDUtil.appendFormattedByte(buffer, value[i]); + } + + if (trimming) { + buffer.append("..."); + } + + buffer.append('>'); + return buffer.toString(); + } } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java index 438707f..c11191d 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteType.java @@ -23,15 +23,17 @@ import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; +import org.apache.cayenne.util.IDUtil; + /** * Handles <code>java.lang.Byte</code> type mapping. Can be configured to recast * java.lang.Byte to java.lang.Integer when binding values to PreparedStatement. This is a * workaround for bugs in certain drivers. Drivers that are proven to have issues with * byte values are Sybase and Oracle (Mac OS X only). - * + * * @since 1.0.3 */ -public class ByteType implements ExtendedType { +public class ByteType implements ExtendedType<Byte> { protected boolean widenBytes; @@ -45,13 +47,13 @@ public class ByteType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Byte materializeObject(ResultSet rs, int index, int type) throws Exception { byte b = rs.getByte(index); return (rs.wasNull()) ? null : b; } @Override - public Object materializeObject(CallableStatement st, int index, int type) + public Byte materializeObject(CallableStatement st, int index, int type) throws Exception { byte b = st.getByte(index); return (st.wasNull()) ? null : b; @@ -60,24 +62,33 @@ public class ByteType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Byte value, int pos, int type, int precision) throws Exception { if (value == null) { statement.setNull(pos, type); - } - else { + } else { - Byte b = (Byte) value; + Byte b = value; if (widenBytes) { statement.setInt(pos, b.intValue()); - } - else { + } else { statement.setByte(pos, b.byteValue()); } } } + @Override + public String toString(Byte value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + IDUtil.appendFormattedByte(buffer, value); + + return buffer.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java index 811e9cc..acc53b2 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java @@ -34,7 +34,7 @@ import org.apache.cayenne.dba.TypesMapping; * * @since 3.0 */ -public class CalendarType<T extends Calendar> implements ExtendedType { +public class CalendarType<T extends Calendar> implements ExtendedType<Calendar> { protected Class<T> calendarClass; @@ -57,7 +57,7 @@ public class CalendarType<T extends Calendar> implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Calendar materializeObject(ResultSet rs, int index, int type) throws Exception { Date val = null; @@ -98,7 +98,7 @@ public class CalendarType<T extends Calendar> implements ExtendedType { } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Calendar materializeObject(CallableStatement rs, int index, int type) throws Exception { Date val = null; @@ -141,7 +141,7 @@ public class CalendarType<T extends Calendar> implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Calendar value, int pos, int type, int precision) throws Exception { @@ -149,26 +149,18 @@ public class CalendarType<T extends Calendar> implements ExtendedType { if (value == null) { statement.setNull(pos, type); } - else if (value instanceof Calendar) { - - Calendar calendar = (Calendar) value; - statement.setObject(pos, convertToJdbcObject(calendar, type)); - } else { - throw new IllegalArgumentException("Expected java.util.Calendar, got " - + value.getClass().getName()); + statement.setObject(pos, convertToJdbcObject(value, type)); } } protected Object convertToJdbcObject(Calendar value, int type) throws Exception { - Calendar calendar = value; - if (type == Types.DATE) - return new java.sql.Date(calendar.getTimeInMillis()); + return new java.sql.Date(value.getTimeInMillis()); else if (type == Types.TIME) - return new java.sql.Time(calendar.getTimeInMillis()); + return new java.sql.Time(value.getTimeInMillis()); else if (type == Types.TIMESTAMP) - return new java.sql.Timestamp(calendar.getTimeInMillis()); + return new java.sql.Timestamp(value.getTimeInMillis()); else throw new IllegalArgumentException( "Only DATE, TIME or TIMESTAMP can be mapped as '" @@ -177,4 +169,13 @@ public class CalendarType<T extends Calendar> implements ExtendedType { + TypesMapping.getSqlNameByType(type)); } + @Override + public String toString(Calendar value) { + if (value == null) { + return "\'null\'"; + } + + return value.getClass().getName() + '(' + new java.sql.Timestamp(value.getTimeInMillis()) + ')'; + } + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java index 9f6f990..5da2bae 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CharType.java @@ -19,8 +19,6 @@ package org.apache.cayenne.access.types; -import org.apache.cayenne.CayenneException; - import java.io.IOException; import java.io.Reader; import java.io.StringWriter; @@ -31,13 +29,16 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; +import org.apache.cayenne.CayenneException; + /** * Handles <code>java.lang.String</code>, mapping it as either of JDBC types - * CLOB or (VAR)CHAR. Can be configured to trim trailing spaces. */ -public class CharType implements ExtendedType { +public class CharType implements ExtendedType<String> { private static final int BUF_SIZE = 8 * 1024; + private static final int TRIM_VALUES_THRESHOLD = 30; protected boolean trimmingChars; protected boolean usingClobs; @@ -57,7 +58,7 @@ public class CharType implements ExtendedType { /** Return trimmed string. */ @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public String materializeObject(ResultSet rs, int index, int type) throws Exception { if (type == Types.CLOB || type == Types.NCLOB) { return isUsingClobs() ? readClob(rs.getClob(index)) : readCharStream(rs, index); @@ -67,7 +68,7 @@ public class CharType implements ExtendedType { } @Override - public Object materializeObject(CallableStatement cs, int index, int type) throws Exception { + public String materializeObject(CallableStatement cs, int index, int type) throws Exception { if (type == Types.CLOB || type == Types.NCLOB) { if (!isUsingClobs()) { @@ -80,7 +81,7 @@ public class CharType implements ExtendedType { return handleString(cs.getString(index), type); } - private Object handleString(String val, int type) throws SQLException { + private String handleString(String val, int type) throws SQLException { // trim CHAR type if (val != null && (type == Types.CHAR || type == Types.NCHAR) && isTrimmingChars()) { return rtrim(val); @@ -100,12 +101,12 @@ public class CharType implements ExtendedType { } @Override - public void setJdbcObject(PreparedStatement st, Object value, int pos, int type, int scale) throws Exception { + public void setJdbcObject(PreparedStatement st, String value, int pos, int type, int scale) throws Exception { // if this is a CLOB column, set the value as "String" // instead. This should work with most drivers if (type == Types.CLOB || type == Types.NCLOB) { - st.setString(pos, (String) value); + st.setString(pos, value); } else if (scale != -1) { st.setObject(pos, value, type, scale); } else { @@ -113,6 +114,37 @@ public class CharType implements ExtendedType { } } + @Override + public String toString(String value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + + buffer.append('\''); + // lets escape quotes + String literal = value; + if (literal.length() > TRIM_VALUES_THRESHOLD) { + literal = literal.substring(0, TRIM_VALUES_THRESHOLD) + "..."; + } + + int curPos = 0; + int endPos = 0; + + while ((endPos = literal.indexOf('\'', curPos)) >= 0) { + buffer.append(literal.substring(curPos, endPos + 1)).append('\''); + curPos = endPos + 1; + } + + if (curPos < literal.length()) + buffer.append(literal.substring(curPos)); + + buffer.append('\''); + + return buffer.toString(); + } + protected String readClob(Clob clob) throws IOException, SQLException { if (clob == null) { return null; http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java index 853efba..0e158fc 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DateType.java @@ -26,7 +26,7 @@ import java.sql.ResultSet; /** * @since 3.0 */ -public class DateType implements ExtendedType { +public class DateType implements ExtendedType<Date> { @Override public String getClassName() { @@ -34,12 +34,12 @@ public class DateType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Date materializeObject(ResultSet rs, int index, int type) throws Exception { return rs.getDate(index); } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Date materializeObject(CallableStatement rs, int index, int type) throws Exception { return rs.getDate(index); } @@ -47,7 +47,7 @@ public class DateType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Date value, int pos, int type, int scale) throws Exception { @@ -56,8 +56,16 @@ public class DateType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setDate(pos, (Date) value); + statement.setDate(pos, value); } } + @Override + public String toString(Date value) { + if (value == null) { + return "\'null\'"; + } + + return '\'' + value.toString() + '\''; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java index 5464e0f..66186c6 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/DoubleType.java @@ -25,7 +25,7 @@ import java.sql.ResultSet; /** * @since 3.0 */ -public class DoubleType implements ExtendedType { +public class DoubleType implements ExtendedType<Double> { @Override public String getClassName() { @@ -33,13 +33,13 @@ public class DoubleType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Double materializeObject(ResultSet rs, int index, int type) throws Exception { double d = rs.getDouble(index); return rs.wasNull() ? null : d; } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Double materializeObject(CallableStatement rs, int index, int type) throws Exception { double d = rs.getDouble(index); return rs.wasNull() ? null : d; @@ -48,7 +48,7 @@ public class DoubleType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Double value, int pos, int type, int scale) throws Exception { @@ -57,7 +57,16 @@ public class DoubleType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setDouble(pos, ((Number) value).doubleValue()); + statement.setDouble(pos, value); } } + + @Override + public String toString(Double value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java index 1261a26..e1af1db 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java @@ -24,6 +24,7 @@ import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; +import org.apache.cayenne.ExtendedEnumeration; import org.apache.cayenne.dba.TypesMapping; /** @@ -36,10 +37,10 @@ import org.apache.cayenne.dba.TypesMapping; * * @since 1.2 */ -public class EnumType<T extends Enum<T>> implements ExtendedType { +public class EnumType<T extends Enum<T>> implements ExtendedType<T> { protected Class<T> enumClass; - protected Object[] values; + protected T[] values; protected String canonicalName; public EnumType(Class<T> enumClass) { @@ -52,7 +53,7 @@ public class EnumType<T extends Enum<T>> implements ExtendedType { try { Method m = enumClass.getMethod("values"); - this.values = (Object[]) m.invoke(null); + this.values = (T[]) m.invoke(null); } catch (Exception e) { throw new IllegalArgumentException("Class " @@ -69,20 +70,17 @@ public class EnumType<T extends Enum<T>> implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + T value, int pos, int type, int precision) throws Exception { - if (value instanceof Enum<?>) { - - Enum<?> e = (Enum<?>) value; - + if (value != null) { if (TypesMapping.isNumeric(type)) { - statement.setInt(pos, e.ordinal()); + statement.setInt(pos, value.ordinal()); } else { - statement.setString(pos, e.name()); + statement.setString(pos, value.name()); } } else { @@ -91,7 +89,7 @@ public class EnumType<T extends Enum<T>> implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public T materializeObject(ResultSet rs, int index, int type) throws Exception { if (TypesMapping.isNumeric(type)) { int i = rs.getInt(index); return (rs.wasNull() || index < 0) ? null : values[i]; @@ -103,9 +101,8 @@ public class EnumType<T extends Enum<T>> implements ExtendedType { } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public T materializeObject(CallableStatement rs, int index, int type) throws Exception { - if (TypesMapping.isNumeric(type)) { int i = rs.getInt(index); return (rs.wasNull() || index < 0) ? null : values[i]; @@ -115,4 +112,28 @@ public class EnumType<T extends Enum<T>> implements ExtendedType { return string != null ? Enum.valueOf(enumClass, string) : null; } } + + @Override + public String toString(T value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + // buffer.append(object.getClass().getName()).append("."); + buffer.append(value.name()).append("="); + if (value instanceof ExtendedEnumeration) { + Object dbValue = ((ExtendedEnumeration) value).getDatabaseValue(); + if (dbValue instanceof String) + buffer.append("'"); + buffer.append(value); + if (dbValue instanceof String) + buffer.append("'"); + } else { + buffer.append((value).ordinal()); + // FIXME -- this isn't quite right + } + + return buffer.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java index b37e07d..50dc48c 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java @@ -38,10 +38,10 @@ import java.util.Map; * * @since 3.0 */ -public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { +public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType<T> { private Class<T> enumerationClass = null; - private Object[] values = null; + private T[] values = null; // Contains a mapping of database values (Integer or String) and the // Enum for that value. This is to facilitate mapping database values @@ -57,10 +57,10 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { try { Method m = enumerationClass.getMethod("values"); - values = (Object[]) m.invoke(null); + values = (T[]) m.invoke(null); for (int i = 0; i < values.length; i++) - register((Enum<T>) values[i], ((ExtendedEnumeration) values[i]) + register(values[i], ((ExtendedEnumeration) values[i]) .getDatabaseValue()); } @@ -77,7 +77,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public T materializeObject(ResultSet rs, int index, int type) throws Exception { if (TypesMapping.isNumeric(type)) { int i = rs.getInt(index); return (rs.wasNull() || index < 0) ? null : lookup(i); @@ -89,7 +89,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public T materializeObject(CallableStatement rs, int index, int type) throws Exception { if (TypesMapping.isNumeric(type)) { int i = rs.getInt(index); @@ -104,7 +104,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + T value, int pos, int type, int precision) throws Exception { @@ -138,8 +138,8 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { /** * Lookup the giving database value and return the matching enum. */ - private Enum<T> lookup(Object databaseValue) { - if (enumerationMappings.containsKey(databaseValue) == false) { + private T lookup(Object databaseValue) { + if (!enumerationMappings.containsKey(databaseValue)) { // All integers enums are mapped. Not necessarily all strings. if (databaseValue instanceof Integer) throw new CayenneRuntimeException("Missing enumeration mapping for " @@ -153,7 +153,31 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType { } // Mapped value->enum exists, return it. - return enumerationMappings.get(databaseValue); + return (T) enumerationMappings.get(databaseValue); + } + + @Override + public String toString(T value) { + if (value == null) { + return "\'null\'"; + } + + StringBuilder buffer = new StringBuilder(); + // buffer.append(object.getClass().getName()).append("."); + buffer.append(value.name()).append("="); + if (value instanceof ExtendedEnumeration) { + Object dbValue = ((ExtendedEnumeration) value).getDatabaseValue(); + if (dbValue instanceof String) + buffer.append("'"); + buffer.append(value); + if (dbValue instanceof String) + buffer.append("'"); + } else { + buffer.append((value).ordinal()); + // FIXME -- this isn't quite right + } + + return buffer.toString(); } /** http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java index dd025bf..0836290 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedType.java @@ -27,7 +27,7 @@ import java.sql.ResultSet; * Defines methods to read Java objects from JDBC ResultSets and write as parameters of * PreparedStatements. */ -public interface ExtendedType { +public interface ExtendedType<T> { /** * Returns a full name of Java class that this ExtendedType supports. @@ -39,7 +39,7 @@ public interface ExtendedType { */ void setJdbcObject( PreparedStatement statement, - Object value, + T value, int pos, int type, int scale) throws Exception; @@ -51,14 +51,20 @@ public interface ExtendedType { * @throws Exception if read error occurred, or an object can't be converted to a * target Java class. */ - Object materializeObject(ResultSet rs, int index, int type) throws Exception; + T materializeObject(ResultSet rs, int index, int type) throws Exception; /** * Reads an object from a stored procedure OUT parameter, converting it to class * returned by 'getClassName' method. * - * @throws Exception if read error ocurred, or an object can't be converted to a + * @throws Exception if read error occurred, or an object can't be converted to a * target Java class. */ - Object materializeObject(CallableStatement rs, int index, int type) throws Exception; + T materializeObject(CallableStatement rs, int index, int type) throws Exception; + + /** + * + */ + String toString(T value); + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java index a9c7f52..970aaa1 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedTypeDecorator.java @@ -27,39 +27,48 @@ import java.sql.ResultSet; * * @since 3.0 */ -abstract class ExtendedTypeDecorator implements ExtendedType { +abstract class ExtendedTypeDecorator<T, E> implements ExtendedType<T> { - private ExtendedType decorated; + private ExtendedType<E> decorated; - ExtendedTypeDecorator(ExtendedType decorated) { + ExtendedTypeDecorator(ExtendedType<E> decorated) { this.decorated = decorated; } - abstract Object toJavaObject(Object object); + abstract T toJavaObject(E object); - abstract Object fromJavaObject(Object object); + abstract E fromJavaObject(T object); @Override public abstract String getClassName(); @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public T materializeObject(CallableStatement rs, int index, int type) throws Exception { return toJavaObject(decorated.materializeObject(rs, index, type)); } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public T materializeObject(ResultSet rs, int index, int type) throws Exception { return toJavaObject(decorated.materializeObject(rs, index, type)); } @Override public void setJdbcObject( PreparedStatement statement, - Object value, + T value, int pos, int type, int precision) throws Exception { decorated.setJdbcObject(statement, fromJavaObject(value), pos, type, precision); } + + @Override + public String toString(T value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java index 8a63db4..822e9df 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/FloatType.java @@ -25,7 +25,7 @@ import java.sql.ResultSet; /** * @since 3.0 */ -public class FloatType implements ExtendedType { +public class FloatType implements ExtendedType<Float> { @Override public String getClassName() { @@ -33,13 +33,13 @@ public class FloatType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Float materializeObject(ResultSet rs, int index, int type) throws Exception { float f = rs.getFloat(index); return rs.wasNull() ? null : f; } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Float materializeObject(CallableStatement rs, int index, int type) throws Exception { float f = rs.getFloat(index); return rs.wasNull() ? null : f; @@ -48,7 +48,7 @@ public class FloatType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Float value, int pos, int type, int scale) throws Exception { @@ -57,8 +57,16 @@ public class FloatType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setFloat(pos, ((Number) value).floatValue()); + statement.setFloat(pos, value); } } + @Override + public String toString(Float value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java index 8375562..64ee766 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/IntegerType.java @@ -25,7 +25,7 @@ import java.sql.ResultSet; /** * @since 3.0 */ -public class IntegerType implements ExtendedType { +public class IntegerType implements ExtendedType<Integer> { @Override public String getClassName() { @@ -33,13 +33,13 @@ public class IntegerType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Integer materializeObject(ResultSet rs, int index, int type) throws Exception { int value = rs.getInt(index); return (rs.wasNull()) ? null : value; } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Integer materializeObject(CallableStatement rs, int index, int type) throws Exception { int value = rs.getInt(index); return (rs.wasNull()) ? null : value; @@ -48,7 +48,7 @@ public class IntegerType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Integer value, int pos, int type, int scale) throws Exception { @@ -57,8 +57,16 @@ public class IntegerType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setInt(pos, ((Number) value).intValue()); + statement.setInt(pos, value); } } + @Override + public String toString(Integer value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java index 7287d66..decab14 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/LongType.java @@ -25,7 +25,7 @@ import java.sql.ResultSet; /** * @since 3.0 */ -public class LongType implements ExtendedType { +public class LongType implements ExtendedType<Long> { @Override public String getClassName() { @@ -33,13 +33,13 @@ public class LongType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Long materializeObject(ResultSet rs, int index, int type) throws Exception { long value = rs.getLong(index); return (rs.wasNull()) ? null : value; } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Long materializeObject(CallableStatement rs, int index, int type) throws Exception { long value = rs.getLong(index); return (rs.wasNull()) ? null : value; @@ -48,7 +48,7 @@ public class LongType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Long value, int pos, int type, int scale) throws Exception { @@ -57,8 +57,16 @@ public class LongType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setLong(pos, ((Number) value).longValue()); + statement.setLong(pos, value); } } + @Override + public String toString(Long value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java index c14c340..6fb2d3e 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ObjectType.java @@ -27,7 +27,7 @@ import java.sql.ResultSet; * * @since 3.0 */ -public class ObjectType implements ExtendedType { +public class ObjectType implements ExtendedType<Object> { @Override public String getClassName() { @@ -60,4 +60,13 @@ public class ObjectType implements ExtendedType { } } + @Override + public String toString(Object value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java index 214f84b..e37eed5 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/SerializableTypeFactory.java @@ -18,16 +18,16 @@ ****************************************************************/ package org.apache.cayenne.access.types; -import org.apache.cayenne.CayenneRuntimeException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; +import org.apache.cayenne.CayenneRuntimeException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + /** * ExtendedTypeFactory for handling serializable objects. Returned ExtendedType * is simply an object serialization wrapper on top of byte[] ExtendedType. @@ -59,15 +59,7 @@ class SerializableTypeFactory implements ExtendedTypeFactory { // note - can't use "getRegisteredType" as it causes infinite // recursion - ExtendedType bytesType = map.getExplictlyRegisteredType("byte[]"); - - // not sure if this type of recursion can occur, still worth - // checking - if (bytesType instanceof SerializableType) { - throw new IllegalStateException("Can't create Serializable ExtendedType for " - + objectClass.getCanonicalName() + ": no ExtendedType exists for byte[]"); - } - + ExtendedType<byte[]> bytesType = map.getExplictlyRegisteredType("byte[]"); return new SerializableType(objectClass, bytesType); } @@ -77,11 +69,11 @@ class SerializableTypeFactory implements ExtendedTypeFactory { /** * A serialization wrapper on top of byte[] ExtendedType */ - final class SerializableType extends ExtendedTypeDecorator { + final class SerializableType extends ExtendedTypeDecorator<Object, byte[]> { private Class<?> javaClass; - SerializableType(Class<?> javaClass, ExtendedType bytesType) { + SerializableType(Class<?> javaClass, ExtendedType<byte[]> bytesType) { super(bytesType); this.javaClass = javaClass; } @@ -92,7 +84,7 @@ class SerializableTypeFactory implements ExtendedTypeFactory { } @Override - Object fromJavaObject(Object object) { + byte[] fromJavaObject(Object object) { ByteArrayOutputStream bytes = new ByteArrayOutputStream() { // avoid unneeded array copy... @@ -112,8 +104,7 @@ class SerializableTypeFactory implements ExtendedTypeFactory { } @Override - Object toJavaObject(Object object) { - byte[] bytes = (byte[]) object; + Object toJavaObject(byte[] bytes) { try { return bytes != null && bytes.length > 0 ? new ObjectInputStream(new ByteArrayInputStream(bytes)) .readObject() : null; http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java index cfd8ee2..72ed935 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ShortType.java @@ -31,7 +31,7 @@ import java.sql.ResultSet; * * @since 1.0.2 */ -public class ShortType implements ExtendedType { +public class ShortType implements ExtendedType<Short> { protected boolean widenShorts; @@ -45,13 +45,13 @@ public class ShortType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Short materializeObject(ResultSet rs, int index, int type) throws Exception { short s = rs.getShort(index); return (rs.wasNull()) ? null : s; } @Override - public Object materializeObject(CallableStatement st, int index, int type) + public Short materializeObject(CallableStatement st, int index, int type) throws Exception { short s = st.getShort(index); return (st.wasNull()) ? null : s; @@ -60,7 +60,7 @@ public class ShortType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Short value, int pos, int type, int precision) throws Exception { @@ -70,13 +70,21 @@ public class ShortType implements ExtendedType { } else { - Short s = (Short) value; if (widenShorts) { - statement.setInt(pos, s.intValue()); + statement.setInt(pos, value.intValue()); } else { - statement.setShort(pos, s.shortValue()); + statement.setShort(pos, value); } } } + + @Override + public String toString(Short value) { + if (value == null) { + return "\'null\'"; + } + + return value.toString(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/efa48e5c/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java index 67b4bd0..3026954 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/TimeType.java @@ -26,7 +26,7 @@ import java.sql.Time; /** * @since 3.0 */ -public class TimeType implements ExtendedType { +public class TimeType implements ExtendedType<Time> { @Override public String getClassName() { @@ -34,12 +34,12 @@ public class TimeType implements ExtendedType { } @Override - public Object materializeObject(ResultSet rs, int index, int type) throws Exception { + public Time materializeObject(ResultSet rs, int index, int type) throws Exception { return rs.getTime(index); } @Override - public Object materializeObject(CallableStatement rs, int index, int type) + public Time materializeObject(CallableStatement rs, int index, int type) throws Exception { return rs.getTime(index); } @@ -47,7 +47,7 @@ public class TimeType implements ExtendedType { @Override public void setJdbcObject( PreparedStatement statement, - Object value, + Time value, int pos, int type, int scale) throws Exception { @@ -56,7 +56,16 @@ public class TimeType implements ExtendedType { statement.setNull(pos, type); } else { - statement.setTime(pos, (Time) value); + statement.setTime(pos, value); } } + + @Override + public String toString(Time value) { + if (value == null) { + return "\'null\'"; + } + + return '\'' + value.toString() + '\''; + } }