package http.resource; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.util.Map; import javax.servlet.http.HttpServletRequest; import nebula.data.DataRepos; import nebula.data.DataStore; import nebula.data.Entity; import nebula.data.impl.EditableEntity; import nebula.data.json.DataHelper; import nebula.lang.Field; import nebula.lang.NebulaNative; import nebula.lang.RuntimeContext; import nebula.lang.Type; public class EntityResouce extends AbstractResouce { private final DataHelper<Entity, Reader, Writer> json; final DataRepos dataRepos; private final String key; private final Type type; private final DataStore<Entity> datastore; public EntityResouce(final DataRepos dataRepos, DataHelper<Entity, Reader, Writer> json, DataStore<Entity> datas, Type type, String key) { super("text/json", 50, 50); this.dataRepos = dataRepos; this.json = json; this.datastore = datas; this.type = type; this.key = key; } @Override protected void get(HttpServletRequest req) throws IOException { Entity data; String action = req.getParameter("$getaction"); long newModified; if (action == null) { data = datastore.get(key); newModified = (Long) data.get("LastModified_"); } else { EditableEntity editableData = new EditableEntity(); for (Map.Entry<String, String[]> e : req.getParameterMap().entrySet()) { if (e.getKey().startsWith("data.")) { String fieldName = e.getKey().substring("data.".length()); Field field = type.getField(fieldName); switch (field.getType().getRawType()) { case String: case Text: editableData.put(fieldName, e.getValue()[0]); break; case Long: editableData.put(fieldName, Long.parseLong(e.getValue()[0])); break; case Boolean: editableData.put(fieldName, Boolean.parseBoolean(e.getValue()[0])); break; case Date: case Datetime: case Decimal: case Time: case Timestamp: default: } } } RuntimeContext context = new RuntimeContext(); NebulaNative.execOnChangeMethod(context, dataRepos, editableData, type, action.substring("data.".length())); data = editableData; newModified = System.currentTimeMillis(); } ByteArrayOutputStream bout = null; try { bout = new ByteArrayOutputStream(); Writer write = new OutputStreamWriter(bout); json.stringifyTo(data, new OutputStreamWriter(bout)); 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 { Entity data = datastore.get(key).editable(); if (data != null) { json.readFrom(data, new InputStreamReader(req.getInputStream())); String action = req.getParameter("$action"); if (action != null && !"save".equals(action)) { RuntimeContext context = new RuntimeContext(); NebulaNative.execMethod(context, dataRepos, data, type, action); } datastore.flush(); } else { throw new RuntimeException("Cann't find object " + key); } } @Override protected void delete(HttpServletRequest req) { throw new RuntimeException("Cann't find object " + key); } }