1 //
2 //  ========================================================================
3 //  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 //  ------------------------------------------------------------------------
5 //  All rights reserved. This program and the accompanying materials
6 //  are made available under the terms of the Eclipse Public License v1.0
7 //  and Apache License v2.0 which accompanies this distribution.
8 //
9 //      The Eclipse Public License is available at
10 //      http://www.eclipse.org/legal/epl-v10.html
11 //
12 //      The Apache License v2.0 is available at
13 //      http://www.opensource.org/licenses/apache2.0.php
14 //
15 //  You may elect to redistribute this code under either of these licenses.
16 //  ========================================================================
17 //
18 
19 package org.eclipse.jetty.util.ajax;
20 
21 import java.text.DateFormatSymbols;
22 import java.text.SimpleDateFormat;
23 import java.util.Date;
24 import java.util.Locale;
25 import java.util.Map;
26 import java.util.TimeZone;
27 
28 import org.eclipse.jetty.util.DateCache;
29 import org.eclipse.jetty.util.ajax.JSON.Output;
30 import org.eclipse.jetty.util.log.Log;
31 import org.eclipse.jetty.util.log.Logger;
32 
33 /* ------------------------------------------------------------ */
34 /**
35 * Convert a {@link Date} to JSON.
36 * If fromJSON is true in the constructor, the JSON generated will
37 * be of the form {class="java.util.Date",value="1/1/1970 12:00 GMT"}
38 * If fromJSON is false, then only the string value of the date is generated.
39 */
40 public class JSONDateConvertor implements JSON.Convertor
41 {
42     private static final Logger LOG = Log.getLogger(JSONDateConvertor.class);
43 
44     private final boolean _fromJSON;
45     private final DateCache _dateCache;
46     private final SimpleDateFormat _format;
47 
JSONDateConvertor()48     public JSONDateConvertor()
49     {
50         this(false);
51     }
52 
JSONDateConvertor(boolean fromJSON)53     public JSONDateConvertor(boolean fromJSON)
54     {
55         this(DateCache.DEFAULT_FORMAT,TimeZone.getTimeZone("GMT"),fromJSON);
56     }
57 
JSONDateConvertor(String format,TimeZone zone,boolean fromJSON)58     public JSONDateConvertor(String format,TimeZone zone,boolean fromJSON)
59     {
60         _dateCache=new DateCache(format);
61         _dateCache.setTimeZone(zone);
62         _fromJSON=fromJSON;
63         _format=new SimpleDateFormat(format);
64         _format.setTimeZone(zone);
65     }
66 
JSONDateConvertor(String format, TimeZone zone, boolean fromJSON, Locale locale)67     public JSONDateConvertor(String format, TimeZone zone, boolean fromJSON, Locale locale)
68     {
69         _dateCache = new DateCache(format, locale);
70         _dateCache.setTimeZone(zone);
71         _fromJSON = fromJSON;
72         _format = new SimpleDateFormat(format, new DateFormatSymbols(locale));
73         _format.setTimeZone(zone);
74     }
75 
fromJSON(Map map)76     public Object fromJSON(Map map)
77     {
78         if (!_fromJSON)
79             throw new UnsupportedOperationException();
80         try
81         {
82             synchronized(_format)
83             {
84                 return _format.parseObject((String)map.get("value"));
85             }
86         }
87         catch(Exception e)
88         {
89             LOG.warn(e);
90         }
91         return null;
92     }
93 
toJSON(Object obj, Output out)94     public void toJSON(Object obj, Output out)
95     {
96         String date = _dateCache.format((Date)obj);
97         if (_fromJSON)
98         {
99             out.addClass(obj.getClass());
100             out.add("value",date);
101         }
102         else
103         {
104             out.add(date);
105         }
106     }
107 }
108