/*******************************************************************************
* 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.command.alignment;
import java.util.Set;
import org.jgrapht.graph.DirectedWeightedMultigraph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.update.AlignmentSVGVisualizationUpdate;
import edu.isi.karma.controller.update.ErrorUpdate;
import edu.isi.karma.controller.update.SemanticTypesUpdate;
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.rep.Worksheet;
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.LinkStatus;
import edu.isi.karma.rep.alignment.Node;
public class AddUserLinkToAlignmentCommand extends WorksheetCommand {
private final String edgeId;
private final String alignmentId;
private Alignment oldAlignment;
private DirectedWeightedMultigraph<Node, DefaultLink> oldGraph;
private String edgeLabel;
// private String edgeLabel;
private static Logger logger = LoggerFactory.getLogger(AddUserLinkToAlignmentCommand.class);
public AddUserLinkToAlignmentCommand(String id, String model, String edgeId,
String alignmentId, String worksheetId) {
super(id, model, worksheetId);
this.edgeId = edgeId;
this.alignmentId = alignmentId;
addTag(CommandTag.Modeling);
}
@Override
public String getCommandName() {
return this.getClass().getSimpleName();
}
@Override
public String getTitle() {
return "Add User DefaultLink";
}
@Override
public String getDescription() {
return edgeLabel;
}
@Override
public CommandType getCommandType() {
return CommandType.undoable;
}
@SuppressWarnings("unchecked")
@Override
public UpdateContainer doIt(Workspace workspace) throws CommandException {
Alignment alignment = AlignmentManager.Instance().getAlignment(alignmentId);
Worksheet worksheet = workspace.getWorksheet(worksheetId);
if(alignment == null || alignment.isEmpty()) {
logger.error("Alignment cannot be null before calling this command since the alignment is created while " +
"setting the semantic types.");
return new UpdateContainer(new ErrorUpdate("Error occured while generating the model for the source."));
}
// Save the original alignment for undo
oldAlignment = alignment.getAlignmentClone();
oldGraph = (DirectedWeightedMultigraph<Node, DefaultLink>)alignment.getGraph().clone();
// Set the other links to the target node to normal
LinkIdFactory.getLinkTargetId(edgeId);
Set<LabeledLink> currentLinks = alignment.getCurrentIncomingLinksToNode(LinkIdFactory.getLinkTargetId(edgeId));
if (currentLinks != null && !currentLinks.isEmpty()) {
for (LabeledLink currentLink: currentLinks) {
//if (currentLink.getSource().getId().equals(newLink.getSource().getId()))
alignment.changeLinkStatus(currentLink.getId(), LinkStatus.Normal);
}
}
// Change the status of the user selected edge
alignment.changeLinkStatus(edgeId, LinkStatus.ForcedByUser);
if(!this.isExecutedInBatch())
alignment.align();
return getAlignmentUpdateContainer(worksheet, workspace);
}
@Override
public UpdateContainer undoIt(Workspace workspace) {
Worksheet worksheet = workspace.getWorksheet(worksheetId);
// Revert to the old alignment
AlignmentManager.Instance().addAlignmentToMap(alignmentId, oldAlignment);
oldAlignment.setGraph(oldGraph);
// Get the alignment update
return getAlignmentUpdateContainer(worksheet, workspace);
}
private UpdateContainer getAlignmentUpdateContainer(Worksheet worksheet, Workspace workspace) {
// Add the visualization update
UpdateContainer c = new UpdateContainer();
c.add(new SemanticTypesUpdate(worksheet, worksheetId));
c.add(new AlignmentSVGVisualizationUpdate(worksheetId));
return c;
}
}