001    package net.sourceforge.javajson.converter;
002    
003    import java.lang.reflect.InvocationTargetException;
004    import java.util.Collection;
005    import java.util.Date;
006    import java.util.Map;
007    
008    import org.apache.log4j.Logger;
009    
010    import net.sourceforge.javajson.JsonArray;
011    import net.sourceforge.javajson.JsonObject;
012    
013    /**
014     * Maps objects to a json object TODO: addMapper as: String field, String alias
015     * to map to an existing mapper TODO: addMapper to map a field to
016     * objAtField.fieldName and maybe rename the field too
017     */
018    public class Mapper {
019            protected final Logger log = Logger.getLogger(getClass());
020    
021            /**
022             * Default mapper that can be used to map object all the way down the tree.
023             */
024            public static Mapper DefaultMapper = new Mapper();
025    
026            private Mapper() {
027            }
028    
029            /**
030             * Maps an object to json based on a class, this method only works when
031             * using the default mapper and is meant to be called via convenience method
032             * on Converter.
033             * 
034             * @param obj
035             *            The object to convert to json
036             * @param cls
037             * @param locale
038             * @return
039             * @throws InvocationTargetException
040             * @throws IllegalAccessException
041             * @throws IllegalArgumentException
042             * @throws InvocationTargetException
043             * @throws IllegalAccessException
044             * @throws IllegalArgumentException
045             */
046            protected JsonObject toJson(Object obj, Class cls)
047                            throws IllegalArgumentException, IllegalAccessException,
048                            InvocationTargetException {
049                    return toJson(obj, cls, false);
050            }
051    
052            protected JsonObject toJson(Object obj, Class cls, boolean flat)
053                            throws IllegalArgumentException, IllegalAccessException,
054                            InvocationTargetException {
055                    JsonObject ret = null;
056                    if (obj != null) {
057                            if (cls == null)
058                                    ret = Utils.toJson(obj, obj.getClass());
059                            else
060                                    ret = Utils.toJson(obj, cls);
061    
062                            if (!flat) {
063                                    Map<String, Object> fields = Reflection.getFields(obj);
064                                    for (String key : fields.keySet()) {
065                                            Object val = fields.get(key);
066                                            if (!(val instanceof Number || val instanceof Date
067                                                            || val instanceof String || val instanceof Boolean || val instanceof Class)
068                                                            && val != null) {
069                                                    // non basic types...
070                                                    String jsonKey = Reflection.getFieldName(key);
071                                                    if (val instanceof Collection) {
072                                                            JsonArray array = toJsonArray((Collection) val);
073                                                            ret.put(jsonKey, array);
074                                                    } else {
075                                                            ret.put(jsonKey, toJson(val));
076                                                    }
077                                            }
078                                    }
079                            }
080                    }
081                    return ret;
082            }
083    
084            public JsonObject toJson(Object obj, boolean flat)
085                            throws IllegalArgumentException, IllegalAccessException,
086                            InvocationTargetException {
087                    if (obj != null)
088                            return toJson(obj, obj.getClass(), flat);
089                    else
090                            return toJson(obj, null, flat);
091            }
092    
093            public JsonObject toJson(Object obj) throws IllegalArgumentException,
094                            IllegalAccessException, InvocationTargetException {
095    
096                    if (obj != null)
097                            return toJson(obj, obj.getClass());
098                    else
099                            return toJson(obj, null);
100            }
101            /**
102             * Maps a collection to jsonarray based on a class, this method only works
103             * when using the default mapper and is meant to be called via convenience
104             * method on Converter.
105             * 
106             * @param col
107             * @param cls
108             * @return
109             * @throws InvocationTargetException
110             * @throws IllegalAccessException
111             * @throws IllegalArgumentException
112             * @throws SecurityException
113             * @throws IllegalArgumentException
114             * @throws NoSuchMethodException
115             * @throws IllegalAccessException
116             * @throws InvocationTargetException
117             */
118            protected JsonArray toJsonArray(Collection col, Class cls)
119                            throws IllegalArgumentException, IllegalAccessException,
120                            InvocationTargetException {
121                    return toJsonArray(col, cls, false);
122            }
123            /**
124             * Maps a collection to jsonarray based on a class, this method only works
125             * when using the default mapper and is meant to be called via convenience
126             * method on Converter.
127             * 
128             * @param col
129             * @param cls
130             * @return
131             * @throws InvocationTargetException
132             * @throws IllegalAccessException
133             * @throws IllegalArgumentException
134             * @throws SecurityException
135             * @throws IllegalArgumentException
136             * @throws NoSuchMethodException
137             * @throws IllegalAccessException
138             * @throws InvocationTargetException
139             */
140            protected JsonArray toJsonArray(Collection col, Class cls, boolean flat)
141                            throws IllegalArgumentException, IllegalAccessException,
142                            InvocationTargetException {
143                    JsonArray arr = new JsonArray();
144    
145                    if (col != null) {
146                            for (Object o : col) {
147                                    Class cls2 = cls;
148                                    if (cls2 == null)
149                                            cls2 = o.getClass();
150                                    if (!Utils.objectIntoJsonArray(arr, o)) {
151                                            JsonObject json = toJson(o, cls2, flat);
152                                            arr.add(json);
153                                    }
154                            }
155                    }
156    
157                    return arr;
158            }
159    
160            public JsonArray toJsonArray(Collection col)
161                            throws IllegalArgumentException, IllegalAccessException,
162                            InvocationTargetException {
163                    return toJsonArray(col, null);
164            }
165    
166            public JsonArray toJsonArray(Collection col, boolean flat)
167                            throws IllegalArgumentException, IllegalAccessException,
168                            InvocationTargetException {
169                    return toJsonArray(col, null, flat);
170            }
171    }