package edu.isi.karma.controller.update;
import java.io.PrintWriter;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.alignment.SemanticTypes;
import edu.isi.karma.view.VHNode;
import edu.isi.karma.view.VWorksheet;
import edu.isi.karma.view.VWorkspace;
public class AllWorksheetHeadersUpdate extends AbstractUpdate {
private String worksheetId;
private boolean deleteAfterGenerate;
private enum JsonKeys {
worksheetId, columns, name, id, visible, hideable, children
}
public AllWorksheetHeadersUpdate(String worksheetId, boolean deleteAfterGenerate) {
super();
this.worksheetId = worksheetId;
this.deleteAfterGenerate = deleteAfterGenerate;
}
@Override
public void generateJson(String prefix, PrintWriter pw,
VWorkspace vWorkspace) {
VWorksheet vWorksheet = vWorkspace.getViewFactory().getVWorksheetByWorksheetId(worksheetId);
try {
JSONObject response = new JSONObject();
response.put(JsonKeys.worksheetId.name(), worksheetId);
response.put(AbstractUpdate.GenericJsonKeys.updateType.name(),
this.getClass().getSimpleName());
Worksheet wk = vWorksheet.getWorksheet();
List<VHNode> viewHeaders = vWorksheet.getHeaderViewNodes();
JSONArray columns = getColumnsJsonArray(viewHeaders, wk.getSemanticTypes());
response.put(JsonKeys.columns.name(), columns);
pw.println(response.toString());
if (deleteAfterGenerate) {
vWorkspace.getWorkspace().getFactory().removeWorksheet(wk.getId(), vWorkspace.getWorkspace().getCommandHistory());
vWorkspace.getViewFactory().removeWorksheet(wk.getId());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
private JSONArray getColumnsJsonArray(List<VHNode> viewHeaders, SemanticTypes semTypes) {
JSONArray columns = new JSONArray();
for(VHNode headerNode : viewHeaders) {
JSONObject column = new JSONObject();
column.put(JsonKeys.id.name(), headerNode.getId());
column.put(JsonKeys.name.name(), headerNode.getColumnName());
column.put(JsonKeys.visible.name(), headerNode.isVisible());
boolean hideable = (semTypes.getSemanticTypeForHNodeId(headerNode.getId()) == null) ? true : false;
if(headerNode.hasNestedTable()) {
JSONArray children = getColumnsJsonArray(headerNode.getNestedNodes(), semTypes);
if (children.length() > 0)
column.put(JsonKeys.children.name(), children);
if(hideable) {
//check if any of the children are not hideable, then this is not hideable
for(int i=0; i<children.length(); i++) {
JSONObject child = children.getJSONObject(i);
if(child.getBoolean("hideable") == false) {
hideable = false;
break;
}
}
}
}
column.put(JsonKeys.hideable.name(), hideable);
columns.put(column);
}
return columns;
}
public boolean equals(Object o) {
if (o instanceof AllWorksheetHeadersUpdate) {
AllWorksheetHeadersUpdate t = (AllWorksheetHeadersUpdate)o;
return t.worksheetId.equals(worksheetId);
}
return false;
}
@Override
public int hashCode() {
int result = this.worksheetId != null ? this.worksheetId.hashCode() : 0;
result = 31 * result + (this.deleteAfterGenerate ? 1 : 0);
return result;
}
}