package com.metaweb.gridworks.operations; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONWriter; import com.metaweb.gridworks.browsing.RowVisitor; import com.metaweb.gridworks.history.Change; import com.metaweb.gridworks.model.AbstractOperation; import com.metaweb.gridworks.model.Cell; import com.metaweb.gridworks.model.Column; import com.metaweb.gridworks.model.Project; import com.metaweb.gridworks.model.Recon; import com.metaweb.gridworks.model.Row; import com.metaweb.gridworks.model.Recon.Judgment; import com.metaweb.gridworks.model.changes.CellChange; import com.metaweb.gridworks.model.changes.ReconChange; public class ReconDiscardJudgmentsOperation extends EngineDependentMassCellOperation { static public AbstractOperation reconstruct(Project project, JSONObject obj) throws Exception { JSONObject engineConfig = obj.getJSONObject("engineConfig"); String columnName = obj.getString("columnName"); return new ReconDiscardJudgmentsOperation( engineConfig, columnName ); } public ReconDiscardJudgmentsOperation(JSONObject engineConfig, String columnName) { super(engineConfig, columnName, false); } public void write(JSONWriter writer, Properties options) throws JSONException { writer.object(); writer.key("op"); writer.value(OperationRegistry.s_opClassToName.get(this.getClass())); writer.key("description"); writer.value(getBriefDescription(null)); writer.key("engineConfig"); writer.value(getEngineConfig()); writer.key("columnName"); writer.value(_columnName); writer.endObject(); } protected String getBriefDescription(Project project) { return "Discard recon judgments for cells in column " + _columnName; } protected String createDescription(Column column, List cellChanges) { return "Discard recon judgments for " + cellChanges.size() + " cells in column " + column.getName(); } protected RowVisitor createRowVisitor(Project project, List cellChanges, long historyEntryID) throws Exception { Column column = project.columnModel.getColumnByName(_columnName); return new RowVisitor() { int cellIndex; List cellChanges; Map dupReconMap = new HashMap(); long historyEntryID; public RowVisitor init(int cellIndex, List cellChanges, long historyEntryID) { this.cellIndex = cellIndex; this.cellChanges = cellChanges; this.historyEntryID = historyEntryID; return this; } public boolean visit(Project project, int rowIndex, Row row, boolean includeContextual, boolean includeDependent) { Cell cell = row.getCell(cellIndex); if (cell != null && cell.recon != null) { Recon newRecon; if (dupReconMap.containsKey(cell.recon.id)) { newRecon = dupReconMap.get(cell.recon.id); newRecon.judgmentBatchSize++; } else { newRecon = cell.recon.dup(historyEntryID); newRecon.match = null; newRecon.matchRank = -1; newRecon.judgment = Judgment.None; newRecon.judgmentAction = "mass"; newRecon.judgmentBatchSize = 1; dupReconMap.put(cell.recon.id, newRecon); } Cell newCell = new Cell(cell.value, newRecon); CellChange cellChange = new CellChange(rowIndex, cellIndex, cell, newCell); cellChanges.add(cellChange); } return false; } }.init(column.getCellIndex(), cellChanges, historyEntryID); } protected Change createChange(Project project, Column column, List cellChanges) { return new ReconChange( cellChanges, _columnName, column.getReconConfig(), null ); } }