/*******************************************************************************
* Copyright 2012 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.controller.update;
import java.io.PrintWriter;
import java.util.List;
import java.util.Objects;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.rep.Node;
import edu.isi.karma.rep.Row;
import edu.isi.karma.rep.Table;
import edu.isi.karma.rep.TablePager;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.view.VHNode;
import edu.isi.karma.view.VWorksheet;
import edu.isi.karma.view.VWorkspace;
import edu.isi.karma.view.ViewPreferences.ViewPreference;
public class WorksheetDataUpdate extends AbstractUpdate {
private final String worksheetId;
private static Logger logger = LoggerFactory.getLogger(WorksheetDataUpdate.class);
private final SuperSelection selection;
private enum JsonKeys {
worksheetId, rows, columnName, characterLength, hasNestedTable, columnClass,
displayValue, expandedValue, nestedRows, additionalRowsCount, tableId,
nodeId, rowId, isSelected, rowValueArray
}
public WorksheetDataUpdate(String worksheetId, SuperSelection selection) {
super();
this.worksheetId = worksheetId;
this.selection = selection;
}
@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();
Table dataTable = wk.getDataTable();
TablePager pager = vWorksheet.getTopTablePager();
JSONArray rows = getRowsUsingPager(
pager, vWorksheet,
vWorksheet.getHeaderViewNodes(), vWorkspace.getPreferences().getIntViewPreferenceValue(
ViewPreference.maxCharactersInCell));
int rowsLeft = dataTable.getNumRows() - rows.length();
rowsLeft = rowsLeft < 0 ? 0 : rowsLeft;
response.put(JsonKeys.additionalRowsCount.name(), rowsLeft);
response.put(JsonKeys.tableId.name(), dataTable.getId());
response.put(JsonKeys.rows.name(), rows);
pw.println(response.toString());
} catch (JSONException e) {
logger.error("JSONException", e);
}
}
private JSONArray getRowsUsingPager(TablePager pager, VWorksheet vWorksheet, List<VHNode> orderedHnodeIds, int maxDataDisplayLength) throws JSONException {
return getRowsJsonArray(pager.getRows(),vWorksheet, orderedHnodeIds, maxDataDisplayLength);
}
public JSONArray getRowsJsonArray(List<Row> rows, VWorksheet vWorksheet, List<VHNode> orderedHnodeIds,
int maxDataDisplayLength) throws JSONException {
JSONArray rowsArr = new JSONArray();
for (Row row:rows) {
JSONObject rowObj = new JSONObject();
JSONArray rowValueArray = new JSONArray();
rowObj.put(JsonKeys.rowId.name(), row.getId());
rowObj.put(JsonKeys.isSelected.name(), selection.isSelected(row));
rowObj.put(JsonKeys.rowValueArray.name(), rowValueArray);
for (VHNode vNode : orderedHnodeIds) {
if(vNode.isVisible()) {
Node rowNode = row.getNode(vNode.getId());
JSONObject nodeObj = new JSONObject();
nodeObj.put(JsonKeys.columnClass.name(),
WorksheetHeadersUpdate.getColumnClass(vNode.getId()));
nodeObj.put(JsonKeys.nodeId.name(), rowNode.getId());
if (vNode.hasNestedTable()) {
nodeObj.put(JsonKeys.hasNestedTable.name(), true);
Table nestedTable = rowNode.getNestedTable();
JSONArray nestedTableRows = getRowsUsingPager(
vWorksheet.getNestedTablePager(nestedTable),
vWorksheet,
vNode.getNestedNodes(),
maxDataDisplayLength);
nodeObj.put(JsonKeys.nestedRows.name(), nestedTableRows);
nodeObj.put(JsonKeys.tableId.name(), rowNode.getNestedTable().getId());
int rowsLeft = nestedTable.getNumRows() - nestedTableRows.length();
rowsLeft = rowsLeft < 0 ? 0 : rowsLeft;
nodeObj.put(JsonKeys.additionalRowsCount.name(), rowsLeft);
} else {
String nodeVal = rowNode.getValue().asString();
nodeVal = (nodeVal == null) ? "" : nodeVal;
String displayVal = (nodeVal.length() > maxDataDisplayLength)
? nodeVal.substring(0, maxDataDisplayLength) + "..." : nodeVal;
nodeObj.put(JsonKeys.displayValue.name(), displayVal);
nodeObj.put(JsonKeys.expandedValue.name(), nodeVal);
nodeObj.put(JsonKeys.hasNestedTable.name(), false);
}
rowValueArray.put(nodeObj);
}
}
rowsArr.put(rowObj);
}
return rowsArr;
}
public boolean equals(Object o) {
if (o instanceof WorksheetDataUpdate) {
WorksheetDataUpdate t = (WorksheetDataUpdate)o;
return t.worksheetId.equals(worksheetId);
}
return false;
}
}