You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/07/29 15:08:46 UTC

git commit: ISIS-479: further fixes for joda dates

Updated Branches:
  refs/heads/master eef0cb94a -> 719f4a82c


ISIS-479: further fixes for joda dates


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

Branch: refs/heads/master
Commit: 719f4a82c41de71bff0ea2697fef2c73299ef96e
Parents: eef0cb9
Author: Dan Haywood <da...@apache.org>
Authored: Mon Jul 29 14:05:01 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Mon Jul 29 14:05:01 2013 +0100

----------------------------------------------------------------------
 .../domainobjects/JsonValueEncoder.java         | 54 ++++++++++++-
 component/viewer/restfulobjects/tck/pom.xml     |  2 +-
 ...henArgsValid_thenMultiplePropertyUpdate.java | 81 ++++++++++++++++++--
 .../core/tck/dom/scalars/JodaValuedEntity.java  | 20 ++++-
 .../scalars/JodaValuedEntityFixture.java        |  2 +
 5 files changed, 150 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/719f4a82/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index 7a6a9a0..d483b97 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -103,6 +103,16 @@ public final class JsonValueEncoder {
     }
 
     static {
+        putConverter(new JsonValueConverter(null, "string", String.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isString()) {
+                    return adapterFor(repr.asString());
+                } 
+                return null;
+            }
+        });
+
         putConverter(new JsonValueConverter(null, "boolean", boolean.class, Boolean.class){
             @Override
             public ObjectAdapter asAdapter(JsonRepresentation repr) {
@@ -297,6 +307,10 @@ public final class JsonValueEncoder {
                 }
                 return null;
             }
+            @Override
+            public void appendValueAndFormat(ObjectAdapter objectAdapter, JsonRepresentation repr) {
+                super.appendValueAndFormat(objectAdapter, repr);
+            }
         });
 
         putConverter(new JsonValueConverter("date", "jodalocaldate", LocalDate.class){
@@ -374,6 +388,44 @@ public final class JsonValueEncoder {
             }
         });
 
+        putConverter(new JsonValueConverter("date-time", "jodadatetime", DateTime.class){
+            
+            final List<DateTimeFormatter> formatters = Arrays.asList(
+                    JsonRepresentation.yyyyMMddTHHmmssZ, 
+                    DateTimeFormat.forPattern("yyyyMMdd'T'HHmmssZ"), 
+                    ISODateTimeFormat.basicDateTimeNoMillis(),
+                    ISODateTimeFormat.basicDateTime()
+                    );
+            
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isString()) {
+                    final String dateStr = repr.asString();
+                    for (DateTimeFormatter formatter : formatters) {
+                        try {
+                            final DateTime parsedDate = formatter.parseDateTime(dateStr);
+                            return adapterFor(parsedDate);
+                        } catch (IllegalArgumentException ex) {
+                            // fall through
+                        }
+                    }
+                }
+                return null;
+            }
+
+            @Override
+            public void appendValueAndFormat(ObjectAdapter objectAdapter, JsonRepresentation repr) {
+                final Object obj = unwrap(objectAdapter); 
+                if(obj instanceof DateTime) {
+                    final DateTime date = (DateTime) obj;
+                    final String dateStr = formatters.get(0).print(date.toDateTime());
+                    append(repr, dateStr, format, xIsisFormat);
+                } else {
+                    append(repr, obj, format, xIsisFormat);
+                }
+            }
+        });
+
         putConverter(new JsonValueConverter("date", "javautildate", java.util.Date.class){
             
             final List<DateTimeFormatter> formatters = Arrays.asList(
@@ -591,7 +643,7 @@ public final class JsonValueEncoder {
                 throw new IllegalArgumentException("objectSpec expected to have EncodableFacet");
             }
             Object value = objectAdapter != null? encodableFacet.toEncodedString(objectAdapter): NullNode.getInstance();
-            append(repr, value, "decimal", "bigdecimal");
+            append(repr, value, "string", "string");
         }
     }
     

http://git-wip-us.apache.org/repos/asf/isis/blob/719f4a82/component/viewer/restfulobjects/tck/pom.xml
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/tck/pom.xml b/component/viewer/restfulobjects/tck/pom.xml
index c1fcf09..32e24bf 100644
--- a/component/viewer/restfulobjects/tck/pom.xml
+++ b/component/viewer/restfulobjects/tck/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.isis.core</groupId>
         <artifactId>isis-core-tck</artifactId>
-        <version>1.2.0</version>
+        <version>1.3.0-SNAPSHOT</version>
         <relativePath>../../../../core/tck/pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/isis/blob/719f4a82/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
index 70b2455..a5051a7 100644
--- a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
+++ b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
@@ -31,6 +31,9 @@ import javax.ws.rs.core.Response.Status.Family;
 
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
 import org.joda.time.format.ISODateTimeFormat;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -65,7 +68,6 @@ public class Put_whenArgsValid_thenMultiplePropertyUpdate {
         domainObjectResource = client.getDomainObjectResource();
     }
 
-    @Ignore
     @Test
     public void primitivePropertiesUpdated() throws Exception {
         
@@ -185,7 +187,8 @@ public class Put_whenArgsValid_thenMultiplePropertyUpdate {
         argRepr.mapPut("javaUtilDateProperty.value", asIso(d));
         argRepr.mapPut("myEnum.value", e);
         argRepr.mapPut("stringProperty.value", s);
-        RestfulResponse<JsonRepresentation> result = client.follow(updateLink, argRepr);
+        
+        final RestfulResponse<JsonRepresentation> result = client.follow(updateLink, argRepr);
         assertThat(result.getStatus(), is(HttpStatusCode.OK));
         
         final DomainObjectRepresentation afterResp = result.getEntity().as(DomainObjectRepresentation.class);
@@ -202,16 +205,84 @@ public class Put_whenArgsValid_thenMultiplePropertyUpdate {
         
     }
 
+    @Test
+    public void jodaPropertiesUpdated() throws Exception {
+        
+        final DomainObjectRepresentation domainObjectRepr = getObjectRepr("JODA", "73");
+        
+        final LinkRepresentation updateLink = domainObjectRepr.getLinkWithRel(Rel.UPDATE);
+        
+        final JsonRepresentation argRepr = updateLink.getArguments();
+        
+        // {
+        //   localDateProperty: {
+        //     value: "2008-03-21",
+        //     format: "date",
+        //     x-isis-format: "jodalocaldate"
+        //   },
+        //   localDateTimeProperty: {
+        //     value: "2009-04-29T13:45:22+0100",
+        //     format: "date-time",
+        //     x-isis-format: "jodalocaldatetime"
+        //   },
+        //   dateTimeProperty: {
+        //     value: "2010-03-31T09:50:43",
+        //     format: "date-time",
+        //     x-isis-format: "jodalocaldatetime"
+        //   },
+        //   stringProperty: {
+        //     value: null,
+        //     x-isis-format: "string"
+        //   }
+        // }
+        
+        final LocalDate ld = new LocalDate(2013,5,1);
+        final LocalDateTime ldt = new LocalDateTime(2013,2,1,14,15,0);
+        final DateTime dt = new DateTime(2013,2,1,14,15,0);
+        final String s = "New string";
+        
+        argRepr.mapPut("localDateProperty.value", asIsoNoT(ld.toDate()));
+        argRepr.mapPut("localDateTimeProperty.value", asIso(ldt.toDate()));
+        argRepr.mapPut("dateTimeProperty.value", asIso(dt.toDate()));
+        argRepr.mapPut("stringProperty.value", s);
+
+        final RestfulResponse<JsonRepresentation> result = client.follow(updateLink, argRepr);
+        assertThat(result.getStatus(), is(HttpStatusCode.OK));
+        
+        final DomainObjectRepresentation afterResp = result.getEntity().as(DomainObjectRepresentation.class);
+        
+        assertThat(afterResp.getProperty("localDateProperty").getDate("value"), is(ld.toDate()));
+        assertThat(afterResp.getProperty("localDateTimeProperty").getDateTime("value"), is(ldt.toDate()));
+        assertThat(afterResp.getProperty("dateTimeProperty").getDateTime("value"), is(dt.toDate()));
+        assertThat(afterResp.getProperty("stringProperty").getString("value"), is(s));
+    }
+    
     private static String asIso(final java.util.Date d) {
-        return ISODateTimeFormat.basicDateTimeNoMillis().print(new org.joda.time.DateTime(d.getTime()));
+        final org.joda.time.DateTime dt = new org.joda.time.DateTime(d.getTime());
+        return asIso(dt);
+    }
+
+    private static String asIso(final org.joda.time.DateTime dt) {
+        return ISODateTimeFormat.basicDateTimeNoMillis().print(dt);
     }
     
+    
     private static String asIsoNoT(final java.util.Date d) {
-        return ISODateTimeFormat.basicDate().print(new org.joda.time.DateTime(d.getTime()));
+        final org.joda.time.DateTime dt = new org.joda.time.DateTime(d.getTime());
+        return asIsoNoT(dt);
+    }
+
+    private static String asIsoNoT(final org.joda.time.DateTime dt) {
+        return ISODateTimeFormat.basicDate().print(dt);
     }
     
     private static String asIsoOnlyT(final java.util.Date d) {
-        return ISODateTimeFormat.basicTime().print(new org.joda.time.DateTime(d.getTime()));
+        final org.joda.time.DateTime dt = new org.joda.time.DateTime(d.getTime());
+        return asIsoOnlyT(dt);
+    }
+
+    private static String asIsoOnlyT(final org.joda.time.DateTime dt) {
+        return ISODateTimeFormat.basicTime().print(dt);
     }
 
     private DomainObjectRepresentation getObjectRepr(final String domainType, final String instanceId) throws JsonParseException, JsonMappingException, IOException {

http://git-wip-us.apache.org/repos/asf/isis/blob/719f4a82/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/scalars/JodaValuedEntity.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/scalars/JodaValuedEntity.java b/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/scalars/JodaValuedEntity.java
index 70a5e6d..df52936 100644
--- a/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/scalars/JodaValuedEntity.java
+++ b/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/scalars/JodaValuedEntity.java
@@ -23,6 +23,7 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Date;
 
+import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 
@@ -51,8 +52,8 @@ public class JodaValuedEntity extends AbstractDomainObject {
         return stringProperty;
     }
 
-    public void setStringProperty(final String description) {
-        this.stringProperty = description;
+    public void setStringProperty(final String stringProperty) {
+        this.stringProperty = stringProperty;
     }
 
     // }}
@@ -85,6 +86,21 @@ public class JodaValuedEntity extends AbstractDomainObject {
         this.localDateTimeProperty = localDateTimeProperty;
     }
     // }}
+    
+    
+    // {{ DateTimeProperty
+    private DateTime dateTimeProperty;
+    
+    @Optional
+    @MemberOrder(sequence = "1")
+    public DateTime getDateTimeProperty() {
+        return dateTimeProperty;
+    }
+    
+    public void setDateTimeProperty(final DateTime dateTimeProperty) {
+        this.dateTimeProperty = dateTimeProperty;
+    }
+    // }}
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/719f4a82/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java b/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
index 720b847..8ca8b37 100644
--- a/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
+++ b/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.tck.fixture.scalars;
 
+import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 
@@ -41,6 +42,7 @@ public class JodaValuedEntityFixture extends AbstractFixture {
         final JodaValuedEntity jve = jodaValuesEntityRepository.newEntity();
         jve.setLocalDateProperty(new LocalDate(2008,3,21));
         jve.setLocalDateTimeProperty(new LocalDateTime(2009, 4, 29, 13, 45, 22));
+        jve.setDateTimeProperty(new DateTime(2010, 3, 31, 9, 50, 43));
         return jve;
     }