package er.ajax.json.serializer;
import org.jabsorb.serializer.AbstractSerializer;
import org.jabsorb.serializer.MarshallException;
import org.jabsorb.serializer.ObjectMatch;
import org.jabsorb.serializer.SerializerState;
import org.jabsorb.serializer.UnmarshallException;
import org.json.JSONException;
import org.json.JSONObject;
import com.webobjects.foundation.NSTimeZone;
import com.webobjects.foundation.NSTimestamp;
public class NSTimestampSerializer extends AbstractSerializer {
private final static long serialVersionUID = 1;
private static Class[] _serializableClasses = new Class[] { NSTimestamp.class };
private static Class[] _JSONClasses = new Class[] { JSONObject.class };
public Class[] getSerializableClasses() {
return _serializableClasses;
}
public Class[] getJSONClasses() {
return _JSONClasses;
}
public ObjectMatch tryUnmarshall(SerializerState state, Class clazz, Object o) throws UnmarshallException {
try {
JSONObject jso = (JSONObject) o;
String java_class = jso.getString("javaClass");
if (java_class == null) {
throw new UnmarshallException("no type hint");
}
if (!(java_class.equals("com.webobjects.foundation.NSTimestamp"))) {
throw new UnmarshallException("not a NSTimestamp");
}
long time = jso.getLong("time");
String tz = jso.getString("tz");
return ObjectMatch.OKAY;
}
catch (JSONException e) {
throw new UnmarshallException("Failed to unmarshall NSTimestamp.", e);
}
}
public Object unmarshall(SerializerState state, Class clazz, Object o) throws UnmarshallException {
try {
JSONObject jso = (JSONObject) o;
long time = jso.getLong("time");
String tz = jso.getString("tz");
if (jso.has("javaClass")) {
try {
clazz = Class.forName(jso.getString("javaClass"));
}
catch (ClassNotFoundException cnfe) {
throw new UnmarshallException(cnfe.getMessage());
}
}
if (NSTimestamp.class.equals(clazz)) {
NSTimestamp timestamp = new NSTimestamp(time, NSTimeZone.getTimeZone(tz));
state.setSerialized(o, timestamp);
return timestamp;
}
throw new UnmarshallException("invalid class " + clazz);
}
catch (JSONException e) {
throw new UnmarshallException("Failed to unmarshall NSTimestamp.", e);
}
}
public Object marshall(SerializerState state, Object p, Object o) throws MarshallException {
try {
long time;
String tz;
if (o instanceof NSTimestamp) {
time = ((NSTimestamp) o).getTime();
tz = ((NSTimestamp) o).timeZone().getID();
}
else {
throw new MarshallException("cannot marshall date using class " + o.getClass());
}
JSONObject obj = new JSONObject();
if (ser.getMarshallClassHints()) {
obj.put("javaClass", o.getClass().getName());
}
obj.put("time", time);
obj.put("tz", tz);
return obj;
}
catch (JSONException e) {
throw new MarshallException("Failed to marshall NSTimestamp.", e);
}
}
}