package org.deri.grefine.rdf.operations; import java.io.IOException; import java.io.LineNumberReader; import java.io.Writer; import java.util.Properties; import org.deri.grefine.rdf.RdfSchema; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONWriter; import com.google.refine.history.Change; import com.google.refine.history.HistoryEntry; import com.google.refine.model.AbstractOperation; import com.google.refine.model.Project; import com.google.refine.operations.OperationRegistry; import com.google.refine.util.ParsingUtilities; import com.google.refine.util.Pool; public class SaveRdfSchemaOperation extends AbstractOperation { final protected RdfSchema _schema; public SaveRdfSchemaOperation(RdfSchema schema) { this._schema = schema; } static public AbstractOperation reconstruct(Project project, JSONObject obj) throws Exception { return new SaveRdfSchemaOperation(RdfSchema.reconstruct(obj .getJSONObject("schema"))); } 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("Save RDF schema skeleton"); writer.key("schema"); _schema.write(writer, options); writer.endObject(); } @Override protected String getBriefDescription(Project project) { return "Save RDF schema skelton"; } @Override protected HistoryEntry createHistoryEntry(Project project, long historyEntryID) throws Exception { String description = "Save RDF schema skeleton"; Change change = new RdfSchemaChange(_schema); return new HistoryEntry(historyEntryID, project, description, SaveRdfSchemaOperation.this, change); } static public class RdfSchemaChange implements Change { final protected RdfSchema _newSchema; protected RdfSchema _oldSchema; public RdfSchemaChange(RdfSchema schema) { _newSchema = schema; } public void apply(Project project) { synchronized (project) { _oldSchema = (RdfSchema) project.overlayModels.get("rdfSchema"); project.overlayModels.put("rdfSchema", _newSchema); } } public void revert(Project project) { synchronized (project) { if (_oldSchema == null) { project.overlayModels.remove("rdfSchema"); } else { project.overlayModels.put("rdfSchema", _oldSchema); } } } public void save(Writer writer, Properties options) throws IOException { writer.write("newSchema="); writeRdfSchema(_newSchema, writer); writer.write('\n'); writer.write("oldSchema="); writeRdfSchema(_oldSchema, writer); writer.write('\n'); writer.write("/ec/\n"); // end of change marker } static public Change load(LineNumberReader reader, Pool pool) throws Exception { RdfSchema oldSchema = null; RdfSchema newSchema = null; String line; while ((line = reader.readLine()) != null && !"/ec/".equals(line)) { int equal = line.indexOf('='); CharSequence field = line.subSequence(0, equal); String value = line.substring(equal + 1); if ("oldSchema".equals(field) && value.length() > 0) { oldSchema = RdfSchema.reconstruct(ParsingUtilities .evaluateJsonStringToObject(value)); } else if ("newSchema".equals(field) && value.length() > 0) { newSchema = RdfSchema.reconstruct(ParsingUtilities .evaluateJsonStringToObject(value)); } } RdfSchemaChange change = new RdfSchemaChange(newSchema); change._oldSchema = oldSchema; return change; } static protected void writeRdfSchema(RdfSchema s, Writer writer) throws IOException { if (s != null) { JSONWriter jsonWriter = new JSONWriter(writer); try { s.write(jsonWriter, new Properties()); } catch (JSONException e) { e.printStackTrace(); } } } } }