/*******************************************************************************
* Copyright (c) 2010-2015 Henshin developers. All rights reserved.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* TU Berlin, University of Luxembourg, SES S.A.
*******************************************************************************/
/**
* RunRuleCommand.java
*
* Created 02.01.2012 - 12:51:11
*/
package de.tub.tfs.henshin.editor.commands.rule;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.emf.henshin.interpreter.Engine;
import org.eclipse.emf.henshin.interpreter.InterpreterFactory;
import org.eclipse.emf.henshin.interpreter.RuleApplication;
import org.eclipse.emf.henshin.interpreter.util.HenshinEGraph;
import org.eclipse.emf.henshin.interpreter.util.InterpreterUtil;
import org.eclipse.emf.henshin.model.Graph;
import org.eclipse.emf.henshin.model.Node;
import org.eclipse.emf.henshin.model.Rule;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.dialogs.MessageDialog;
import de.tub.tfs.henshin.editor.util.HenshinLayoutUtil;
import de.tub.tfs.henshin.model.layout.NodeLayout;
import de.tub.tfs.muvitor.commands.SimpleDeleteEObjectCommand;
/**
* @author nam
*
*/
public class RunRuleCommand extends CompoundCommand {
private boolean executed;
private RuleApplication rApplication;
private Rule rule;
private Graph graph;
private Map<String, Object> assignments;
/**
* @param rule
* @param graph
* @param assignments
*/
public RunRuleCommand(Rule rule, Graph graph,
Map<String, Object> assignments) {
super("Run Rule");
this.rule = rule;
this.graph = graph;
this.assignments = assignments;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.commands.CompoundCommand#canExecute()
*/
@Override
public boolean canExecute() {
return rule != null && graph != null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.commands.CompoundCommand#execute()
*/
@Override
public void execute() {
getCommands().clear();
executed = false;
Set<Node> oldNodes = new HashSet<Node>(graph.getNodes());
Set<NodeLayout> oldLayout = new HashSet<NodeLayout>();
for (Node n : oldNodes) {
oldLayout.add(HenshinLayoutUtil.INSTANCE.getLayout(n));
}
HenshinEGraph henshinEGraph = new HenshinEGraph(graph);
Engine engine = InterpreterFactory.INSTANCE.createEngine();
rApplication = InterpreterFactory.INSTANCE.createRuleApplication(engine);
rApplication.setEGraph(henshinEGraph);
rApplication.setRule(rule);
for(Entry<String, Object> assignment: assignments.entrySet()){
rApplication.setParameterValue(assignment.getKey(), assignment.getValue());
}
try {
InterpreterUtil.executeOrDie(rApplication);
Set<Node> newNodes = new HashSet<Node>(graph.getNodes());
Set<Node> deletedNodes = new HashSet<Node>(oldNodes);
deletedNodes.removeAll(newNodes);
Set<Node> createdNodes = new HashSet<Node>(newNodes);
createdNodes.removeAll(oldNodes);
for (NodeLayout l : oldLayout) {
if (deletedNodes.contains(l.getModel())) {
add(new SimpleDeleteEObjectCommand(l));
}
}
// for (Node n : createdNodes) {
// EObject o = henshinEGraph.getNode2ObjectMap().get(n);
// Node rhsNode = null;
//
// for (Entry<Node, EObject> entry : rApplication.getResultMatch()
// .getNodeMapping().entrySet()) {
// if (entry.getValue() == o) {
// rhsNode = entry.getKey();
// }
// }
//
// int r = new Random(System.currentTimeMillis()).nextInt(100) + 1;
// int x = r;
// int y = r;
//
// if (rhsNode != null) {
// NodeLayout rhsNodeLayout = HenshinLayoutUtil.INSTANCE
// .getLayout(rhsNode);
//
// x += rhsNodeLayout.getX();
// y += rhsNodeLayout.getY();
// }
//
// add(new CreateNodeLayoutCommand(n, x, y));
// }
super.execute();
executed = true;
} catch (AssertionError e) {
MessageDialog.openError(null, "Command Execution Error", e.getLocalizedMessage());
executed = false;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.commands.CompoundCommand#redo()
*/
@Override
public void redo() {
execute();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.commands.CompoundCommand#undo()
*/
@Override
public void undo() {
super.undo();
rApplication.undo(null);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.commands.CompoundCommand#canUndo()
*/
@Override
public boolean canUndo() {
return executed;
}
}