package nebula.data.json; import java.util.ArrayList; import java.util.List; import nebula.data.Entity; import nebula.data.impl.EditableEntity; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonToken; public class EntityListSerializer extends DefaultFieldSerializer<List<Entity>> { public EntityListSerializer(String fieldName, String frontName, EntitySerializer entityMerger) { super(fieldName, frontName); this.entityMerger = entityMerger; } final EntitySerializer entityMerger; @Override public void input(JsonParser in, Entity parent, List<Entity> current) throws Exception { if (current == null) { inputWithoutCheck(in, parent); } List<Entity> newlyList = new ArrayList<Entity>(); JsonToken token; token = in.getCurrentToken(); assert token == JsonToken.START_ARRAY; boolean dirty = false; // int i = 0; while ((token = in.nextToken()) != JsonToken.END_ARRAY) { Entity newly = entityMerger.doReadInList(in, current); // long idx = (long) newly.get("_idx"); // TODO Not realized remove when no data changed // if (idx != i) { // newly.put("_idx", idx); // dirty = true; // } dirty = newly.isDirty() || dirty; } for(Entity entity : current){ entity.put("_IDX", newlyList.size()); String action =(String) entity.get("_STS"); if("D".equals(action)){ continue; } newlyList.add(entity); } assert token == JsonToken.END_ARRAY; if (dirty) { parent.put(fieldName, newlyList); } } @Override public void inputWithoutCheck(JsonParser in, Entity parent) throws Exception { List<Entity> vList = new ArrayList<Entity>(); JsonToken token; token = in.getCurrentToken(); assert token == JsonToken.START_ARRAY; while ((token = in.nextToken()) != JsonToken.END_ARRAY) { Entity newly = entityMerger.doReadWithoutCheck(in, new EditableEntity()); vList.add(newly); } assert token == JsonToken.END_ARRAY; parent.put(fieldName, vList); } @Override public void output(JsonGenerator gen, List<Entity> current) throws Exception { gen.writeStartArray(); if (current != null) { for (int i = 0; i < current.size(); i++) { Entity entity = current.get(i); entity.put("_IDX", i); entityMerger.outputInList(gen, entity); } } gen.writeEndArray(); } }