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;
-       }
 }

Reply via email to