/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.eas.client.threetier.json;
import com.eas.client.changes.Change;
import com.eas.client.changes.ChangeValue;
import com.eas.client.changes.ChangeVisitor;
import com.eas.client.changes.Command;
import com.eas.client.changes.Delete;
import com.eas.client.changes.Insert;
import com.eas.client.changes.Update;
import com.eas.util.JsonUtils;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author mg
*/
public class ChangesJSONWriter implements ChangeVisitor {
private static final String CHANGE_DATA_NAME = "data";
private static final String CHANGE_KEYS_NAME = "keys";
private static final String CHANGE_PARAMETERS_NAME = "parameters";
private static final String CHANGE_KIND_NAME = "kind";
private static final String CHANGE_ENTITY_NAME = "entity";
protected String written;
public ChangesJSONWriter() {
super();
}
public static String write(List<Change> aLog) throws Exception {
List<String> changes = new ArrayList<>();
for (Change change : aLog) {
ChangesJSONWriter changeWriter = new ChangesJSONWriter();
change.accept(changeWriter);
changes.add(changeWriter.getWritten());
}
String changesJson = JsonUtils.a(changes.toArray(new String[]{})).toString();
return changesJson;
}
public String getWritten() {
return written;
}
@Override
public void visit(Insert aChange) throws Exception {
List<String> data = new ArrayList<>();
for (ChangeValue datum : aChange.getData()) {
data.add(datum.name);
data.add(JsonUtils.v(datum.value));
}
written = JsonUtils.o(CHANGE_KIND_NAME, JsonUtils.s("insert").toString(),
CHANGE_ENTITY_NAME, JsonUtils.s(aChange.entityName).toString(),
CHANGE_DATA_NAME, JsonUtils.o(data.toArray(new String[]{})).toString()
).toString();
}
@Override
public void visit(Update aChange) throws Exception {
List<String> data = new ArrayList<>();
for (ChangeValue datum : aChange.getData()) {
data.add(datum.name);
data.add(JsonUtils.v(datum.value));
}
List<String> keys = new ArrayList<>();
for (ChangeValue key : aChange.getKeys()) {
keys.add(key.name);
keys.add(JsonUtils.v(key.value));
}
written = JsonUtils.o(CHANGE_KIND_NAME, JsonUtils.s("update").toString(),
CHANGE_ENTITY_NAME, JsonUtils.s(aChange.entityName).toString(),
CHANGE_DATA_NAME, JsonUtils.o(data.toArray(new String[]{})).toString(),
CHANGE_KEYS_NAME, JsonUtils.o(keys.toArray(new String[]{})).toString()
).toString();
}
@Override
public void visit(Delete aChange) throws Exception {
List<String> keys = new ArrayList<>();
for (ChangeValue key : aChange.getKeys()) {
keys.add(key.name);
keys.add(JsonUtils.v(key.value));
}
written = JsonUtils.o(CHANGE_KIND_NAME, JsonUtils.s("delete").toString(),
CHANGE_ENTITY_NAME, JsonUtils.s(aChange.entityName).toString(),
CHANGE_KEYS_NAME, JsonUtils.o(keys.toArray(new String[]{})).toString()
).toString();
}
@Override
public void visit(Command aChange) throws Exception {
List<String> params = new ArrayList<>();
for (ChangeValue parameter : aChange.getParameters()) {
params.add(parameter.name);
params.add(JsonUtils.v(parameter.value));
}
written = JsonUtils.o(CHANGE_KIND_NAME, JsonUtils.s("command").toString(),
CHANGE_ENTITY_NAME, JsonUtils.s(aChange.entityName).toString(),
CHANGE_PARAMETERS_NAME, JsonUtils.o(params.toArray(new String[]{})).toString()
).toString();
}
}