/*******************************************************************************
* 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.
*******************************************************************************/
package de.tub.tfs.henshin.tgg.interpreter.impl;
import java.io.ObjectOutputStream.PutField;
import org.eclipse.emf.henshin.interpreter.EGraph;
import org.eclipse.emf.henshin.interpreter.Match;
import org.eclipse.emf.henshin.interpreter.impl.EngineImpl;
import org.eclipse.emf.henshin.interpreter.info.RuleInfo;
import org.eclipse.emf.henshin.model.Node;
import org.eclipse.emf.henshin.model.Rule;
import de.tub.tfs.henshin.tgg.interpreter.TggEngine;
import de.tub.tfs.henshin.tgg.interpreter.TggTransformation;
public class TggEngineImpl extends EngineImpl implements TggEngine {
/**
*
*/
private static boolean invertMatchingOrder = true;
public void setInverseMatchingOrder(boolean inverseMatchingOrder){
invertMatchingOrder = inverseMatchingOrder;
this.inverseMatchingOrder = inverseMatchingOrder;
getOptions().put(OPTION_INVERSE_MATCHING_ORDER, inverseMatchingOrder);
}
protected ObjectCopier copier;
protected TggTransformation trafo;
public TggEngineImpl(EGraph graph) {
this(graph,null);
}
/**
* @param executeFTRulesCommand
*/
public TggEngineImpl(EGraph graph,TggTransformation trafo) {
// super(); // FIXME: why is this not called?
this.trafo = trafo;
if(trafo!=null)
this.copier = new ObjectCopier(graph,trafo,this);
else
this.copier = new ObjectCopier(graph,this);
this.getScriptEngine().put("ObjectCopier",copier );
this.getOptions().put(OPTION_SORT_VARIABLES, false);
this.sortVariables = false;
this.inverseMatchingOrder = invertMatchingOrder;
getOptions().put(OPTION_INVERSE_MATCHING_ORDER, inverseMatchingOrder);
}
/* (non-Javadoc)
* @see de.tub.tfs.henshin.tgg.interpreter.impl.TGGEngine#postProcess(org.eclipse.emf.henshin.interpreter.Match)
*/
@Override
public void postProcess(Match m){
copier.postProcess(m);
}
@Override
protected RuleInfo getRuleInfo(Rule rule) {
RuleInfo ruleInfo = ruleInfos.get(rule);
if (ruleInfo == null) {
// Create the rule info:
ruleInfo = new RuleInfo(rule, this);
ruleInfos.put(rule, ruleInfo);
// Listen to changes:
//rule.eAdapters().add(ruleListener);
// Check for missing factories:
for (Node node : ruleInfo.getChangeInfo().getCreatedNodes()) {
if (node.getType()==null) {
throw new RuntimeException("Missing type for " + node);
}
if (node.getType().getEPackage()==null ||
node.getType().getEPackage().getEFactoryInstance()==null) {
throw new RuntimeException("Missing factory for '" + node +
"'. Register the corresponding package, e.g. using PackageName.eINSTANCE.getName().");
}
}
}
return ruleInfo;
}
public void updateOptions() {
System.out.println("Setting inverse mathcing to " + invertMatchingOrder);
inverseMatchingOrder = invertMatchingOrder;
getOptions().put(OPTION_INVERSE_MATCHING_ORDER, invertMatchingOrder);
}
}