package http.resource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import nebula.data.Broker;
import nebula.data.DataRepos;
import nebula.data.DataStore;
import nebula.data.Entity;
import nebula.data.json.DataHelper;
import nebula.data.json.JsonHelperProvider;
import nebula.flow.FlowEngine;
import nebula.lang.Flow;
import nebula.lang.Flow.Step;
import nebula.lang.RuntimeContext;
import nebula.lang.Type;
public class FlowNewResouce extends AbstractResouce {
static final String Field_Flow_ID = "FlowID";
static final String Field_Step_Name = "StepName";
static final String Field_GetAction_Name = "$getaction";
static final String Field_Action_Name = "$action";
final FlowEngine engine;
private Type type;
// private final DataStore<Entity> datastore;
private final DataHelper<Entity, Reader, Writer> jsonflow;
private final Map<String, DataHelper<Entity, Reader, Writer>> stepJsons;
public FlowNewResouce(final DataRepos dataRepos, DataStore<Entity> datas, Type type) {
super("text/json", 1, 1);
this.type = type;
Flow flow = (Flow)Broker.valueOf(type);
this.engine = new FlowEngine(dataRepos, flow);
stepJsons = new HashMap<String, DataHelper<Entity, Reader, Writer>>();
for (Step step : flow.getSteps()) {
stepJsons.put(step.getName(), JsonHelperProvider.getHelper(step.getType()));
}
jsonflow = JsonHelperProvider.getHelper(type);
}
@Override
protected void get(HttpServletRequest req) throws IOException {
Entity data = null;
data = engine.start(new RuntimeContext());
List<Entity> steps = data.get("steps");
Entity currentStepEntity = steps.get(steps.size() - 1);
Flow flow = (Flow)Broker.valueOf(type);
Step currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep));
DataHelper<Entity, Reader, Writer> jsonStep = this.stepJsons.get(currentStep.getName());
long newModified = System.currentTimeMillis();
ByteArrayOutputStream bout = null;
try {
bout = new ByteArrayOutputStream();
Writer write = new OutputStreamWriter(bout);
write.write('{');
{
write.write("\"flow\":");
jsonflow.stringifyTo(data, write);
write.write(",\"step\":");
jsonStep.stringifyTo(currentStepEntity, write);
}
write.write('}');
write.flush();
this.lastModified = newModified;
this.cache = bout.toByteArray();
} finally {
try {
if (bout != null) bout.close();
} catch (Exception e) {
}
}
}
@Override
protected void put(HttpServletRequest req) throws IOException {
throw new RuntimeException("Cann't find object ");
}
@Override
protected void delete(HttpServletRequest req) {
throw new RuntimeException("Cann't find object ");
}
}