package edu.isi.karma.controller.command.alignment; import java.util.Set; import org.jgrapht.graph.DirectedWeightedMultigraph; import org.json.JSONException; import org.json.JSONObject; import edu.isi.karma.controller.command.CommandException; import edu.isi.karma.controller.command.CommandType; import edu.isi.karma.controller.command.WorksheetCommand; import edu.isi.karma.controller.command.alignment.ChangeInternalNodeLinksCommand.LinkJsonKeys; import edu.isi.karma.controller.update.UpdateContainer; import edu.isi.karma.modeling.alignment.Alignment; import edu.isi.karma.modeling.alignment.AlignmentManager; import edu.isi.karma.modeling.alignment.LinkIdFactory; import edu.isi.karma.modeling.ontology.OntologyManager; import edu.isi.karma.rep.Workspace; import edu.isi.karma.rep.alignment.DefaultLink; import edu.isi.karma.rep.alignment.LabeledLink; import edu.isi.karma.rep.alignment.Node; public class DeleteLinkCommand extends WorksheetCommand { private String displayLabel; private String alignmentId; private JSONObject edge; // Required for undo private Alignment oldAlignment; private DirectedWeightedMultigraph<Node, DefaultLink> oldGraph; protected DeleteLinkCommand(String id, String model, String worksheetId, String alignmentId, JSONObject edge) { super(id, model, worksheetId); this.alignmentId = alignmentId; this.edge = edge; addTag(CommandTag.Modeling); } @Override public String getCommandName() { return DeleteLinkCommand.class.getSimpleName(); } @Override public String getTitle() { return "Delete Link" ; } @Override public String getDescription() { return this.displayLabel; } @Override public CommandType getCommandType() { return CommandType.undoable; } @SuppressWarnings("unchecked") @Override public UpdateContainer doIt(Workspace workspace) throws CommandException { Alignment alignment = AlignmentManager.Instance().getAlignment( alignmentId); OntologyManager ontMgr = workspace.getOntologyManager(); // Save the original alignment for undo oldAlignment = alignment.getAlignmentClone(); oldGraph = (DirectedWeightedMultigraph<Node, DefaultLink>) alignment .getGraph().clone(); UpdateContainer uc = this.deleteLink(alignment, ontMgr, edge); if(!this.isExecutedInBatch()) alignment.align(); uc.append(this.computeAlignmentAndSemanticTypesAndCreateUpdates(workspace)); return uc; } @Override public UpdateContainer undoIt(Workspace workspace) { // Revert to the old alignment AlignmentManager.Instance() .addAlignmentToMap(alignmentId, oldAlignment); oldAlignment.setGraph(oldGraph); return this.computeAlignmentAndSemanticTypesAndCreateUpdates(workspace); } private UpdateContainer deleteLink(Alignment alignment, OntologyManager ontMgr, JSONObject edge) throws JSONException { UpdateContainer uc = new UpdateContainer(); String targetId = edge.getString(LinkJsonKeys.edgeTargetId.name()); String edgeUri = edge.getString(LinkJsonKeys.edgeId.name()); String linkId = LinkIdFactory.getLinkId( edgeUri, edge.getString(LinkJsonKeys.edgeSourceId.name()), targetId); // Add info to description string LabeledLink delLink = alignment.getLinkById(linkId); if(delLink != null) { this.displayLabel = delLink.getLabel().getDisplayName(); } alignment.removeLink(linkId); return uc; } }