Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java (revision 518719) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java (working copy) @@ -51,6 +51,7 @@ SQLBuffer sql, int index) { switch (_type) { case JavaSQLTypes.DATE: + case JavaSQLTypes.SQL_DATE: sql.append(ctx.store.getDBDictionary().currentDateFunction); break; case JavaSQLTypes.TIME: Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationStrategies.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationStrategies.java (revision 518719) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationStrategies.java (working copy) @@ -182,6 +182,7 @@ col.setJavaType(pk.getTypeCode()); break; case JavaTypes.DATE: + case JavaTypes.SQL_DATE: col.setJavaType(JavaSQLTypes.getDateTypeCode(pk.getType())); break; default: Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ImmutableValueHandler.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ImmutableValueHandler.java (revision 518719) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ImmutableValueHandler.java (working copy) @@ -45,7 +45,8 @@ boolean adapt) { Column col = new Column(); col.setName(name); - if (vm.getTypeCode() == JavaTypes.DATE) + if (vm.getTypeCode() == JavaTypes.DATE || + vm.getTypeCode() == JavaTypes.SQL_DATE) col.setJavaType(JavaSQLTypes.getDateTypeCode(vm.getType())); else col.setJavaType(vm.getTypeCode()); @@ -68,6 +69,7 @@ case JavaTypes.SHORT_OBJ: case JavaTypes.STRING: case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.BIGINTEGER: case JavaTypes.LOCALE: return true; Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/JavaSQLTypes.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/JavaSQLTypes.java (revision 518719) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/JavaSQLTypes.java (working copy) @@ -40,7 +40,6 @@ public static final int BYTES = 1004; public static final int CHAR_STREAM = 1005; public static final int CLOB = 1006; - public static final int SQL_DATE = 1007; public static final int SQL_OBJECT = 1008; public static final int REF = 1009; public static final int TIME = 1010; Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java (revision 518719) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java (working copy) @@ -1004,6 +1004,7 @@ case JavaTypes.BIGDECIMAL: case JavaTypes.NUMBER: case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.CALENDAR: case JavaTypes.LOCALE: return ImmutableValueHandler.getInstance(); @@ -1157,6 +1158,7 @@ FieldMapping vfield) { switch (vfield.getTypeCode()) { case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.CALENDAR: return new TimestampVersionStrategy(); case JavaTypes.BYTE: Index: openjpa-xmlstore/src/main/java/org/apache/openjpa/xmlstore/ObjectData.java =================================================================== --- openjpa-xmlstore/src/main/java/org/apache/openjpa/xmlstore/ObjectData.java (revision 518719) +++ openjpa-xmlstore/src/main/java/org/apache/openjpa/xmlstore/ObjectData.java (working copy) @@ -214,6 +214,8 @@ // clone the date to prevent direct modification of our stored value case JavaTypes.DATE: return ((Date) val).clone(); + case JavaTypes.SQL_DATE: + return ((java.sql.Date)val).clone(); case JavaTypes.PC: case JavaTypes.PC_UNTYPED: @@ -318,6 +320,10 @@ if (val instanceof Proxy) return ((Proxy) val).copy(val); return ((Date) val).clone(); + case JavaTypes.SQL_DATE: + if (val instanceof Proxy) + return ((Proxy) val).copy(val); + return ((java.sql.Date) val).clone(); case JavaTypes.PC: case JavaTypes.PC_UNTYPED: Index: openjpa-xmlstore/src/main/java/org/apache/openjpa/xmlstore/XMLFileHandler.java =================================================================== --- openjpa-xmlstore/src/main/java/org/apache/openjpa/xmlstore/XMLFileHandler.java (revision 518719) +++ openjpa-xmlstore/src/main/java/org/apache/openjpa/xmlstore/XMLFileHandler.java (working copy) @@ -531,6 +531,8 @@ case JavaTypes.DATE: return new Date(str); + case JavaTypes.SQL_DATE: + return new java.sql.Date(new Date(str).getTime()); case JavaTypes.PC: case JavaTypes.PC_UNTYPED: Index: openjpa-kernel/src/test/java/org/apache/openjpa/util/TestProxyManager.java =================================================================== --- openjpa-kernel/src/test/java/org/apache/openjpa/util/TestProxyManager.java (revision 518719) +++ openjpa-kernel/src/test/java/org/apache/openjpa/util/TestProxyManager.java (working copy) @@ -560,6 +560,12 @@ Date orig = (Date) _mgr.newDateProxy(Time.class); orig.setTime(1999); assertDatesEqual(new Date(orig.getTime()), (Date) _mgr.copyDate(orig)); + + java.sql.Date origSql = (java.sql.Date) _mgr + .newDateProxy(java.sql.Date.class); + origSql.setTime(1999); + assertDatesEqual(new java.sql.Date(origSql.getTime()), + (java.sql.Date) _mgr.copyDate(origSql)); } public void testDateMethodsProxied() Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java (working copy) @@ -510,6 +510,7 @@ case JavaTypes.COLLECTION: case JavaTypes.MAP: case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.OBJECT: sm.provideField(getDetachedPersistenceCapable(), this, i); @@ -723,6 +724,9 @@ case JavaTypes.DATE: newVal = (_copy) ? _proxy.copyDate((Date) curVal) : curVal; return reproxy(newVal, field); + case JavaTypes.SQL_DATE: + newVal = (_copy) ? _proxy.copyDate((java.sql.Date) curVal) : curVal; + return reproxy(newVal, field); case JavaTypes.OBJECT: if (_copy) newVal = _proxy.copyCustom(curVal); Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (working copy) @@ -1118,6 +1118,7 @@ val == null ? null : val.toString(), set); break; case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.NUMBER: case JavaTypes.BOOLEAN_OBJ: case JavaTypes.BYTE_OBJ: Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SavepointFieldManager.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SavepointFieldManager.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SavepointFieldManager.java (working copy) @@ -145,6 +145,7 @@ public void storeField(FieldMetaData field) { switch (field.getDeclaredTypeCode()) { case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.ARRAY: case JavaTypes.COLLECTION: case JavaTypes.MAP: @@ -210,6 +211,8 @@ case JavaTypes.DATE: _field = proxy.copyDate((Date) curVal); break; + case JavaTypes.SQL_DATE: + _field = proxy.copyDate((java.sql.Date) curVal); case JavaTypes.OBJECT: _field = proxy.copyCustom(curVal); if (_field == null) Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCData.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCData.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCData.java (working copy) @@ -129,6 +129,8 @@ switch (vmd.getDeclaredTypeCode()) { case JavaTypes.DATE: return ((Date) data).clone(); + case JavaTypes.SQL_DATE: + return((java.sql.Date)data).clone(); case JavaTypes.LOCALE: return (Locale) data; case JavaTypes.PC: @@ -299,6 +301,11 @@ return ((Proxy) val).copy(val); else return ((Date) val).clone(); + case JavaTypes.SQL_DATE: + if(val instanceof Proxy) + return ((Proxy) val).copy(val); + else + return ((java.sql.Date) val).clone(); case JavaTypes.LOCALE: return (Locale) val; case JavaTypes.OBJECT: Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java (working copy) @@ -83,6 +83,17 @@ ret = true; } break; + case JavaTypes.SQL_DATE: + if (objval == null) + return false; + proxy = checkProxy(); + if (proxy == null) { + proxy = (Proxy) _sm.newFieldProxy(field); + ((java.sql.Date) proxy).setTime(( + (java.sql.Date) objval).getTime()); + ret = true; + } + break; case JavaTypes.CALENDAR: if (objval == null) return false; @@ -167,6 +178,7 @@ case JavaTypes.COLLECTION: case JavaTypes.MAP: case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.OBJECT: if (objval instanceof Proxy) { Proxy proxy = (Proxy) objval; Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SaveFieldManager.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SaveFieldManager.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SaveFieldManager.java (working copy) @@ -98,6 +98,7 @@ boolean mutable = false; switch (fmd.getDeclaredTypeCode()) { case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.ARRAY: case JavaTypes.COLLECTION: case JavaTypes.MAP: @@ -189,6 +190,9 @@ case JavaTypes.DATE: _field = proxy.copyDate((Date) curVal); break; + case JavaTypes.SQL_DATE: + _field = proxy.copyDate((java.sql.Date) curVal); + break; case JavaTypes.OBJECT: _field = proxy.copyCustom(curVal); if (_field == null) Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java (working copy) @@ -155,6 +155,7 @@ set); break; case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.CALENDAR: case JavaTypes.NUMBER: case JavaTypes.BOOLEAN_OBJ: Index: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (working copy) @@ -740,6 +740,7 @@ switch (fmd.getDeclaredTypeCode()) { case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.CALENDAR: case JavaTypes.ARRAY: case JavaTypes.COLLECTION: @@ -1416,6 +1417,7 @@ case JavaTypes.MAP: case JavaTypes.ARRAY: case JavaTypes.DATE: + case JavaTypes.SQL_DATE: case JavaTypes.CALENDAR: case JavaTypes.OBJECT: mutate = Boolean.TRUE; @@ -1534,6 +1536,7 @@ switch (fmd.getTypeCode()) { case JavaTypes.DATE: + case JavaTypes.SQL_DATE: if (fmd.getDeclaredType() == java.sql.Date.class) return new java.sql.Date(System.currentTimeMillis()); if (fmd.getDeclaredType() == java.sql.Timestamp.class) @@ -1559,6 +1562,7 @@ switch (fmd.getDeclaredTypeCode()) { case JavaTypes.DATE: + case JavaTypes.SQL_DATE: return mgr.newDateProxy(fmd.getDeclaredType()); case JavaTypes.CALENDAR: return mgr.newCalendarProxy(fmd.getDeclaredType(), Index: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (working copy) @@ -57,19 +57,21 @@ import org.apache.openjpa.meta.JavaTypes; import org.apache.openjpa.meta.MetaDataRepository; import org.apache.openjpa.meta.ValueStrategies; -import org.apache.openjpa.util.GeneralException; -import org.apache.openjpa.util.InternalException; import org.apache.openjpa.util.ByteId; import org.apache.openjpa.util.CharId; import org.apache.openjpa.util.DateId; +import org.apache.openjpa.util.GeneralException; import org.apache.openjpa.util.Id; import org.apache.openjpa.util.IntId; +import org.apache.openjpa.util.InternalException; import org.apache.openjpa.util.LongId; import org.apache.openjpa.util.ObjectId; +import org.apache.openjpa.util.OpenJPAException; import org.apache.openjpa.util.ShortId; +import org.apache.openjpa.util.SqlDateId; import org.apache.openjpa.util.StringId; -import org.apache.openjpa.util.OpenJPAException; import org.apache.openjpa.util.UserException; + import serp.bytecode.BCClass; import serp.bytecode.BCField; import serp.bytecode.BCMethod; @@ -1677,6 +1679,12 @@ code.invokevirtual().setMethod(DateId.class, "getId", Date.class, null); break; + case JavaTypes.SQL_DATE: + code.aload().setLocal(oid); + code.checkcast().setType(SqlDateId.class); + code.invokevirtual().setMethod(SqlDateId.class, "getId", + Date.class, null); + break; case JavaTypes.STRING: code.aload().setLocal(oid); code.checkcast().setType(StringId.class); @@ -3164,6 +3172,7 @@ case JavaTypes.MAP: case JavaTypes.OBJECT: case JavaTypes.CALENDAR: + case JavaTypes.SQL_DATE: // if (sm != null) // sm.proxyDetachedDeserialized (); loadManagedInstance(code, false); Index: openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java (working copy) @@ -76,7 +76,8 @@ public static final int PC_UNTYPED = 27; public static final int CALENDAR = 28; public static final int OID = 29; - + public static final int SQL_DATE = 30; + private static final Localizer _loc = Localizer.forPackage(JavaTypes.class); private static final Map _typeCodes = new HashMap(); @@ -92,7 +93,7 @@ _typeCodes.put(Long.class, Numbers.valueOf(LONG_OBJ)); _typeCodes.put(Short.class, Numbers.valueOf(SHORT_OBJ)); _typeCodes.put(Date.class, Numbers.valueOf(DATE)); - _typeCodes.put(java.sql.Date.class, Numbers.valueOf(DATE)); + _typeCodes.put(java.sql.Date.class, Numbers.valueOf(SQL_DATE)); _typeCodes.put(java.sql.Timestamp.class, Numbers.valueOf(DATE)); _typeCodes.put(java.sql.Time.class, Numbers.valueOf(DATE)); _typeCodes.put(BigInteger.class, Numbers.valueOf(BIGINTEGER)); @@ -279,6 +280,11 @@ if (val instanceof String) return new Date(val.toString()); return val; + case SQL_DATE: + if(val instanceof String) + return new java.sql.Date( + new Date(val.toString()).getTime()); + return val; case DOUBLE_OBJ: if (val instanceof Double) return val; Index: openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java (working copy) @@ -50,11 +50,12 @@ import org.apache.openjpa.util.LongId; import org.apache.openjpa.util.MetaDataException; import org.apache.openjpa.util.ObjectId; -import org.apache.openjpa.util.OpenJPAException; import org.apache.openjpa.util.OpenJPAId; import org.apache.openjpa.util.ShortId; +import org.apache.openjpa.util.SqlDateId; import org.apache.openjpa.util.StringId; import org.apache.openjpa.util.UnsupportedException; + import serp.util.Strings; /** @@ -456,6 +457,9 @@ case JavaTypes.DATE: _objectId = DateId.class; break; + case JavaTypes.SQL_DATE: + _objectId = SqlDateId.class; + break; case JavaTypes.OID: case JavaTypes.OBJECT: _objectId = ObjectId.class; Index: openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java (working copy) @@ -173,6 +173,8 @@ return obj; case JavaTypes.DATE: return ((Date) obj).clone(); + case JavaTypes.SQL_DATE: + return ((java.sql.Date) obj).clone(); case JavaTypes.LOCALE: return ((Locale) obj).clone(); default: Index: openjpa-kernel/src/main/java/org/apache/openjpa/util/SqlDateId.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/util/SqlDateId.java (revision 0) +++ openjpa-kernel/src/main/java/org/apache/openjpa/util/SqlDateId.java (revision 0) @@ -0,0 +1,74 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openjpa.util; + +import java.sql.Date; + +/** + * {@link OpenJPAId} subclass appropriate for java.sql.Date fields. + * + * Heavily based on org.apache.openjpa.util.DateId + */ +public class SqlDateId extends OpenJPAId { + /** + * Generated serialVersionUID. + */ + private static final long serialVersionUID = -192284403528002859L; + + private final Date key; + + public SqlDateId(Class cls, String key) { + this(cls, new Date(Long.parseLong(key))); + } + + public SqlDateId(Class cls, Date key) { + super(cls); + this.key = key == null ? new Date(0) : key; + } + + public SqlDateId(Class cls, java.util.Date key) { + this(cls, new Date(key.getTime())); + } + + public SqlDateId(Class cls, java.sql.Timestamp key) { + this(cls, new Date(key.getTime())); + } + + public SqlDateId(Class cls, Date key, boolean subs) { + super(cls, subs); + this.key = key == null ? new Date(0) : key; + } + + public Date getId() { + return key; + } + + public Object getIdObject() { + return getId(); + } + + public String toString() { + return Long.toString(key.getTime()); + } + + protected int idHash() { + return key.hashCode(); + } + + protected boolean idEquals(OpenJPAId o) { + return key.equals(((SqlDateId) o).key); + } +} Property changes on: openjpa-kernel/src/main/java/org/apache/openjpa/util/SqlDateId.java ___________________________________________________________________ Name: svn:eol-style + native Index: openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java (revision 518719) +++ openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java (working copy) @@ -143,6 +143,9 @@ return new StringId(meta.getDescribedType(), (String) val); case JavaTypes.DATE: return new DateId(meta.getDescribedType(), (Date) val); + case JavaTypes.SQL_DATE: + return new SqlDateId(meta.getDescribedType(), + (java.sql.Date) val); case JavaTypes.OID: case JavaTypes.OBJECT: return new ObjectId(meta.getDescribedType(), val); Index: openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingSerializer.java =================================================================== --- openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingSerializer.java (revision 518719) +++ openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingSerializer.java (working copy) @@ -427,7 +427,8 @@ */ private TemporalType getTemporal(FieldMapping field) { if (field.getDeclaredTypeCode() != JavaTypes.DATE - && field.getDeclaredTypeCode() != JavaTypes.CALENDAR) + && field.getDeclaredTypeCode() != JavaTypes.CALENDAR + && field.getDeclaredTypeCode() != JavaTypes.SQL_DATE) return null; DBDictionary dict = ((JDBCConfiguration) getConfiguration()) Index: openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java =================================================================== --- openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java (revision 518719) +++ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java (working copy) @@ -166,6 +166,7 @@ case JavaTypes.BIGDECIMAL: case JavaTypes.BIGINTEGER: case JavaTypes.DATE: + case JavaTypes.SQL_DATE: return BASIC; case JavaTypes.OBJECT: if (Enum.class.isAssignableFrom(type))