You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ke...@apache.org on 2011/04/01 20:15:17 UTC

svn commit: r1087836 - in /incubator/isis/trunk/runtimes/dflt/objectstores/sql: impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/ tests-common/src/main/java/org/ap...

Author: kevin
Date: Fri Apr  1 18:15:16 2011
New Revision: 1087836

URL: http://svn.apache.org/viewvc?rev=1087836&view=rev
Log:
Hopefully found workaround to bypass java.util.Date's dependence on local time-zone. Tests all seem to work against +ve and -ve time-zones wrt GMT.

Modified:
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcDateMapper.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java?rev=1087836&r1=1087835&r2=1087836&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java Fri Apr  1 18:15:16 2011
@@ -23,17 +23,17 @@ package org.apache.isis.runtimes.dflt.ob
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.log4j.Logger;
+
+import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcGeneralValueMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMappingFactory;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.ObjectReferenceMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.ObjectReferenceMappingFactory;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
-import org.apache.log4j.Logger;
 
 
 public class FieldMappingLookup {
@@ -52,12 +52,12 @@ public class FieldMappingLookup {
             factory = new JdbcGeneralValueMapper.Factory("VARCHAR(65)");
             addFieldMappingFactory(spec, factory);
             return factory.createFieldMapping(field);
-        } else if (true /* TODO test for reference */) {
+        } else {//if (true /* TODO test for reference */) {
             factory = referenceFieldMappingfactory;
             addFieldMappingFactory(spec, factory);
             return factory.createFieldMapping(field);
-        } else {
-            throw new IsisException("No mapper for " + spec + " (no default mapper)");
+        //} else {
+            //throw new IsisException("No mapper for " + spec + " (no default mapper)");
         }
     }
 
@@ -72,16 +72,16 @@ public class FieldMappingLookup {
         } else if (spec.isEncodeable()) {
             // TODO add generic encodeable mapping
             throw new NotYetImplementedException();
-        } else if (true /* TODO test for reference */) {
+        } else {// if (true /* TODO test for reference */) {
             factory = objectReferenceMappingfactory;
          //   add(spec, factory);
             return factory.createReferenceMapping(columnName, spec); // TODO: here
-        } else {
-            throw new IsisException("No mapper for " + spec + " (no default mapper)");
+        //} else {
+        //    throw new IsisException("No mapper for " + spec + " (no default mapper)");
         }
     }
     
-    public void addFieldMappingFactory(final Class valueType, final FieldMappingFactory mapper) {
+    public void addFieldMappingFactory(final Class<?> valueType, final FieldMappingFactory mapper) {
         ObjectSpecification spec = IsisContext.getSpecificationLoader().loadSpecification(valueType);
         addFieldMappingFactory(spec, mapper);
     }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java?rev=1087836&r1=1087835&r2=1087836&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java Fri Apr  1 18:15:16 2011
@@ -23,6 +23,7 @@ package org.apache.isis.runtimes.dflt.ob
 import java.util.Date;
 
 
+
 public interface Results {
 
     void close();
@@ -35,7 +36,9 @@ public interface Results {
 
     boolean next();
 
-    Date getDate(String lastActivityDateColumn);
+    Date getJavaDateOnly(String lastActivityDateColumn);
+    Date getJavaDateTime(String lastActivityDateColumn);
 
     Object getObject(String column);
+
 }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java?rev=1087836&r1=1087835&r2=1087836&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java Fri Apr  1 18:15:16 2011
@@ -97,7 +97,7 @@ public class VersionMapping {
     public Version getLock(Results rs) {
         long number = rs.getLong(versionColumn);
         String user = rs.getString(lastActivityUserColumn);
-        Date time = rs.getDate(lastActivityDateColumn);
+        Date time = rs.getJavaDateTime(lastActivityDateColumn);
         Version version = new SerialNumberVersion(number, user, time);
         return version;
     }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcDateMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcDateMapper.java?rev=1087836&r1=1087835&r2=1087836&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcDateMapper.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcDateMapper.java Fri Apr  1 18:15:16 2011
@@ -23,6 +23,7 @@ package org.apache.isis.runtimes.dflt.ob
 import org.joda.time.LocalDate;
 
 import org.apache.isis.applib.ApplicationException;
+import org.apache.isis.applib.PersistFailedException;
 import org.apache.isis.applib.value.Date;
 import org.apache.isis.core.commons.exceptions.IsisApplicationException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -74,26 +75,25 @@ public class JdbcDateMapper extends Abst
         java.util.Date javaDateValue;
         
         String columnName = Sql.sqlFieldName(field.getId());
-        String encodedValue = (String) rs.getString(columnName);
-        
-        javaDateValue = rs.getDate(columnName);
-
+        javaDateValue = rs.getJavaDateOnly(columnName);
         
         ObjectAdapter restoredValue;
         if (javaDateValue == null) {
             restoredValue = null;
         } else {
-            if (field.getSpecification().getFullIdentifier() == "java.sql.Date"){
-                // 2011-04-08 = 1302220800000L
+            final Class<?> correspondingClass = field.getSpecification().getCorrespondingClass();
+            if (correspondingClass == java.util.Date.class || correspondingClass == java.sql.Date.class){
+                // 2011-04-08 = 1270684800000
                 restoredValue =  IsisContext.getPersistenceSession().getAdapterManager(). 
-                    adapterFor(javaDateValue);
-            } else if (field.getSpecification().getFullIdentifier() == Date.class.getCanonicalName()){
-                // 2010-3-5 = 1267747200000 millis
-                Date newDateValue = new Date(javaDateValue.getTime());
+                adapterFor(javaDateValue);
+            } else if (correspondingClass == Date.class){
+                // 2010-03-05 = 1267747200000  
+                Date dateValue;
+                dateValue = new Date(javaDateValue);
                 restoredValue =  IsisContext.getPersistenceSession().getAdapterManager(). 
-                    adapterFor(newDateValue);
+                    adapterFor(dateValue);
             } else {
-                throw new ApplicationException("Unhandled date type: "+field.getSpecification().getFullIdentifier());
+                throw new PersistFailedException("Unhandled date type: "+correspondingClass.getCanonicalName());
             }
         }
         ((OneToOneAssociation) field).initAssociation(object, restoredValue);
@@ -102,20 +102,6 @@ public class JdbcDateMapper extends Abst
     @Override
     public ObjectAdapter setFromDBColumn(final String encodedValue, final ObjectAssociation field) {
         throw new ApplicationException("Should never get called!");
-        /*
-        String valueString, year, month, day;
-        if (encodedValue.length() > 9) {
-            // convert date to yyyymmdd
-            year = encodedValue.substring(0, 4);
-            month = encodedValue.substring(5, 7);
-            day = encodedValue.substring(8, 10);
-            valueString = year + month + day;
-        } else {
-            valueString = encodedValue;
-        }
-        // Caution: ValueSemanticsProviderAbstractTemporal explicitly sets the timezone to UTC
-        return field.getSpecification().getFacet(EncodableFacet.class).fromEncodedString(valueString);
-        */
     }
 
     public String columnType() {

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java?rev=1087836&r1=1087835&r2=1087836&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java Fri Apr  1 18:15:16 2011
@@ -23,9 +23,10 @@ package org.apache.isis.runtimes.dflt.ob
 import java.sql.CallableStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Calendar;
 import java.util.Date;
-import java.util.TimeZone;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 
 import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
 import org.apache.isis.runtimes.dflt.objectstores.sql.SqlObjectStoreException;
@@ -80,9 +81,24 @@ public class JdbcResults implements Resu
         }
     }
 
-    public Date getDate(final String columnName) {
+    public Date getJavaDateOnly(final String columnName) {
+        try {
+            // 2010-03-05 = 1267747200000
+            // 2010-04-08 = 1270684800000
+            // This is really painful! Java refuses to create java.util.Date in UTC!
+            // It creates java.util.Dates in Local time-zone, but assumes the DB date is UTC.
+            String string = set.getString(columnName); 
+            final DateTime utcDate = new DateTime(string, DateTimeZone.UTC);
+            final java.sql.Date date = new java.sql.Date(utcDate.getMillis());
+            return date;
+        } catch (SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    public java.util.Date getJavaDateTime(String columnName){
         try {
-            return set.getDate(columnName, Calendar.getInstance(TimeZone.getTimeZone("UTC")));
+            return set.getDate(columnName);
         } catch (SQLException e) {
             throw new SqlObjectStoreException(e);
         }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java?rev=1087836&r1=1087835&r2=1087836&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java Fri Apr  1 18:15:16 2011
@@ -69,7 +69,6 @@ public abstract class SqlIntegrationTest
     private static final Logger LOG = Logger.getLogger(SqlIntegrationTestCommon.class);
     
     
-    //private static final TimeZone UTC_TIME_ZONE;
     //private static final TimeZone GMTm2_TIME_ZONE;
     
     // Helper values
@@ -80,8 +79,12 @@ public abstract class SqlIntegrationTest
          * 
         // For testing -ve offset timezone local regions.
         GMTm2_TIME_ZONE = TimeZone.getTimeZone("GMT-0200");
+        //GMTm2_TIME_ZONE = TimeZone.getTimeZone("UTC");
         TimeZone.setDefault(GMTm2_TIME_ZONE);
+        *
+         */
         
+        /*
         TimeZone timeZone = TimeZone.getTimeZone("Etc/UTC");
         if (timeZone == null) {
             timeZone = TimeZone.getTimeZone("UTC");
@@ -98,12 +101,13 @@ public abstract class SqlIntegrationTest
         cal.set(Calendar.MONTH, 4-1);
         cal.set(Calendar.DAY_OF_MONTH, 8);
         */
-        // 2011-4-8 = 1302220800000
-        sqlDate = new java.sql.Date( 1302220800000L);// cal.getTimeInMillis()); 
+        // 2011-4-8 = 1270684800000
+        Date date20100308 = new Date(2010, 4, 8);
+        sqlDate = new java.sql.Date( date20100308.getMillisSinceEpoch());
     }
 	
     //{{ Setup
-	private static final Date applibDate = new Date(2010, 3, 5);
+	private static final Date applibDate = new Date(2010, 3, 5); // 2010-03-05 = 1267747200000
 	private static final DateTime dateTime = new DateTime(2010, 3, 5, 1, 23);
 	private static final TimeStamp timeStamp = new TimeStamp(
 			dateTime.longValue());
@@ -347,10 +351,10 @@ public abstract class SqlIntegrationTest
         LOG.log(Level.INFO, "sqlDataClass.getDate().getTime() as Long: "+sqlDataClass.getDate().getMillisSinceEpoch());
         
         if (!applibDate.isEqualTo(sqlDataClass.getDate())){
-            //fail("Applib date: Test '2011-3-5', expected " + applibDate.toString() + ", but got "
-            //    + sqlDataClass.getDate().toString()+". Check log for more info.");
-            LOG.log(Level.INFO, "Applib date: Test '2011-3-5', expected " + applibDate.toString() + ", but got "
+            fail("Applib date: Test '2011-3-5', expected " + applibDate.toString() + ", but got "
                 + sqlDataClass.getDate().toString()+". Check log for more info.");
+            //LOG.log(Level.INFO, "Applib date: Test '2011-3-5', expected " + applibDate.toString() + ", but got "
+            //    + sqlDataClass.getDate().toString()+". Check log for more info.");
         } else {
             LOG.log(Level.INFO, "SQL applib.value.date: test passed! Woohoo!");
         }
@@ -379,11 +383,10 @@ public abstract class SqlIntegrationTest
         LOG.log(Level.INFO, "sqlDataClass.getSqlDate().getTime() as Long:"+sqlDataClass.getSqlDate().getTime());
 		
         if (sqlDate.compareTo(sqlDataClass.getSqlDate()) != 0){
-            //TODO: Must still confirm about the timezone shift.
-            //fail("SQL date: Test '2011-4-8', expected " + sqlDate.toString() + ", but got "
-             //   + sqlDataClass.getSqlDate().toString() +". Check log for more info.");
-            LOG.log(Level.INFO, "SQL date: Test '2011-4-8', expected " + sqlDate.toString() + ", and got "
-                + sqlDataClass.getSqlDate().toString() +". Check log for more info.");
+            fail("SQL date: Test '2011-4-8', expected " + sqlDate.toString() + ", but got "
+               + sqlDataClass.getSqlDate().toString() +". Check log for more info.");
+            //LOG.log(Level.INFO, "SQL date: Test '2011-4-8', expected " + sqlDate.toString() + ", and got "
+            //    + sqlDataClass.getSqlDate().toString() +". Check log for more info.");
         } else {
             LOG.log(Level.INFO, "SQL date: test passed! Woohoo!");
         }
@@ -401,17 +404,19 @@ public abstract class SqlIntegrationTest
          *  
          */
         /*
+         * *
         SqlDataClass sqlDataClass = SqlIntegrationTestSingleton.getPerson();
         
         DateTime dateTime = sqlDataClass.getDateTime(); // new DateTime(2010, 3, 5, 1, 23);
         Date date = sqlDataClass.getDate(); // new Date(2010, 3, 5);
-        java.sql.Date sqlDate = sqlDataClass.getSqlDate(); // "2010-03-05"
-
+        
+        //java.sql.Date sqlDate = sqlDataClass.getSqlDate(); // "2010-03-05"
         //assertTrue("dateTime's value ("+dateTime.dateValue()+
-        //    ") should be after java.sql.date's ("+ date +")", dateTime.dateValue().after(sqlDate));
+        //    ") should be after java.sql.date's ("+ sqlDate +")", dateTime.dateValue().after(sqlDate));
 
-        //assertTrue("dateTime's value ("+dateTime.dateValue()+
-        //    ") should be after date's ("+ date +")", dateTime.dateValue().after(date.dateValue()));
+        assertTrue("dateTime's value ("+dateTime.dateValue()+
+            ") should be after date's ("+ date +")", dateTime.dateValue().after(date.dateValue()));
+        *
         */
     }