package org.openntf.domino.rest.json;
// import com.ibm.domino.services.util.JsonWriter;
import com.ibm.commons.util.AbstractIOException;
import com.ibm.commons.util.io.json.JsonException;
import com.ibm.commons.util.io.json.JsonReference;
import com.ibm.commons.util.io.json.util.JsonWriter;
import com.tinkerpop.frames.EdgeFrame;
import com.tinkerpop.frames.VertexFrame;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;
import org.openntf.domino.DateTime;
import org.openntf.domino.graph2.impl.DFramedTransactionalGraph;
import org.openntf.domino.rest.resources.frames.JsonFrameAdapter;
import org.openntf.domino.rest.service.Parameters.ParamMap;
public class JsonGraphWriter extends JsonWriter {
protected DFramedTransactionalGraph<?> graph_;
protected ParamMap parameters_;
private static ThreadLocal<SimpleDateFormat> ISO8601_UTC = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
TimeZone localTimeZone = TimeZone.getTimeZone("UTC");
SimpleDateFormat result = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
result.setTimeZone(localTimeZone);
return result;
}
};
private static ThreadLocal<SimpleDateFormat> ISO8601_DT = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
};
};
private static ThreadLocal<SimpleDateFormat> ISO8601_DO = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
};
};
private static ThreadLocal<SimpleDateFormat> ISO8601_TO = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("HH:mm:ss");
};
};
private boolean forceLowerCaseKeys_ = false;
public JsonGraphWriter(Writer arg1, DFramedTransactionalGraph<?> graph, ParamMap parameters, boolean arg2,
boolean forceLowerCaseKeys) {
super(JsonGraphFactory.instance, arg1, arg2);
forceLowerCaseKeys_ = forceLowerCaseKeys;
parameters_ = parameters;
graph_ = graph;
}
public void outDateLiteral(Date paramDate) throws IOException {
String str = dateToString(paramDate, true);
outStringLiteral(str);
}
public void outDateLiteral(DateTime paramDateTime) throws IOException {
String str = dateToString(paramDateTime, true);
out(str);
}
private String dateOnlyToString(Date paramDate) {
return ISO8601_DO.get().format(paramDate);
}
private String timeOnlyToString(Date paramDate) {
return ISO8601_TO.get().format(paramDate);
}
private String dateToString(DateTime paramDateTime, boolean paramBoolean) throws IOException {
return dateToString(paramDateTime.toJavaDate(), paramBoolean);
}
private String dateToString(Date paramDate, boolean paramBoolean) throws IOException {
String str = null;
if (paramBoolean) {
str = ISO8601_UTC.get().format(paramDate);
} else {
str = ISO8601_DT.get().format(paramDate);
}
return str;
}
@Override
public void outObject(Object paramObject) throws IOException, JsonException {
// System.out.println("TEMP DEBUG Attempting to jsonify an object of "
// + (paramObject == null ? "NULL" : paramObject.getClass().getName()));
if (paramObject == null) {
super.outNull();
} else if (paramObject instanceof EdgeFrame) {
JsonFrameAdapter adapter = new JsonFrameAdapter(graph_, (EdgeFrame) paramObject, parameters_);
super.outObject(adapter);
} else if (paramObject instanceof VertexFrame) {
JsonFrameAdapter adapter = new JsonFrameAdapter(graph_, (VertexFrame) paramObject, parameters_);
super.outObject(adapter);
} else if (paramObject instanceof Class<?>) {
String className = ((Class<?>) paramObject).getName();
super.outStringLiteral(className);
} else if (paramObject instanceof Enum) {
String className = ((Enum<?>) paramObject).getClass().getName();
String enumName = ((Enum<?>) paramObject).name();
super.outStringLiteral(className + " " + enumName);
} else if (paramObject instanceof org.openntf.domino.impl.View.DominoColumnInfo) {
String itemName = ((org.openntf.domino.impl.View.DominoColumnInfo) paramObject).getItemName();
super.outStringLiteral(itemName);
} else if (paramObject instanceof Set) {
// System.out.println("TEMP DEBUG outObject received a Set");
outArrayLiteral(((Set) paramObject).toArray());
} else if (paramObject instanceof DateTime) {
// System.out.println("TEMP DEBUG outObject received a Set");
outArrayLiteral(paramObject);
} else {
// Class<?> clazz = paramObject.getClass();
// String name = clazz.getName();
super.outObject(paramObject);
}
}
@SuppressWarnings("rawtypes")
public void outDominoValue(Object paramObject) throws IOException {
try {
if (paramObject == null) {
outNull();
return;
}
if (paramObject instanceof String) {
outStringLiteral((String) paramObject);
return;
}
if (paramObject instanceof Number) {
outNumberLiteral(((Number) paramObject).doubleValue());
return;
}
if (paramObject instanceof Boolean) {
outBooleanLiteral(((Boolean) paramObject).booleanValue());
return;
}
if (paramObject instanceof Date) {
outStringLiteral(dateToString((Date) paramObject, true));
return;
}
if (paramObject instanceof DateTime) {
if (((DateTime) paramObject).getDateOnly().length() == 0) {
outStringLiteral(timeOnlyToString(((DateTime) paramObject).toJavaDate()));
return;
}
if (((DateTime) paramObject).getTimeOnly().length() == 0) {
outStringLiteral(dateOnlyToString(((DateTime) paramObject).toJavaDate()));
return;
}
outStringLiteral(dateToString(((DateTime) paramObject).toJavaDate(), true));
return;
}
if (paramObject instanceof Vector) {
startArray();
Vector localVector = (Vector) paramObject;
int i = localVector.size();
for (int j = 0; j < i; ++j) {
startArrayItem();
outDominoValue(localVector.get(j));
endArrayItem();
}
endArray();
return;
}
outStringLiteral("???");
} catch (JsonException localJsonException) {
throw new AbstractIOException(localJsonException, "");
}
}
@Override
public void outPropertyName(String arg0) throws IOException {
if (forceLowerCaseKeys_) {
super.outPropertyName(arg0.toLowerCase());
} else {
super.outPropertyName(arg0);
}
}
@Override
public void outArrayLiteral(Object arg0, boolean paramBoolean) throws IOException, JsonException {
// Class<?> clazz = arg0.getClass();
// String name = clazz.getName();
// System.out.println("DEBUG: Attempting to jsonify an array " + name);
super.outArrayLiteral(arg0, paramBoolean);
}
@Override
public void outArrayLiteral(Object arg0) throws IOException, JsonException {
// Class<?> clazz = arg0.getClass();
// String name = clazz.getName();
// System.out.println("DEBUG: Attempting to jsonify an array " + name);
super.outArrayLiteral(arg0);
}
@SuppressWarnings("rawtypes")
@Override
protected void outLiteral(Object paramObject, boolean paramBoolean) throws IOException, JsonException {
// System.out.println("TEMP DEBUG outputting a literal of "
// + (paramObject == null ? "NULL VALUE" :
// paramObject.getClass().getName()));
if (this.getFactory().isNull(paramObject)) {
outNull();
} else if (paramObject instanceof EdgeFrame) {
JsonFrameAdapter adapter = new JsonFrameAdapter(graph_, (EdgeFrame) paramObject, parameters_);
outObject(adapter);
} else if (paramObject instanceof VertexFrame) {
JsonFrameAdapter adapter = new JsonFrameAdapter(graph_, (VertexFrame) paramObject, parameters_);
outObject(adapter);
} else if (paramObject instanceof Class<?>) {
String className = ((Class) paramObject).getName();
outStringLiteral(className);
} else if (paramObject instanceof Enum) {
String className = ((Enum) paramObject).getClass().getName();
String enumName = ((Enum) paramObject).name();
outStringLiteral(className + " " + enumName);
} else if (paramObject instanceof CharSequence) {
outStringLiteral(paramObject.toString());
} else if (paramObject instanceof Set) {
// System.out.println("TEMP DEBUG Got a set!");
outArrayLiteral(((Set) paramObject).toArray());
} else if (this.getFactory().isString(paramObject)) {
outStringLiteral(this.getFactory().getString(paramObject));
} else if (this.getFactory().isNumber(paramObject)) {
outNumberLiteral(this.getFactory().getNumber(paramObject));
} else if (this.getFactory().isBoolean(paramObject)) {
outBooleanLiteral(this.getFactory().getBoolean(paramObject));
} else if (this.getFactory().isObject(paramObject)) {
outObject(paramObject, paramBoolean);
} else if (this.getFactory().isArray(paramObject)) {
outArrayLiteral(paramObject, paramBoolean);
} else if (paramObject instanceof JsonReference) {
outReference((JsonReference) paramObject);
} else if (paramObject instanceof DateTime) {
DateTime dt = (DateTime) paramObject;
outDateLiteral_(dt.toJavaDate());
} else if (paramObject instanceof Date) {
outDateLiteral_((Date) paramObject);
} else {
outStringLiteral("JsonGenerator cannot process unknown type of "
+ ((paramObject != null) ? paramObject.getClass().getName() : "<null>"));
}
}
}