Improved menu-item support. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/c7985031 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/c7985031 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/c7985031
Branch: refs/heads/master Commit: c798503185fb4e82e55a52f9814d05604195ec98 Parents: 24209d4 Author: JamesBognar <[email protected]> Authored: Mon Jul 31 18:48:19 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Mon Jul 31 18:48:19 2017 -0400 ---------------------------------------------------------------------- .../juneau/jena/RdfSerializerSession.java | 12 +- .../apache/juneau/dto/html5/Html5ComboTest.java | 42 +- .../apache/juneau/transforms/DateSwapTest.java | 2 +- .../juneau/transforms/LocalizedDatesTest.java | 23 +- .../java/org/apache/juneau/BeanContext.java | 4 +- .../org/apache/juneau/BeanPropertyMeta.java | 52 +- .../main/java/org/apache/juneau/ObjectMap.java | 16 +- .../apache/juneau/dto/html5/HtmlBuilder.java | 8 +- .../juneau/dto/html5/HtmlElementMixed.java | 14 +- .../org/apache/juneau/internal/ClassUtils.java | 31 +- .../org/apache/juneau/internal/DateUtils.java | 7 + .../juneau/serializer/SerializerSession.java | 18 +- .../org/apache/juneau/transform/MapSwap.java | 6 +- .../org/apache/juneau/transform/PojoSwap.java | 8 +- .../org/apache/juneau/transform/StringSwap.java | 6 +- .../apache/juneau/transforms/CalendarSwap.java | 473 +++++++------ .../org/apache/juneau/transforms/DateSwap.java | 442 ++++++------ .../org/apache/juneau/utils/CalendarUtils.java | 697 +++++++++++++++++++ juneau-core/src/main/javadoc/overview.html | 21 + .../juneau/examples/rest/PetStoreResource.java | 91 ++- .../apache/juneau/examples/rest/PetStore.json | 14 +- .../java/org/apache/juneau/rest/RestConfig.java | 5 +- .../org/apache/juneau/rest/RestContext.java | 7 +- .../juneau/rest/converters/Traversable.java | 5 +- .../org/apache/juneau/rest/widget/Tooltip.java | 97 +++ .../org/apache/juneau/rest/styles/devops.css | 42 +- .../org/apache/juneau/rest/styles/light.css | 42 +- .../org/apache/juneau/rest/styles/original.css | 41 +- .../juneau/rest/widget/MenuItemWidget.css | 2 +- .../apache/juneau/rest/widget/QueryMenuItem.css | 32 - 30 files changed, 1678 insertions(+), 582 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java index 3e8f1ba..ad2c663 100644 --- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java +++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java @@ -182,7 +182,7 @@ public final class RdfSerializerSession extends WriterSerializerSession { } private RDFNode serializeAnything(Object o, boolean isURI, ClassMeta<?> eType, - String attrName, BeanPropertyMeta bpm, Resource parentResource) throws SerializeException { + String attrName, BeanPropertyMeta bpm, Resource parentResource) throws Exception { Model m = model; ClassMeta<?> aType = null; // The actual type @@ -313,7 +313,7 @@ public final class RdfSerializerSession extends WriterSerializerSession { return getUriResolver().resolve(s); } - private void serializeMap(Map m, Resource r, ClassMeta<?> type) throws SerializeException { + private void serializeMap(Map m, Resource r, ClassMeta<?> type) throws Exception { m = sort(m); @@ -334,7 +334,7 @@ public final class RdfSerializerSession extends WriterSerializerSession { } } - private void serializeBeanMap(BeanMap<?> m, Resource r, String typeName) throws SerializeException { + private void serializeBeanMap(BeanMap<?> m, Resource r, String typeName) throws Exception { List<BeanPropertyValue> l = m.getValues(isTrimNulls(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null); Collections.reverse(l); for (BeanPropertyValue bpv : l) { @@ -370,7 +370,7 @@ public final class RdfSerializerSession extends WriterSerializerSession { } - private Container serializeToContainer(Collection c, ClassMeta<?> type, Container list) throws SerializeException { + private Container serializeToContainer(Collection c, ClassMeta<?> type, Container list) throws Exception { ClassMeta<?> elementType = type.getElementType(); for (Object e : c) { @@ -380,7 +380,7 @@ public final class RdfSerializerSession extends WriterSerializerSession { return list; } - private RDFList serializeToList(Collection c, ClassMeta<?> type) throws SerializeException { + private RDFList serializeToList(Collection c, ClassMeta<?> type) throws Exception { ClassMeta<?> elementType = type.getElementType(); List<RDFNode> l = new ArrayList<RDFNode>(c.size()); for (Object e : c) { @@ -390,7 +390,7 @@ public final class RdfSerializerSession extends WriterSerializerSession { } private void serializeToMultiProperties(Collection c, ClassMeta<?> sType, - BeanPropertyMeta bpm, String attrName, Resource parentResource) throws SerializeException { + BeanPropertyMeta bpm, String attrName, Resource parentResource) throws Exception { ClassMeta<?> elementType = sType.getElementType(); for (Object e : c) { Namespace ns = null; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java index 9a74cd9..5ef24a7 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java @@ -770,27 +770,27 @@ public class Html5ComboTest extends ComboTest { option("One"), option("Two") ), - /* Json */ "{_type:'datalist',a:{id:'foo'},c:[{_type:'option',a:{value:'One'}},{_type:'option',a:{value:'Two'}}]}", - /* JsonT */ "{t:'datalist',a:{id:'foo'},c:[{t:'option',a:{value:'One'}},{t:'option',a:{value:'Two'}}]}", - /* JsonR */ "{\n\t_type: 'datalist',\n\ta: {\n\t\tid: 'foo'\n\t},\n\tc: [\n\t\t{\n\t\t\t_type: 'option',\n\t\t\ta: {\n\t\t\t\tvalue: 'One'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t_type: 'option',\n\t\t\ta: {\n\t\t\t\tvalue: 'Two'\n\t\t\t}\n\t\t}\n\t]\n}", - /* Xml */ "<datalist id='foo'><option value='One'/><option value='Two'/></datalist>", - /* XmlT */ "<datalist id='foo'><option value='One'/><option value='Two'/></datalist>", - /* XmlR */ "<datalist id='foo'>\n\t<option value='One'/>\n\t<option value='Two'/>\n</datalist>\n", - /* XmlNs */ "<datalist id='foo'><option value='One'/><option value='Two'/></datalist>", - /* Html */ "<datalist id='foo'><option value='One'></option><option value='Two'></option></datalist>", - /* HtmlT */ "<datalist id='foo'><option value='One'></option><option value='Two'></option></datalist>", - /* HtmlR */ "<datalist id='foo'>\n\t<option value='One'></option>\n\t<option value='Two'></option>\n</datalist>\n", - /* Uon */ "(_type=datalist,a=(id=foo),c=@((_type=option,a=(value=One)),(_type=option,a=(value=Two))))", - /* UonT */ "(t=datalist,a=(id=foo),c=@((t=option,a=(value=One)),(t=option,a=(value=Two))))", - /* UonR */ "(\n\t_type=datalist,\n\ta=(\n\t\tid=foo\n\t),\n\tc=@(\n\t\t(\n\t\t\t_type=option,\n\t\t\ta=(\n\t\t\t\tvalue=One\n\t\t\t)\n\t\t),\n\t\t(\n\t\t\t_type=option,\n\t\t\ta=(\n\t\t\t\tvalue=Two\n\t\t\t)\n\t\t)\n\t)\n)", - /* UrlEnc */ "_type=datalist&a=(id=foo)&c=@((_type=option,a=(value=One)),(_type=option,a=(value=Two)))", - /* UrlEncT */ "t=datalist&a=(id=foo)&c=@((t=option,a=(value=One)),(t=option,a=(value=Two)))", - /* UrlEncR */ "_type=datalist\n&a=(\n\tid=foo\n)\n&c=@(\n\t(\n\t\t_type=option,\n\t\ta=(\n\t\t\tvalue=One\n\t\t)\n\t),\n\t(\n\t\t_type=option,\n\t\ta=(\n\t\t\tvalue=Two\n\t\t)\n\t)\n)", - /* MsgPack */ "83A55F74797065A8646174616C697374A16181A26964A3666F6FA1639282A55F74797065A66F7074696F6EA16181A576616C7565A34F6E6582A55F74797065A66F7074696F6EA16181A576616C7565A354776F", - /* MsgPackT */ "83A174A8646174616C697374A16181A26964A3666F6FA1639282A174A66F7074696F6EA16181A576616C7565A34F6E6582A174A66F7074696F6EA16181A576616C7565A354776F", - /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:_type>datalist</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:id>foo</jp:id>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>option</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:value>One</jp:value>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>option</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:value>Two</jp:value>\n</jp:a>\n</rdf:li>\n</rdf:Seq>\n</jp:c>\n</rdf:Description>\n</rdf:RDF>\n", - /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:t>datalist</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:id>foo</jp:id>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>option</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:value>One</jp:value>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>option</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:value>Two</jp:value>\n</jp:a>\n</rdf:li>\n</rdf:Seq>\n</jp:c>\n</rdf:Description>\n</rdf:RDF>\n", - /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:_type>datalist</jp:_type>\n <jp:a rdf:parseType='Resource'>\n <jp:id>foo</jp:id>\n </jp:a>\n <jp:c>\n <rdf:Seq>\n <rdf:li rdf:parseType='Resource'>\n <jp:_type>option</jp:_type>\n <jp:a rdf:parseType='Resource'>\n <jp:value>One</jp:value>\n </jp:a>\n </rdf:li>\n <rdf:li rdf:parseType='Resource'>\n <jp:_type>option</jp:_type>\n <jp:a rdf:parseType='Resource'>\n <jp:value>Two</jp:value>\n </jp:a>\n </rdf:li>\n </rdf:Seq>\n </jp:c>\n </rdf:Description>\n</rdf:RDF>\n" + /* Json */ "{_type:'datalist',a:{id:'foo'},c:[{_type:'option',c:'One'},{_type:'option',c:'Two'}]}", + /* JsonT */ "{t:'datalist',a:{id:'foo'},c:[{t:'option',c:'One'},{t:'option',c:'Two'}]}", + /* JsonR */ "{\n\t_type: 'datalist',\n\ta: {\n\t\tid: 'foo'\n\t},\n\tc: [\n\t\t{\n\t\t\t_type: 'option',\n\t\t\tc: 'One'\n\t\t},\n\t\t{\n\t\t\t_type: 'option',\n\t\t\tc: 'Two'\n\t\t}\n\t]\n}", + /* Xml */ "<datalist id='foo'><option>One</option><option>Two</option></datalist>", + /* XmlT */ "<datalist id='foo'><option>One</option><option>Two</option></datalist>", + /* XmlR */ "<datalist id='foo'>\n\t<option>One</option>\n\t<option>Two</option>\n</datalist>\n", + /* XmlNs */ "<datalist id='foo'><option>One</option><option>Two</option></datalist>", + /* Html */ "<datalist id='foo'><option>One</option><option>Two</option></datalist>", + /* HtmlT */ "<datalist id='foo'><option>One</option><option>Two</option></datalist>", + /* HtmlR */ "<datalist id='foo'>\n\t<option>One</option>\n\t<option>Two</option>\n</datalist>\n", + /* Uon */ "(_type=datalist,a=(id=foo),c=@((_type=option,c=One),(_type=option,c=Two)))", + /* UonT */ "(t=datalist,a=(id=foo),c=@((t=option,c=One),(t=option,c=Two)))", + /* UonR */ "(\n\t_type=datalist,\n\ta=(\n\t\tid=foo\n\t),\n\tc=@(\n\t\t(\n\t\t\t_type=option,\n\t\t\tc=One\n\t\t),\n\t\t(\n\t\t\t_type=option,\n\t\t\tc=Two\n\t\t)\n\t)\n)", + /* UrlEnc */ "_type=datalist&a=(id=foo)&c=@((_type=option,c=One),(_type=option,c=Two))", + /* UrlEncT */ "t=datalist&a=(id=foo)&c=@((t=option,c=One),(t=option,c=Two))", + /* UrlEncR */ "_type=datalist\n&a=(\n\tid=foo\n)\n&c=@(\n\t(\n\t\t_type=option,\n\t\tc=One\n\t),\n\t(\n\t\t_type=option,\n\t\tc=Two\n\t)\n)", + /* MsgPack */ "83A55F74797065A8646174616C697374A16181A26964A3666F6FA1639282A55F74797065A66F7074696F6EA163A34F6E6582A55F74797065A66F7074696F6EA163A354776F", + /* MsgPackT */ "83A174A8646174616C697374A16181A26964A3666F6FA1639282A174A66F7074696F6EA163A34F6E6582A174A66F7074696F6EA163A354776F", + /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:_type>datalist</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:id>foo</jp:id>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>option</jp:_type>\n<jp:c>One</jp:c>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>option</jp:_type>\n<jp:c>Two</jp:c>\n</rdf:li>\n</rdf:Seq>\n</jp:c>\n</rdf:Description>\n</rdf:RDF>\n", + /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:t>datalist</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:id>foo</jp:id>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>option</jp:t>\n<jp:c>One</jp:c>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>option</jp:t>\n<jp:c>Two</jp:c>\n</rdf:li>\n</rdf:Seq>\n</jp:c>\n</rdf:Description>\n</rdf:RDF>\n", + /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:_type>datalist</jp:_type>\n <jp:a rdf:parseType='Resource'>\n <jp:id>foo</jp:id>\n </jp:a>\n <jp:c>\n <rdf:Seq>\n <rdf:li rdf:parseType='Resource'>\n <jp:_type>option</jp:_type>\n <jp:c>One</jp:c>\n </rdf:li>\n <rdf:li rdf:parseType='Resource'>\n <jp:_type>option</jp:_type>\n <jp:c>Two</jp:c>\n </rdf:li>\n </rdf:Seq>\n </jp:c>\n </rdf:Description>\n</rdf:RDF>\n" ) { @Override http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapTest.java b/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapTest.java index 482047a..e77652f 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapTest.java @@ -49,7 +49,7 @@ public class DateSwapTest { final DateSwap.ISO8601DT dateSwap = new DateSwap.ISO8601DT(); // this works final String sValue = data.getString("birthday"); - dateSwap.unswap(null, sValue, data.getBeanSession().getClassMeta(Date.class)); + dateSwap.unswap(BeanContext.DEFAULT.createSession(), sValue, data.getBeanSession().getClassMeta(Date.class)); // this does not work data.get(dateSwap, "birthday"); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java b/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java index 4dc9195..3964bca 100644 --- a/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java @@ -32,6 +32,20 @@ public class LocalizedDatesTest { testDate.setTimeInMillis(0); testDate.set(2001, 2, 3, 10, 11, 12); } + + private static TimeZone prevTimeZone; + + @BeforeClass + public static void before() { + prevTimeZone = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("GMT")); + } + + @AfterClass + public static void after() { + TimeZone.setDefault(prevTimeZone); + } + @Parameterized.Parameters public static Collection<Object[]> getParameters() { @@ -128,10 +142,11 @@ public class LocalizedDatesTest { { "073", testDate, CalendarSwap.RFC2822D.class, null, Locale.JAPAN, null, null, "03 3 2001" }, { "074", testDate, CalendarSwap.RFC2822D.class, "en_UK", Locale.JAPAN, null, null, "03 3 2001" }, { "075", testDate, CalendarSwap.RFC2822D.class, "ja_JP", Locale.KOREA, null, null, "03 3ì 2001" }, - { "076", testDate, CalendarSwap.RFC2822D.class, "en_US", null, "PST", null, "03 Mar 2001" }, - { "077", testDate, CalendarSwap.RFC2822D.class, "en_US", null, TimeZone.getTimeZone("PST"), null, "03 Mar 2001" }, - { "078", testDate, CalendarSwap.RFC2822D.class, "en_US", null, null, TimeZone.getTimeZone("EST"), "03 Mar 2001" }, - { "079", testDate, CalendarSwap.RFC2822D.class, "en_US", null, "PST", TimeZone.getTimeZone("EST"), "03 Mar 2001" }, + // Must use timezones to the east of GMT so that date doesn't roll back in test. + { "076", testDate, CalendarSwap.RFC2822D.class, "en_US", null, "WET", null, "03 Mar 2001" }, + { "077", testDate, CalendarSwap.RFC2822D.class, "en_US", null, TimeZone.getTimeZone("WET"), null, "03 Mar 2001" }, + { "078", testDate, CalendarSwap.RFC2822D.class, "en_US", null, null, TimeZone.getTimeZone("WET"), "03 Mar 2001" }, + { "079", testDate, CalendarSwap.RFC2822D.class, "en_US", null, "PST", TimeZone.getTimeZone("WET"), "03 Mar 2001" }, // CalendarSwap.DateSimple { "080", testDate, CalendarSwap.DateSimple.class, null, null, null, null, "2001/03/03" }, http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/BeanContext.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java index 52ec112..70ffaf3 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java @@ -813,7 +813,7 @@ public class BeanContext extends Context { * </ul> * * <p> - * Used in the in the {@link BeanSession#convertToType(Object, Class)} method.Ã + * Used in the in the {@link BeanSession#convertToType(Object, Class)} method. */ public static final String BEAN_locale = "BeanContext.locale"; @@ -828,7 +828,7 @@ public class BeanContext extends Context { * </ul> * * <p> - * Used in the in the {@link BeanSession#convertToType(Object, Class)} method.Ã + * Used in the in the {@link BeanSession#convertToType(Object, Class)} method. */ public static final String BEAN_timeZone = "BeanContext.timeZone"; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java index 36164c7..c550408 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java @@ -969,31 +969,43 @@ public class BeanPropertyMeta { } private Object transform(BeanSession session, Object o) throws SerializeException { - // First use swap defined via @BeanProperty. - if (swap != null) - return swap.swap(session, o); - if (o == null) - return null; - // Otherwise, look it up via bean context. - if (rawTypeMeta.hasChildPojoSwaps()) { - PojoSwap f = rawTypeMeta.getChildPojoSwapForSwap(o.getClass()); - if (f != null) - return f.swap(session, o); + try { + // First use swap defined via @BeanProperty. + if (swap != null) + return swap.swap(session, o); + if (o == null) + return null; + // Otherwise, look it up via bean context. + if (rawTypeMeta.hasChildPojoSwaps()) { + PojoSwap f = rawTypeMeta.getChildPojoSwapForSwap(o.getClass()); + if (f != null) + return f.swap(session, o); + } + return o; + } catch (SerializeException e) { + throw e; + } catch (Exception e) { + throw new SerializeException(e); } - return o; } private Object unswap(BeanSession session, Object o) throws ParseException { - if (swap != null) - return swap.unswap(session, o, rawTypeMeta); - if (o == null) - return null; - if (rawTypeMeta.hasChildPojoSwaps()) { - PojoSwap f = rawTypeMeta.getChildPojoSwapForUnswap(o.getClass()); - if (f != null) - return f.unswap(session, o, rawTypeMeta); + try { + if (swap != null) + return swap.unswap(session, o, rawTypeMeta); + if (o == null) + return null; + if (rawTypeMeta.hasChildPojoSwaps()) { + PojoSwap f = rawTypeMeta.getChildPojoSwapForUnswap(o.getClass()); + if (f != null) + return f.unswap(session, o, rawTypeMeta); + } + return o; + } catch (ParseException e) { + throw e; + } catch (Exception e) { + throw new ParseException(e); } - return o; } private Object applyChildPropertiesFilter(BeanSession session, ClassMeta cm, Object o) { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java index dad67b0..194602f 100644 --- a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java @@ -375,11 +375,17 @@ public class ObjectMap extends LinkedHashMap<String,Object> { */ @SuppressWarnings({ "rawtypes", "unchecked" }) public <T> T get(PojoSwap<T,?> pojoSwap, String key) throws ParseException { - Object o = super.get(key); - if (o == null) - return null; - PojoSwap swap = pojoSwap; - return (T)swap.unswap(session, o, null); + try { + Object o = super.get(key); + if (o == null) + return null; + PojoSwap swap = pojoSwap; + return (T)swap.unswap(session, o, null); + } catch (ParseException e) { + throw e; + } catch (Exception e) { + throw new ParseException(e); + } } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBuilder.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBuilder.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBuilder.java index bdeba5a..9437a10 100644 --- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBuilder.java +++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBuilder.java @@ -1306,13 +1306,13 @@ public class HtmlBuilder { } /** - * Creates an {@link Option} element with the specified {@link Option#value(Object)} attribute. + * Creates an {@link Option} element with the specified {@link Option#text(Object)} attribute. * - * @param value The {@link Option#value(Object)} attribute. + * @param text The {@link Option#text(Object)} attribute. * @return The new element. */ - public static final Option option(Object value) { - return option().value(value); + public static final Option option(Object text) { + return option().text(text); } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java index 8ca17e7..042860b 100644 --- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java +++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java @@ -124,16 +124,14 @@ public class HtmlElementMixed extends HtmlElement { * @param children * The children to add as child elements. * Can be a mixture of strings and {@link HtmlElement} objects. + * Can also be containers of strings and elements. * @return This object (for method chaining). */ @SuppressWarnings("hiding") public HtmlElement children(Object...children) { - if (children.length != 0) { - if (this.children == null) - this.children = new LinkedList<Object>(); + if (children.length != 0) for (Object c : children) - this.children.add(c); - } + child(c); return this; } @@ -143,12 +141,16 @@ public class HtmlElementMixed extends HtmlElement { * @param child * The child to add as a child element. * Can be a string or {@link HtmlElement}. + * Can also be a container of strings and elements. * @return This object (for method chaining). */ public HtmlElement child(Object child) { if (this.children == null) this.children = new LinkedList<Object>(); - this.children.add(child); + if (child instanceof Collection) + this.children.addAll((Collection<?>)child); + else + this.children.add(child); return this; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java index 89b9648..5903566 100644 --- a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java +++ b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java @@ -783,8 +783,26 @@ public final class ClassUtils { * @return The new class instance, or <jk>null</jk> if the class was <jk>null</jk> or is abstract or an interface. * @throws RuntimeException if constructor could not be found or called. */ - @SuppressWarnings("unchecked") public static <T> T newInstance(Class<T> c, Object c2, Object...args) { + return newInstanceFromOuter(null, c, c2, args); + } + + /** + * Creates an instance of the specified class from within the context of another object. + * + * @param outer + * The outer object. + * Can be <jk>null</jk>. + * @param c The class to cast to. + * @param c2 + * The class to instantiate. + * Can also be an instance of the class. + * @param args The arguments to pass to the constructor. + * @return The new class instance, or <jk>null</jk> if the class was <jk>null</jk> or is abstract or an interface. + * @throws RuntimeException if constructor could not be found or called. + */ + @SuppressWarnings("unchecked") + public static <T> T newInstanceFromOuter(Object outer, Class<T> c, Object c2, Object...args) { if (c2 == null) return null; if (c2 instanceof Class) { @@ -792,8 +810,15 @@ public final class ClassUtils { Class<?> c3 = (Class<?>)c2; if (c3.isInterface() || isAbstract(c3)) return null; - if (args.length == 0) - return (T)c3.newInstance(); + Constructor<?> con = findPublicConstructor(c3, args); + if (con != null) + return (T)con.newInstance(args); + if (outer != null) { + Object[] args2 = new AList<Object>().append(outer).appendAll(args).toArray(); + con = findPublicConstructor(c3, args2); + if (con != null) + return (T)con.newInstance(args2); + } return (T)c3.getConstructor(getClasses(args)).newInstance(args); } catch (Exception e) { throw new FormattedRuntimeException(e, "Could not instantiate class {0}", c.getName()); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java index c0d4f3d..bf07973 100644 --- a/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java +++ b/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java @@ -231,6 +231,7 @@ public final class DateUtils { S6 = 6; // Found : int state = 1; + boolean needsT = false; for (int i = 0; i < in.length(); i++) { char c = in.charAt(i); if (state == S1) { @@ -242,6 +243,10 @@ public final class DateUtils { } else if (state == S3) { if (c == 'T') state = S4; + if (c == ' ') { + state = S4; + needsT = true; + } } else if (state == S4) { if (c == ':') state = S5; @@ -251,6 +256,8 @@ public final class DateUtils { } } + if (needsT) + in = in.replace(' ', 'T'); switch(state) { case S1: return in + "-01-01T00:00:00"; case S2: return in + "-01T00:00:00"; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java index 4b6c17a..4654d0f 100644 --- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java @@ -535,12 +535,18 @@ public abstract class SerializerSession extends BeanSession { */ @SuppressWarnings({ "rawtypes", "unchecked" }) protected final Object generalize(Object o, ClassMeta<?> type) throws SerializeException { - if (o == null) - return null; - PojoSwap f = (type == null || type.isObject() ? getClassMeta(o.getClass()).getPojoSwap() : type.getPojoSwap()); - if (f == null) - return o; - return f.swap(this, o); + try { + if (o == null) + return null; + PojoSwap f = (type == null || type.isObject() ? getClassMeta(o.getClass()).getPojoSwap() : type.getPojoSwap()); + if (f == null) + return o; + return f.swap(this, o); + } catch (SerializeException e) { + throw e; + } catch (Exception e) { + throw new SerializeException(e); + } } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java b/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java index f0713f6..8f521c0 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java +++ b/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java @@ -13,8 +13,6 @@ package org.apache.juneau.transform; import org.apache.juneau.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; /** * Abstract subclass for POJO swaps that swap objects for object maps. @@ -24,12 +22,12 @@ import org.apache.juneau.serializer.*; public abstract class MapSwap<T> extends PojoSwap<T,ObjectMap> { @Override /* PojoSwap */ - public ObjectMap swap(BeanSession session, T o) throws SerializeException { + public ObjectMap swap(BeanSession session, T o) throws Exception { return super.swap(session, o); } @Override /* PojoSwap */ - public T unswap(BeanSession session, ObjectMap f, ClassMeta<?> hint) throws ParseException { + public T unswap(BeanSession session, ObjectMap f, ClassMeta<?> hint) throws Exception { return super.unswap(session, f, hint); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java b/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java index 51dec68..8db7b53 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java +++ b/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java @@ -173,9 +173,9 @@ public abstract class PojoSwap<T,S> { * This is always going to be the same bean context that created this swap. * @param o The object to be transformed. * @return The transformed object. - * @throws SerializeException If a problem occurred trying to convert the output. + * @throws Exception If a problem occurred trying to convert the output. */ - public S swap(BeanSession session, T o) throws SerializeException { + public S swap(BeanSession session, T o) throws Exception { throw new SerializeException("Swap method not implemented on PojoSwap ''{0}''", this.getClass().getName()); } @@ -192,9 +192,9 @@ public abstract class PojoSwap<T,S> { * {@code GregorianCalendar}. * <br>This may be <jk>null</jk> if the parser cannot make this determination. * @return The narrowed object. - * @throws ParseException If this method is not implemented. + * @throws Exception If this method is not implemented. */ - public T unswap(BeanSession session, S f, ClassMeta<?> hint) throws ParseException { + public T unswap(BeanSession session, S f, ClassMeta<?> hint) throws Exception { throw new ParseException("Unswap method not implemented on PojoSwap ''{0}''", this.getClass().getName()); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java b/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java index 0d9b47d..6002086 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java +++ b/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java @@ -13,8 +13,6 @@ package org.apache.juneau.transform; import org.apache.juneau.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; /** * Abstract subclass for POJO swaps that swap objects for strings. @@ -24,12 +22,12 @@ import org.apache.juneau.serializer.*; public abstract class StringSwap<T> extends PojoSwap<T,String> { @Override /* PojoSwap */ - public String swap(BeanSession session, T o) throws SerializeException { + public String swap(BeanSession session, T o) throws Exception { return super.swap(session, o); } @Override /* PojoSwap */ - public T unswap(BeanSession session, String f, ClassMeta<?> hint) throws ParseException { + public T unswap(BeanSession session, String f, ClassMeta<?> hint) throws Exception { return super.unswap(session, f, hint); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java b/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java index 578e915..aacace6 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java +++ b/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java @@ -12,17 +12,15 @@ // *************************************************************************************************************************** package org.apache.juneau.transforms; -import static org.apache.juneau.internal.StringUtils.*; -import static org.apache.juneau.internal.DateUtils.*; +import static org.apache.juneau.utils.CalendarUtils.Format.*; import java.text.*; import java.util.*; -import javax.xml.bind.*; - import org.apache.juneau.*; import org.apache.juneau.parser.ParseException; import org.apache.juneau.transform.*; +import org.apache.juneau.utils.*; /** * Transforms {@link Calendar Calendars} to {@link String Strings}. @@ -58,40 +56,6 @@ import org.apache.juneau.transform.*; */ public class CalendarSwap extends StringSwap<Calendar> { - private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); - private final int dateStyle, timeStyle; - private final String pattern; - private final TimeZone timeZone; - - /** - * Constructor. - * - * <p> - * Only one of the <code>pattern</code> or <code>style</code> parameters should - * - * @param pattern - * The {@link SimpleDateFormat} pattern. - * If <jk>null</jk>, <code>style</code> is used instead. - * @param dateStyle - * The {@link DateFormat} date style (e.g. {@link DateFormat#SHORT}). - * Ignored if <code>pattern</code> is not <jk>null</jk>. - * Ignored if <code>-1</code>. - * @param timeStyle - * The {@link DateFormat} time style (e.g. {@link DateFormat#SHORT}). - * Ignored if <code>pattern</code> is not <jk>null</jk>. - * Ignored if <code>-1</code>. - * @param timeZone - * The timeZone to use for dates. - * If <jk>null</jk> then either the timezone specified on the {@link Calendar} object or the timezone returned by - * {@link BeanSession#getTimeZone()} is used. - */ - protected CalendarSwap(String pattern, int dateStyle, int timeStyle, TimeZone timeZone) { - this.pattern = pattern; - this.dateStyle = dateStyle; - this.timeStyle = timeStyle; - this.timeZone = timeZone; - } - /** * Transforms {@link Calendar Calendars} to {@link String Strings} using the {@code Date.toString()} method. * @@ -101,9 +65,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class ToString extends CalendarSwap { - /** Constructor */ - public ToString() { - super("EEE MMM dd HH:mm:ss zzz yyyy", -1, -1, null); + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, TO_STRING, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return convert(CalendarUtils.parseDate(o, TO_STRING, session.getLocale(), session.getTimeZone()), hint, session); } } @@ -129,28 +99,45 @@ public class CalendarSwap extends StringSwap<Calendar> { */ public static class ISO8601DT extends CalendarSwap { - /** Constructor */ - public ISO8601DT() { - super(null, -1, -1, null); + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, ISO8601_DT, session.getLocale(), session.getTimeZone()); } @Override /* PojoSwap */ - public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws ParseException { - try { - if (isEmpty(o)) - return null; - return convert(DatatypeConverter.parseDateTime(toValidISO8601DT(o)), hint); - } catch (Exception e) { - throw new ParseException(e); - } + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DT, session.getLocale(), session.getTimeZone()); + } + } + + /** + * Transforms {@link Calendar Calendars} to ISO8601 date-time-local strings. + * + * <h5 class='section'>Example output:</h5> + * <ul> + * <li><js>"2001-07-04T15:30:45"</js> + * </ul> + * + * <h6 class='topic'>Example input:</h6> + * <ul> + * <li><js>"2001-07-04T15:30:45"</js> + * <li><js>"2001-07-04T15:30:45.1"</js> + * <li><js>"2001-07-04T15:30"</js> + * <li><js>"2001-07-04"</js> + * <li><js>"2001-07"</js> + * <li><js>"2001"</js> + * </ul> + */ + public static class ISO8601DTL extends CalendarSwap { + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return convert(CalendarUtils.parseCalendar(o, ISO8601_DTL, session.getLocale(), session.getTimeZone()), hint); } @Override /* PojoSwap */ - public String swap(BeanSession session, Calendar o) { - if (o == null) - return null; - o = setTimeZone(session, o); - return DatatypeConverter.printDateTime(o); + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTL, session.getLocale(), session.getTimeZone()); } } @@ -162,37 +149,19 @@ public class CalendarSwap extends StringSwap<Calendar> { */ public static class ISO8601DTZ extends CalendarSwap { - /** Constructor */ - public ISO8601DTZ() { - super(null, -1, -1, null); - } - @Override /* PojoSwap */ - public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws ParseException { - try { - if (isEmpty(o)) - return null; - return convert(DatatypeConverter.parseDateTime(toValidISO8601DT(o)), hint); - } catch (Exception e) { - throw new ParseException(e); - } + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, ISO8601_DTZ, session.getLocale(), session.getTimeZone()); } @Override /* PojoSwap */ - public String swap(BeanSession session, Calendar o) { - if (o == null) - return null; - if (o.getTimeZone().getRawOffset() != 0) { - Calendar c = Calendar.getInstance(GMT); - c.setTime(o.getTime()); - o = c; - } - return DatatypeConverter.printDateTime(o); + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTZ, session.getLocale(), session.getTimeZone()); } } /** - * Same as {@link CalendarSwap.ISO8601DT} except serializes to millisecond precision. + * Same as {@link ISO8601DT} except serializes to millisecond precision. * * <h5 class='section'>Example output:</h5> * <js>"2001-07-04T15:30:45.123Z"</js> @@ -200,16 +169,13 @@ public class CalendarSwap extends StringSwap<Calendar> { public static class ISO8601DTP extends ISO8601DT { @Override /* PojoSwap */ - public String swap(BeanSession session, Calendar o) { - if (o == null) - return null; - String s = super.swap(session, o); - return String.format("%s.%03d%s", s.substring(0, 19), o.get(Calendar.MILLISECOND), s.substring(19)); + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTP, session.getLocale(), session.getTimeZone()); } } /** - * Same as {@link CalendarSwap.ISO8601DTZ} except serializes to millisecond precision. + * Same as {@link ISO8601DTZ} except serializes to millisecond precision. * * <h5 class='section'>Example output:</h5> * <js>"2001-07-04T15:30:45.123"</js> @@ -217,11 +183,27 @@ public class CalendarSwap extends StringSwap<Calendar> { public static class ISO8601DTPZ extends ISO8601DTZ { @Override /* PojoSwap */ - public String swap(BeanSession session, Calendar o) { - if (o == null) - return null; - String s = super.swap(session, o); - return String.format("%s.%03d%s", s.substring(0, 19), o.get(Calendar.MILLISECOND), s.substring(19)); + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTPZ, session.getLocale(), session.getTimeZone()); + } + } + + /** + * ISO8601 date only. + * + * <h5 class='section'>Example output:</h5> + * <js>"2001-07-04"</js> + */ + public static class ISO8601D extends CalendarSwap { + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, ISO8601_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_D, session.getLocale(), session.getTimeZone()); } } @@ -236,9 +218,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class RFC2822DT extends CalendarSwap { - /** Constructor */ - public RFC2822DT() { - super("EEE, dd MMM yyyy HH:mm:ss Z", -1, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, RFC2822_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, RFC2822_DT, session.getLocale(), session.getTimeZone()); } } @@ -253,9 +241,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class RFC2822DTZ extends CalendarSwap { - /** Constructor */ - public RFC2822DTZ() { - super("EEE, dd MMM yyyy HH:mm:ss 'GMT'", -1, -1, GMT); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, RFC2822_DTZ, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, RFC2822_DTZ, session.getLocale(), session.getTimeZone()); } } @@ -270,9 +264,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class RFC2822D extends CalendarSwap { - /** Constructor */ - public RFC2822D() { - super("dd MMM yyyy", -1, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, RFC2822_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, RFC2822_D, session.getLocale(), session.getTimeZone()); } } @@ -285,9 +285,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateTimeSimple extends CalendarSwap { - /** Constructor */ - public DateTimeSimple() { - super("yyyy/MM/dd HH:mm:ss", -1, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, SIMPLE_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, SIMPLE_DT, session.getLocale(), session.getTimeZone()); } } @@ -300,9 +306,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateSimple extends CalendarSwap { - /** Constructor */ - public DateSimple() { - super("yyyy/MM/dd", -1, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, SIMPLE_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, SIMPLE_D, session.getLocale(), session.getTimeZone()); } } @@ -315,9 +327,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class TimeSimple extends CalendarSwap { - /** Constructor */ - public TimeSimple() { - super("HH:mm:ss", -1, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, SIMPLE_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, SIMPLE_T, session.getLocale(), session.getTimeZone()); } } @@ -332,9 +350,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateFull extends CalendarSwap { - /** Constructor */ - public DateFull() { - super(null, DateFormat.FULL, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, FULL_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, FULL_D, session.getLocale(), session.getTimeZone()); } } @@ -349,9 +373,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateLong extends CalendarSwap { - /** Constructor */ - public DateLong() { - super(null, DateFormat.LONG, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, LONG_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, LONG_D, session.getLocale(), session.getTimeZone()); } } @@ -366,9 +396,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateMedium extends CalendarSwap { - /** Constructor */ - public DateMedium() { - super(null, DateFormat.MEDIUM, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, MEDIUM_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, MEDIUM_D, session.getLocale(), session.getTimeZone()); } } @@ -383,9 +419,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateShort extends CalendarSwap { - /** Constructor */ - public DateShort() { - super(null, DateFormat.SHORT, -1, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, SHORT_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, SHORT_D, session.getLocale(), session.getTimeZone()); } } @@ -400,9 +442,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class TimeFull extends CalendarSwap { - /** Constructor */ - public TimeFull() { - super(null, -1, DateFormat.FULL, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, FULL_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, FULL_T, session.getLocale(), session.getTimeZone()); } } @@ -417,9 +465,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class TimeLong extends CalendarSwap { - /** Constructor */ - public TimeLong() { - super(null, -1, DateFormat.LONG, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, LONG_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, LONG_T, session.getLocale(), session.getTimeZone()); } } @@ -434,9 +488,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class TimeMedium extends CalendarSwap { - /** Constructor */ - public TimeMedium() { - super(null, -1, DateFormat.MEDIUM, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, MEDIUM_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, MEDIUM_T, session.getLocale(), session.getTimeZone()); } } @@ -451,9 +511,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class TimeShort extends CalendarSwap { - /** Constructor */ - public TimeShort() { - super(null, -1, DateFormat.SHORT, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, SHORT_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, SHORT_T, session.getLocale(), session.getTimeZone()); } } @@ -468,9 +534,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateTimeFull extends CalendarSwap { - /** Constructor */ - public DateTimeFull() { - super(null, DateFormat.FULL, DateFormat.FULL, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, FULL_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, FULL_DT, session.getLocale(), session.getTimeZone()); } } @@ -485,9 +557,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateTimeLong extends CalendarSwap { - /** Constructor */ - public DateTimeLong() { - super(null, DateFormat.LONG, DateFormat.LONG, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, LONG_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, LONG_DT, session.getLocale(), session.getTimeZone()); } } @@ -502,9 +580,15 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateTimeMedium extends CalendarSwap { - /** Constructor */ - public DateTimeMedium() { - super(null, DateFormat.MEDIUM, DateFormat.MEDIUM, null); + + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, MEDIUM_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, MEDIUM_DT, session.getLocale(), session.getTimeZone()); } } @@ -519,97 +603,40 @@ public class CalendarSwap extends StringSwap<Calendar> { * </ul> */ public static class DateTimeShort extends CalendarSwap { - /** Constructor */ - public DateTimeShort() { - super(null, DateFormat.SHORT, DateFormat.SHORT, null); - } - } - /** - * Returns the {@link DateFormat} object for this session for formatting dates. - * - * @param session The current bean session. - * @param c - * Optional <code>Calendar</code> object to copy <code>TimeZone</code> from if not specified in session or - * <code>timeZone</code> setting. - * @return - * The {@link DateFormat} object. - * Multiple calls to this method on the same session will return a cached copy of date format object. - */ - protected DateFormat getDateFormat(BeanSession session, Calendar c) { - DateFormat df = session.getFromCache(DateFormat.class, this.getClass().getName()); - if (df == null) { - if (pattern != null) - df = new SimpleDateFormat(pattern, session.getLocale()); - else { - if (dateStyle == -1 && timeStyle != -1) - df = DateFormat.getTimeInstance(timeStyle, session.getLocale()); - else if (dateStyle != -1 && timeStyle == -1) - df = DateFormat.getDateInstance(dateStyle, session.getLocale()); - else - df = DateFormat.getDateTimeInstance(dateStyle, timeStyle, session.getLocale()); - } - if (timeZone != null) - df.setTimeZone(timeZone); - else if (session.getTimeZone() != null) - df.setTimeZone(session.getTimeZone()); - else if (c != null && ! c.getTimeZone().equals(df.getTimeZone())) { - // Don't cache it if we're using the Calendar timezone. - df.setTimeZone(c.getTimeZone()); - return df; - } - session.addToCache(this.getClass().getName(), df); - } - return df; - } + @Override /* PojoSwap */ + public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseCalendar(o, SHORT_DT, session.getLocale(), session.getTimeZone()); + } - /** - * Converts the specified {@link Calendar} to a {@link String}. - */ - @Override /* PojoSwap */ - public String swap(BeanSession session, Calendar o) { - if (o == null) - return null; - return getDateFormat(session, o).format(o.getTime()); + @Override /* PojoSwap */ + public String swap(BeanSession session, Calendar o) throws Exception { + return CalendarUtils.serialize(o, SHORT_DT, session.getLocale(), session.getTimeZone()); + } } - /** - * Converts the specified {@link String} to a {@link Calendar}. - */ - @Override /* PojoSwap */ - public Calendar unswap(BeanSession session, String o, ClassMeta<?> hint) throws ParseException { + private static Calendar convert(Calendar in, ClassMeta<?> hint) throws ParseException { try { - if (isEmpty(o)) - return null; - return convert(getDateFormat(session, null).parse(o), hint, session); + if (hint.isInstance(in) || ! hint.canCreateNewInstance()) + return in; + Calendar c = (Calendar)hint.newInstance(); + c.setTime(in.getTime()); + c.setTimeZone(in.getTimeZone()); + return c; } catch (Exception e) { throw new ParseException(e); } } - private static Calendar convert(Calendar in, ClassMeta<?> hint) throws Exception { - if (hint.isInstance(in) || ! hint.canCreateNewInstance()) - return in; - Calendar c = (Calendar)hint.newInstance(); - c.setTime(in.getTime()); - c.setTimeZone(in.getTimeZone()); - return c; - } - - private static Calendar convert(Date in, ClassMeta<?> hint, BeanSession session) throws Exception { - if (hint == null || ! hint.canCreateNewInstance()) - hint = session.getClassMeta(GregorianCalendar.class); - Calendar c = (Calendar)hint.newInstance(); - c.setTime(in); - return c; - } - - private static Calendar setTimeZone(BeanSession session, Calendar c) { - TimeZone tz = session.getTimeZone(); - if (tz != null && ! tz.equals(c.getTimeZone())) { - c = (Calendar)c.clone(); - c.setTimeZone(tz); + private static Calendar convert(Date in, ClassMeta<?> hint, BeanSession session) throws ParseException { + try { + if (hint == null || ! hint.canCreateNewInstance()) + hint = session.getClassMeta(GregorianCalendar.class); + Calendar c = (Calendar)hint.newInstance(); + c.setTime(in); + return c; + } catch (Exception e) { + throw new ParseException(e); } - return c; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c7985031/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java b/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java index a2c20ea..f291729 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java +++ b/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java @@ -12,17 +12,15 @@ // *************************************************************************************************************************** package org.apache.juneau.transforms; -import static org.apache.juneau.internal.DateUtils.*; -import static org.apache.juneau.internal.StringUtils.*; +import static org.apache.juneau.utils.CalendarUtils.Format.*; import java.text.*; import java.util.*; -import javax.xml.bind.*; - import org.apache.juneau.*; import org.apache.juneau.parser.ParseException; import org.apache.juneau.transform.*; +import org.apache.juneau.utils.*; /** * Transforms {@link Date Dates} to {@link String Strings}. @@ -58,39 +56,6 @@ import org.apache.juneau.transform.*; */ public class DateSwap extends StringSwap<Date> { - private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); - private final int dateStyle, timeStyle; - private final String pattern; - private final TimeZone timeZone; - - /** - * Constructor. - * - * <p> - * Only one of the <code>pattern</code> or <code>style</code> parameters should - * - * @param pattern - * The {@link SimpleDateFormat} pattern. - * If <jk>null</jk>, <code>style</code> is used instead. - * @param dateStyle - * The {@link DateFormat} date style (e.g. {@link DateFormat#SHORT}). - * Ignored if <code>pattern</code> is not <jk>null</jk>. - * Ignored if <code>-1</code>. - * @param timeStyle - * The {@link DateFormat} time style (e.g. {@link DateFormat#SHORT}). - * Ignored if <code>pattern</code> is not <jk>null</jk>. - * Ignored if <code>-1</code>. - * @param timeZone - * The timeZone to use for dates. - * If <jk>null</jk> then the timezone returned by {@link BeanSession#getTimeZone()} is used. - */ - protected DateSwap(String pattern, int dateStyle, int timeStyle, TimeZone timeZone) { - this.pattern = pattern; - this.dateStyle = dateStyle; - this.timeStyle = timeStyle; - this.timeZone = timeZone; - } - /** * Transforms {@link Date Dates} to {@link String Strings} using the {@code Date.toString()} method. * @@ -100,9 +65,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class ToString extends DateSwap { - /** Constructor */ - public ToString() { - super("EEE MMM dd HH:mm:ss zzz yyyy", -1, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return convert(CalendarUtils.parseDate(o, TO_STRING, session.getLocale(), session.getTimeZone()), hint); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, TO_STRING, session.getLocale(), session.getTimeZone()); } } @@ -128,30 +99,45 @@ public class DateSwap extends StringSwap<Date> { */ public static class ISO8601DT extends DateSwap { - /** Constructor */ - public ISO8601DT() { - super(null, -1, -1, null); + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return convert(CalendarUtils.parseDate(o, ISO8601_DT, session.getLocale(), session.getTimeZone()), hint); } @Override /* PojoSwap */ - public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws ParseException { - try { - if (isEmpty(o)) - return null; - return convert(DatatypeConverter.parseDateTime(toValidISO8601DT(o)).getTime(), hint); - } catch (Exception e) { - throw new ParseException(e); - } + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DT, session.getLocale(), session.getTimeZone()); + } + } + + /** + * Transforms {@link Date Dates} to ISO8601 date-time-local strings. + * + * <h5 class='section'>Example output:</h5> + * <ul> + * <li><js>"2001-07-04T15:30:45"</js> + * </ul> + * + * <h6 class='topic'>Example input:</h6> + * <ul> + * <li><js>"2001-07-04T15:30:45"</js> + * <li><js>"2001-07-04T15:30:45.1"</js> + * <li><js>"2001-07-04T15:30"</js> + * <li><js>"2001-07-04"</js> + * <li><js>"2001-07"</js> + * <li><js>"2001"</js> + * </ul> + */ + public static class ISO8601DTL extends DateSwap { + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return convert(CalendarUtils.parseDate(o, ISO8601_DTL, session.getLocale(), session.getTimeZone()), hint); } @Override /* PojoSwap */ - public String swap(BeanSession session, Date o) { - if (o == null) - return null; - Calendar c = new GregorianCalendar(); - c.setTime(o); - c = setTimeZone(session, c); - return DatatypeConverter.printDateTime(c); + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTL, session.getLocale(), session.getTimeZone()); } } @@ -163,34 +149,14 @@ public class DateSwap extends StringSwap<Date> { */ public static class ISO8601DTZ extends DateSwap { - /** Constructor */ - public ISO8601DTZ() { - super(null, -1, -1, null); - } - @Override /* PojoSwap */ - public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws ParseException { - try { - if (isEmpty(o)) - return null; - return convert(DatatypeConverter.parseDateTime(toValidISO8601DT(o)).getTime(), hint); - } catch (Exception e) { - throw new ParseException(e); - } + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, ISO8601_DTZ, session.getLocale(), session.getTimeZone()); } @Override /* PojoSwap */ - public String swap(BeanSession session, Date o) { - if (o == null) - return null; - Calendar c = new GregorianCalendar(); - c.setTime(o); - if (c.getTimeZone().getRawOffset() != 0) { - Calendar c2 = Calendar.getInstance(GMT); - c2.setTime(c.getTime()); - c = c2; - } - return DatatypeConverter.printDateTime(c); + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTZ, session.getLocale(), session.getTimeZone()); } } @@ -203,13 +169,8 @@ public class DateSwap extends StringSwap<Date> { public static class ISO8601DTP extends ISO8601DT { @Override /* PojoSwap */ - public String swap(BeanSession session, Date o) { - if (o == null) - return null; - Calendar c = new GregorianCalendar(); - c.setTime(o); - String s = super.swap(session, o); - return String.format("%s.%03d%s", s.substring(0, 19), c.get(Calendar.MILLISECOND), s.substring(19)); + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTP, session.getLocale(), session.getTimeZone()); } } @@ -222,13 +183,27 @@ public class DateSwap extends StringSwap<Date> { public static class ISO8601DTPZ extends ISO8601DTZ { @Override /* PojoSwap */ - public String swap(BeanSession session, Date o) { - if (o == null) - return null; - Calendar c = new GregorianCalendar(); - c.setTime(o); - String s = super.swap(session, o); - return String.format("%s.%03d%s", s.substring(0, 19), c.get(Calendar.MILLISECOND), s.substring(19)); + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_DTPZ, session.getLocale(), session.getTimeZone()); + } + } + + /** + * ISO8601 date only. + * + * <h5 class='section'>Example output:</h5> + * <js>"2001-07-04"</js> + */ + public static class ISO8601D extends DateSwap { + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, ISO8601_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, ISO8601_D, session.getLocale(), session.getTimeZone()); } } @@ -243,9 +218,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class RFC2822DT extends DateSwap { - /** Constructor */ - public RFC2822DT() { - super("EEE, dd MMM yyyy HH:mm:ss Z", -1, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, RFC2822_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, RFC2822_DT, session.getLocale(), session.getTimeZone()); } } @@ -260,9 +241,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class RFC2822DTZ extends DateSwap { - /** Constructor */ - public RFC2822DTZ() { - super("EEE, dd MMM yyyy HH:mm:ss 'GMT'", -1, -1, GMT); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, RFC2822_DTZ, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, RFC2822_DTZ, session.getLocale(), session.getTimeZone()); } } @@ -277,9 +264,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class RFC2822D extends DateSwap { - /** Constructor */ - public RFC2822D() { - super("dd MMM yyyy", -1, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, RFC2822_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, RFC2822_D, session.getLocale(), session.getTimeZone()); } } @@ -292,9 +285,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateTimeSimple extends DateSwap { - /** Constructor */ - public DateTimeSimple() { - super("yyyy/MM/dd HH:mm:ss", -1, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, SIMPLE_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, SIMPLE_DT, session.getLocale(), session.getTimeZone()); } } @@ -307,9 +306,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateSimple extends DateSwap { - /** Constructor */ - public DateSimple() { - super("yyyy/MM/dd", -1, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, SIMPLE_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, SIMPLE_D, session.getLocale(), session.getTimeZone()); } } @@ -322,9 +327,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class TimeSimple extends DateSwap { - /** Constructor */ - public TimeSimple() { - super("HH:mm:ss", -1, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, SIMPLE_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, SIMPLE_T, session.getLocale(), session.getTimeZone()); } } @@ -339,9 +350,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateFull extends DateSwap { - /** Constructor */ - public DateFull() { - super(null, DateFormat.FULL, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, FULL_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, FULL_D, session.getLocale(), session.getTimeZone()); } } @@ -356,9 +373,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateLong extends DateSwap { - /** Constructor */ - public DateLong() { - super(null, DateFormat.LONG, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, LONG_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, LONG_D, session.getLocale(), session.getTimeZone()); } } @@ -373,9 +396,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateMedium extends DateSwap { - /** Constructor */ - public DateMedium() { - super(null, DateFormat.MEDIUM, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, MEDIUM_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, MEDIUM_D, session.getLocale(), session.getTimeZone()); } } @@ -390,9 +419,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateShort extends DateSwap { - /** Constructor */ - public DateShort() { - super(null, DateFormat.SHORT, -1, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, SHORT_D, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, SHORT_D, session.getLocale(), session.getTimeZone()); } } @@ -407,9 +442,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class TimeFull extends DateSwap { - /** Constructor */ - public TimeFull() { - super(null, -1, DateFormat.FULL, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, FULL_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, FULL_T, session.getLocale(), session.getTimeZone()); } } @@ -424,9 +465,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class TimeLong extends DateSwap { - /** Constructor */ - public TimeLong() { - super(null, -1, DateFormat.LONG, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, LONG_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, LONG_T, session.getLocale(), session.getTimeZone()); } } @@ -441,9 +488,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class TimeMedium extends DateSwap { - /** Constructor */ - public TimeMedium() { - super(null, -1, DateFormat.MEDIUM, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, MEDIUM_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, MEDIUM_T, session.getLocale(), session.getTimeZone()); } } @@ -458,9 +511,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class TimeShort extends DateSwap { - /** Constructor */ - public TimeShort() { - super(null, -1, DateFormat.SHORT, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, SHORT_T, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, SHORT_T, session.getLocale(), session.getTimeZone()); } } @@ -475,9 +534,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateTimeFull extends DateSwap { - /** Constructor */ - public DateTimeFull() { - super(null, DateFormat.FULL, DateFormat.FULL, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, FULL_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, FULL_DT, session.getLocale(), session.getTimeZone()); } } @@ -492,9 +557,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateTimeLong extends DateSwap { - /** Constructor */ - public DateTimeLong() { - super(null, DateFormat.LONG, DateFormat.LONG, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, LONG_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, LONG_DT, session.getLocale(), session.getTimeZone()); } } @@ -509,9 +580,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateTimeMedium extends DateSwap { - /** Constructor */ - public DateTimeMedium() { - super(null, DateFormat.MEDIUM, DateFormat.MEDIUM, null); + + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, MEDIUM_DT, session.getLocale(), session.getTimeZone()); + } + + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, MEDIUM_DT, session.getLocale(), session.getTimeZone()); } } @@ -526,63 +603,15 @@ public class DateSwap extends StringSwap<Date> { * </ul> */ public static class DateTimeShort extends DateSwap { - /** Constructor */ - public DateTimeShort() { - super(null, DateFormat.SHORT, DateFormat.SHORT, null); - } - } - /** - * Returns the {@link DateFormat} object for this session for formatting dates. - * - * @param session The current bean session. - * @return - * The {@link DateFormat} object. - * Multiple calls to this method on the same session will return a cached copy of date format object. - */ - protected DateFormat getDateFormat(BeanSession session) { - DateFormat df = session.getFromCache(DateFormat.class, this.getClass().getName()); - if (df == null) { - if (pattern != null) - df = new SimpleDateFormat(pattern, session.getLocale()); - else { - if (dateStyle == -1 && timeStyle != -1) - df = DateFormat.getTimeInstance(timeStyle, session.getLocale()); - else if (dateStyle != -1 && timeStyle == -1) - df = DateFormat.getDateInstance(dateStyle, session.getLocale()); - else - df = DateFormat.getDateTimeInstance(dateStyle, timeStyle, session.getLocale()); - } - if (timeZone != null) - df.setTimeZone(timeZone); - else if (session.getTimeZone() != null) - df.setTimeZone(session.getTimeZone()); - session.addToCache(this.getClass().getName(), df); - } - return df; - } - - /** - * Converts the specified {@link Date} to a {@link String}. - */ - @Override /* PojoSwap */ - public String swap(BeanSession session, Date o) { - if (o == null) - return null; - return getDateFormat(session).format(o.getTime()); - } + @Override /* PojoSwap */ + public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws Exception { + return CalendarUtils.parseDate(o, SHORT_DT, session.getLocale(), session.getTimeZone()); + } - /** - * Converts the specified {@link String} to a {@link Date}. - */ - @Override /* PojoSwap */ - public Date unswap(BeanSession session, String o, ClassMeta<?> hint) throws ParseException { - try { - if (isEmpty(o)) - return null; - return convert(new Date(getDateFormat(session).parse(o).getTime()), hint); - } catch (Exception e) { - throw new ParseException(e); + @Override /* PojoSwap */ + public String swap(BeanSession session, Date o) throws Exception { + return CalendarUtils.serialize(o, SHORT_DT, session.getLocale(), session.getTimeZone()); } } @@ -602,13 +631,4 @@ public class DateSwap extends StringSwap<Date> { return new java.sql.Timestamp(in.getTime()); throw new ParseException("DateSwap is unable to narrow object of type ''{0}''", c); } - - private static Calendar setTimeZone(BeanSession session, Calendar c) { - TimeZone tz = session.getTimeZone(); - if (tz != null && ! tz.equals(c.getTimeZone())) { - c = (Calendar)c.clone(); - c.setTimeZone(tz); - } - return c; - } }
