/******************************************************************************* * 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. *******************************************************************************/ /** * FlowDiagramValidator.java * * Created 18.01.2012 - 15:41:52 */ package de.tub.tfs.henshin.editor.util.flowcontrol; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.henshin.model.Edge; import org.eclipse.emf.henshin.model.Graph; import org.eclipse.emf.henshin.model.HenshinFactory; import org.eclipse.emf.henshin.model.Node; import org.eclipse.emf.henshin.model.Rule; import org.eclipse.jface.dialogs.MessageDialog; import de.tub.tfs.henshin.editor.util.JavaUtil; import de.tub.tfs.henshin.model.flowcontrol.FlowControlPackage; import de.tub.tfs.henshin.model.flowcontrol.FlowDiagram; import de.tub.tfs.henshin.model.flowcontrol.FlowElement; import de.tub.tfs.henshin.model.flowcontrol.Transition; /** * @author nam * */ public class FlowDiagramValidator { private List<Rule> rules; private FlowDiagram diagram; private List<FlowElement> failed; /** * @param rules * @param diagram */ public FlowDiagramValidator(List<Rule> rules, FlowDiagram diagram) { super(); this.rules = rules; this.diagram = diagram; this.failed = new LinkedList<FlowElement>(); } /** * */ public void run() { Graph absyGraph = HenshinFactory.eINSTANCE.createGraph(); Map<EObject, Node> model2Node = new HashMap<EObject, Node>(); Node root = HenshinFactory.eINSTANCE.createNode(); root.setType(FlowControlPackage.Literals.FLOW_CONTROL_SYSTEM); failed.clear(); absyGraph.getNodes().add(root); addNode(diagram, absyGraph, model2Node); addEdge(root, model2Node.get(diagram), FlowControlPackage.Literals.FLOW_CONTROL_SYSTEM__UNITS, absyGraph); for (FlowElement e : diagram.getElements()) { addNode(e, absyGraph, model2Node); addEdge(model2Node.get(diagram), model2Node.get(e), FlowControlPackage.Literals.FLOW_DIAGRAM__ELEMENTS, absyGraph); addEdge(model2Node.get(e), model2Node.get(diagram), FlowControlPackage.Literals.FLOW_ELEMENT__DIAGRAM, absyGraph); } addEdge(model2Node.get(diagram), model2Node.get(diagram.getStart()), FlowControlPackage.Literals.FLOW_DIAGRAM__START, absyGraph); for (Transition t : diagram.getTransitions()) { addNode(t, absyGraph, model2Node); addEdge(model2Node.get(diagram), model2Node.get(t), FlowControlPackage.Literals.FLOW_DIAGRAM__TRANSITIONS, absyGraph); addEdge(model2Node.get(t), model2Node.get(t.getNext()), FlowControlPackage.Literals.TRANSITION__NEXT, absyGraph); addEdge(model2Node.get(t.getNext()), model2Node.get(t), FlowControlPackage.Literals.FLOW_ELEMENT__IN, absyGraph); addEdge(model2Node.get(t), model2Node.get(t.getPrevous()), FlowControlPackage.Literals.TRANSITION__PREVOUS, absyGraph); if (t.isAlternate()) { addEdge(model2Node.get(t.getPrevous()), model2Node.get(t), FlowControlPackage.Literals.CONDITIONAL_ELEMENT__ALT_OUT, absyGraph); } else { addEdge(model2Node.get(t.getPrevous()), model2Node.get(t), FlowControlPackage.Literals.FLOW_ELEMENT__OUT, absyGraph); } } // HenshinGraph henshinGraph = new HenshinGraph(absyGraph); // EmfEngine engine = new EmfEngine(henshinGraph); // // int failed = 0; // int numRules = rules.size(); boolean successful = false; // int idx = 0; // // while (!successful && failed < numRules) { // Rule r = rules.get(idx++ % numRules); // RuleApplication validationApp = new RuleApplication(engine, r); // // if (validationApp.apply()) { // if (absyGraph.getNodes().size() == 1) { // if (absyGraph // .getNodes() // .get(0) // .getType() // .equals(FlowControlPackage.Literals.FLOW_CONTROL_SYSTEM)) { // successful = true; // } // } // // failed = 0; // } else { // failed++; // } // } if (successful) { MessageDialog.openInformation(null, "Validation Result", "Validation completed successfully."); } else { MessageDialog.openError(null, "Validation Result", "Validation failed."); Map<Node, EObject> node2Model = JavaUtil.swapKeysValues(model2Node); for (Node n : absyGraph.getNodes()) { EObject model = node2Model.get(n); if (model instanceof FlowElement) { this.failed.add((FlowElement) model); } } } } /** * @return the failed */ public Collection<FlowElement> getFailed() { return Collections.unmodifiableCollection(failed); } /** * @param src * @param target * @param type * @param absyGraph */ private void addEdge(Node src, Node target, EReference type, Graph absyGraph) { Edge newEdge = HenshinFactory.eINSTANCE.createEdge(); newEdge.setSource(src); newEdge.setTarget(target); newEdge.setType(type); absyGraph.getEdges().add(newEdge); } /** * @param e * @param absyGraph * @param model2Node */ private void addNode(EObject e, Graph absyGraph, Map<EObject, Node> model2Node) { Node newNode = HenshinFactory.eINSTANCE.createNode(); newNode.setType(e.eClass()); absyGraph.getNodes().add(newNode); model2Node.put(e, newNode); } }