/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.entity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
/**
* @author Jason Polites
*
*/
public abstract class JSONFactory<T extends Object> {
public static final String DATE_FORMAT_STRING = "yyyy-MM-dd HH:mm:ssZZ";
protected final DateFormat DATE_FORMAT = new SimpleDateFormat(DATE_FORMAT_STRING);
public JSONFactory() {
super();
}
public JSONArray toJSON(Collection<T> objects) throws JSONException {
JSONArray array = instantiateJSONArray();
for (T t : objects) {
array.put(toJSON(t));
}
return array;
}
public JSONObject toJSON(T object) throws JSONException {
JSONObject json = instantiateJSON();
toJSON(object, json);
return json;
}
@SuppressWarnings("unchecked")
public T fromJSON(JSONObject json) throws JSONException {
T object = (T) instantiateObject(json);
if(object != null) {
fromJSON(json, object);
}
return object;
}
public JSONObject instantiateJSON() {
return new JSONObject();
}
public JSONArray instantiateJSONArray() {
return new JSONArray();
}
protected boolean exists(JSONObject obj, String key) throws JSONException {
return (obj.has(key) && !obj.isNull(key));
}
protected String getString(JSONObject obj, String key) throws JSONException {
if(exists(obj, key)) {
return obj.getString(key);
}
return null;
}
protected Double getDouble(JSONObject obj, String key) throws JSONException {
if(exists(obj, key)) {
return obj.getDouble(key);
}
return null;
}
protected boolean getBoolean(JSONObject obj, String key, boolean defaultValue) throws JSONException {
if(exists(obj, key)) {
return obj.getBoolean(key);
}
return defaultValue;
}
protected JSONObject getJSONObject(JSONObject obj, String key) throws JSONException {
if(exists(obj, key)) {
return obj.getJSONObject(key);
}
return null;
}
protected int getInt(JSONObject obj, String key) throws JSONException {
if(exists(obj, key)) {
return obj.getInt(key);
}
return 0;
}
protected long getLong(JSONObject obj, String key) throws JSONException {
return getLong(obj, key, 0);
}
protected long getLong(JSONObject obj, String key, long defaultValue) throws JSONException {
if(exists(obj, key)) {
return obj.getLong(key);
}
return defaultValue;
}
protected Long getLongObject(JSONObject obj, String key) throws JSONException {
if(exists(obj, key)) {
return Long.valueOf(obj.getLong(key));
}
return null;
}
// This SHOULD return the generic type "T" but because javassist (via AndroidMock) doesn't seem to
// want to create methods with generic return types we can't do it :/
public abstract Object instantiateObject(JSONObject object);
protected abstract void fromJSON(JSONObject from, T to) throws JSONException;
protected abstract void toJSON(T from, JSONObject to) throws JSONException;
}