package nebula.data.json;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import nebula.data.Broker;
import nebula.data.DataAdapter;
import nebula.data.Entity;
import nebula.lang.Type;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParser;
public class JsonHelperProvider {
static JsonFactory factory = new JsonFactory();
@SuppressWarnings("unchecked")
public static <T> DataHelper<T, Reader, Writer> getSerialize(Class<T> clz) {
DataHelper<T, Reader, Writer> s;
if (clz == Type.class) {
s = (DataHelper<T, Reader, Writer>) new DefaultJsonHelper<Type>(factory, new TypeSerializer());
} else {
s = null;
}
return s;
}
@SuppressWarnings("unchecked")
public static <T> DataHelper<T, Reader, Writer> getSimpleSerialize(Class<T> clz) {
DataHelper<T, Reader, Writer> s;
if (clz == Type.class) {
s = (DataHelper<T, Reader, Writer>) new DefaultJsonHelper<Type>(factory, new SimpleTypeSerializer());
} else {
s = null;
}
return s;
}
// public static JsonHelper<Entity> getHelper(Type type) {
// return new DefaultJsonHelper<>(factory, new EntityJsonDataDealer(type));
// }
public static DataHelper<Entity, Reader, Writer> getHelper(final Type type) {
DataHelper<Entity, Reader, Writer> broker = Broker.watch(type, new DataAdapter<Type, DataHelper<Entity, Reader, Writer>>() {
@Override
public DataHelper<Entity, Reader, Writer> watch(Type newData, Type oldData) {
return new DefaultJsonHelper<Entity>(factory, new EntitySerializer(newData));
}
});
return broker;
}
public static DataHelper<Entity, Reader, Writer> getFlowHelper(final Type flow, final Type step) {
DataHelper<Entity, Reader, Writer> broker = Broker.watch(flow, new DataAdapter<Type, DataHelper<Entity, Reader, Writer>>() {
@Override
public DataHelper<Entity, Reader, Writer> watch(Type newData, Type oldData) {
return new DefaultJsonHelper<Entity>(factory, new FlowEntitySerializer(new EntitySerializer(newData), new EntitySerializer(step)));
}
});
return broker;
}
public static DataHelper<Entity, Reader, Writer> getSimpleHelper(final Type type) {
DataHelper<Entity, Reader, Writer> broker = Broker.watch(type, new DataAdapter<Type, DataHelper<Entity, Reader, Writer>>() {
@Override
public DataHelper<Entity, Reader, Writer> watch(Type newData, Type oldData) {
return new DefaultJsonHelper<Entity>(factory, new SimpleEntitySerializer(newData));
}
});
return broker;
}
}
class DefaultJsonHelper<T> implements DataHelper<T, Reader, Writer> {
final protected JsonFactory factory;
final protected JsonDataHelper<T> dataHelper;
public DefaultJsonHelper(JsonFactory factory, JsonDataHelper<T> dataHelper) {
this.factory = factory;
this.dataHelper = dataHelper;
}
@Override
public void stringifyTo(T d, Writer o) {
try {
JsonGenerator gen = this.factory.createJsonGenerator(o);
// gen.writeStartObject();
this.dataHelper.stringifyTo(d, gen);
gen.flush();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public T readFrom(T d, Reader in) {
try {
JsonParser parser = this.factory.createJsonParser(in);
d = this.dataHelper.readFrom(d, parser);
parser.close();
return d;
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}