package http.resource;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Reader;
import java.io.Writer;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import nebula.data.DataStore;
import nebula.data.Entity;
import nebula.data.json.DataHelper;
import util.FileUtil;
public class AttachedEntityListResouce extends AbstractResouce {
private final DataHelper<Entity, Reader, Writer> jsonHolder;
private final DataStore<Entity> datastoreHolder;
// final LoadingCache<String, DataHolder> dataCache;
DataHolder dataCached;
class DataHolder {
String classificatorName;
String value;
byte[] buffer;
public DataHolder(DataStore<Entity> datastoreHolder, String classificatorName, String value) {
this.classificatorName = classificatorName;
this.value = checkNotNull(value);
}
byte[] get() {
List<Entity> dataList = datastoreHolder.getClassificator(classificatorName).getData(value);
return buildFrom(dataList);
}
}
private byte[] buildFrom(List<Entity> dataList) {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bout);
boolean start = true;
out.append('[');
for (Entity data : dataList) {
if (!start) {
out.append(',');
} else {
start = false;
}
jsonHolder.stringifyTo(data, new OutputStreamWriter(out));
}
out.append(']');
out.flush();
out.close();
return bout.toByteArray();
}
public AttachedEntityListResouce(DataHelper<Entity, Reader, Writer> json, DataStore<Entity> datas, final String attachedToTypeName, final String attachToID) {
super("text/json", 0, 1000);
this.jsonHolder = json;
this.datastoreHolder = datas;
this.dataCached = new DataHolder(datastoreHolder, attachedToTypeName, attachToID);
}
protected void get(HttpServletRequest req) {
this.cache = dataCached.get();
this.lastModified = System.currentTimeMillis();
}
@Override
protected String post(HttpServletRequest req) throws IOException {
DataStore<Entity> store = datastoreHolder;
InputStream in = req.getInputStream();
if (log.isTraceEnabled()) {
in = FileUtil.print(in);
}
Entity inData = jsonHolder.readFrom(null, new InputStreamReader(in));
store.add(inData);
store.flush();
return req.getPathInfo() + inData.getID();
}
}