1 //========================================================================
2 //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd.
3 //------------------------------------------------------------------------
4 //Licensed under the Apache License, Version 2.0 (the "License");
5 //you may not use this file except in compliance with the License.
6 //You may obtain a copy of the License at
7 //http://www.apache.org/licenses/LICENSE-2.0
8 //Unless required by applicable law or agreed to in writing, software
9 //distributed under the License is distributed on an "AS IS" BASIS,
10 //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 //See the License for the specific language governing permissions and
12 //limitations under the License.
13 //========================================================================
14
15 package org.mortbay.util.ajax;
16
17 import java.lang.reflect.Method;
18 import java.util.Map;
19
20 import org.mortbay.log.Log;
21 import org.mortbay.util.Loader;
22 import org.mortbay.util.ajax.JSON.Output;
23
24 /* ------------------------------------------------------------ */
25 /**
26 * Convert an {@link Enum} to JSON.
27 * If fromJSON is true in the constructor, the JSON generated will
28 * be of the form {class="com.acme.TrafficLight",value="Green"}
29 * If fromJSON is false, then only the string value of the enum is generated.
30 * @author gregw
31 *
32 */
33 public class JSONEnumConvertor implements JSON.Convertor
34 {
35 private boolean _fromJSON;
36 private Method _valueOf;
37 {
38 try
39 {
40 Class e = Loader.loadClass(getClass(),"java.lang.Enum");
41 _valueOf=e.getMethod("valueOf",new Class[]{Class.class,String.class});
42 }
43 catch(Exception e)
44 {
45 throw new RuntimeException("!Enums",e);
46 }
47 }
48
49 public JSONEnumConvertor()
50 {
51 this(false);
52 }
53
54 public JSONEnumConvertor(boolean fromJSON)
55 {
56 _fromJSON=fromJSON;
57 }
58
59 public Object fromJSON(Map map)
60 {
61 if (!_fromJSON)
62 throw new UnsupportedOperationException();
63 try
64 {
65 Class c=Loader.loadClass(getClass(),(String)map.get("class"));
66 return _valueOf.invoke(null,new Object[]{c,map.get("value")});
67 }
68 catch(Exception e)
69 {
70 Log.warn(e);
71 }
72 return null;
73 }
74
75 public void toJSON(Object obj, Output out)
76 {
77 if (_fromJSON)
78 {
79 out.addClass(obj.getClass());
80 out.add("value",obj.toString());
81 }
82 else
83 {
84 out.add(obj.toString());
85 }
86 }
87
88 }