package http.resource;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import javax.servlet.http.HttpServletRequest;
import nebula.data.DataRepos;
import nebula.data.json.DataHelper;
import nebula.data.json.JsonHelperProvider;
import nebula.lang.Type;
import nebula.lang.TypeLoader;
import util.FileUtil;
public class TypeEditableResouce extends AbstractResouce {
private final DataHelper<Type, Reader, Writer> json;
private final String key;
final TypeLoader typeLoader;
final DataRepos dataWareHouse;
public TypeEditableResouce(final DataRepos dataWareHouse, TypeLoader typeLoader, String key) {
super("text/json", 60 * 60, 1000);
this.dataWareHouse = dataWareHouse;
this.key = key;
this.typeLoader = typeLoader;
this.json = JsonHelperProvider.getSerialize(Type.class);
}
@Override
protected void get(HttpServletRequest req) throws IOException {
Type data = typeLoader.findType(key);
long newModified = data.getLastModified();
// if (newModified == this.lastModified) return;
ByteArrayOutputStream bout = null;
try {
bout = new ByteArrayOutputStream();
Writer w = new OutputStreamWriter(bout);
json.stringifyTo(data, new OutputStreamWriter(bout));
w.flush();
this.lastModified = newModified;
this.cache = bout.toByteArray();
} finally {
try {
if (bout != null) bout.close();
} catch (Exception e2) {
}
}
}
@Override
protected void put(HttpServletRequest req) throws IOException {
BufferedInputStream bio = new BufferedInputStream(req.getInputStream());
if (log.isTraceEnabled()) {
log.trace("Input stream : ");
log.trace(FileUtil.readAllTextFrom(bio));
}
Type type = typeLoader.findType(key);
String oldCode = type.getCode();
String newCode = FileUtil.readAllTextFrom(bio);
if (!oldCode.equals(newCode)) {
if (log.isTraceEnabled()) {
log.trace("Replace:");
log.trace(oldCode);
log.trace(" with: ");
log.trace(type.getCode());
}
type = typeLoader.update(type, newCode);
} else {
if (log.isTraceEnabled()) {
log.trace("No Change:");
log.trace(type.getCode());
}
}
}
}