blob: 7f12fc320bf2a2953a193619f447080f61b9a6b8 [file] [log] [blame]
package org.eclipse.emf.henshin.sam.invcheck.filter;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.henshin.sam.invcheck.filter.CombinationProducer.Pair;
import org.eclipse.emf.henshin.sam.model.samgraph.Graph;
import org.eclipse.emf.henshin.sam.model.samgraphcondition.GraphCondition;
import org.eclipse.emf.henshin.sam.model.samgraphcondition.LogicalGCCoupling;
import org.eclipse.emf.henshin.sam.model.samgraphcondition.NegatedCondition;
import org.eclipse.emf.henshin.sam.model.samgraphcondition.Quantification;
import org.eclipse.emf.henshin.sam.model.samgraphcondition.SamgraphconditionPackage;
import org.eclipse.emf.henshin.sam.model.samrules.GTS;
import org.eclipse.emf.henshin.sam.model.samrules.GraphRule;
import org.eclipse.emf.henshin.sam.model.samrules.RuleGraph;
import org.eclipse.emf.henshin.sam.model.samrules.SamrulesPackage;
import org.eclipse.emf.henshin.sam.model.samtrace.Match;
import org.eclipse.emf.henshin.sam.model.samtypegraph.TypeGraphCondition;
import org.eclipse.emf.henshin.sam.paf.FilterSkeleton;
import org.eclipse.emf.henshin.sam.paf.annotation.ResultDictEntry;
public class StructuralPropertyTargetPatternFilter extends
FilterSkeleton<Pair<Pair<Graph, GraphRule>, Pair<Match, RuleGraph>>, Pair<Pair<Graph, GraphRule>, Pair<Match, RuleGraph>>> {
private ContainsPropertyHelper internalHelper;
@ResultDictEntry(entryName = "checked")
private int checked = 0;
@ResultDictEntry(entryName = "discarded")
private int discarded = 0;
@Override
protected void initData() {
Assert.isNotNull(this.getFilterDispatcher());
Assert.isNotNull(this.getFilterDispatcher().getFilterInput());
final EObject theEObject = this.getFilterDispatcher().getFilterInput();
Assert.isTrue(theEObject.eClass() == SamrulesPackage.eINSTANCE.getGTS());
final GTS theGTS = (GTS) theEObject;
List<Graph> forbidden = new BasicEList<Graph>();
for (TypeGraphCondition g : theGTS.getTypes().get(0).getConditions()) {
if (g.eClass() == SamgraphconditionPackage.eINSTANCE.getNegatedCondition()) {
NegatedCondition nc = (NegatedCondition) g;
if (nc.getOperand().eClass() == SamgraphconditionPackage.eINSTANCE.getQuantification()) {
Quantification q = (Quantification) nc.getOperand();
if (q.getContext().eClass() != SamrulesPackage.eINSTANCE.getRuleGraph()
|| ((RuleGraph) q.getContext()).getCondition() == null) {
forbidden.add(q.getContext());
}
// forbidden.add(q.getContext());
}
} else if (g.eClass() == SamgraphconditionPackage.eINSTANCE.getLogicalGCCoupling()) {
LogicalGCCoupling lgc = (LogicalGCCoupling) g;
for (GraphCondition gc : lgc.getOperands()) {
if (gc.eClass() == SamgraphconditionPackage.eINSTANCE.getNegatedCondition()) {
NegatedCondition neg = (NegatedCondition) gc;
if (neg.getOperand().eClass() == SamgraphconditionPackage.eINSTANCE.getQuantification()) {
Quantification q = (Quantification) neg.getOperand();
if (q.getContext().eClass() != SamrulesPackage.eINSTANCE.getRuleGraph()
|| ((RuleGraph) q.getContext()).getCondition() == null) {
forbidden.add(q.getContext());
}
}
}
}
}
}
Graph[] props = forbidden.toArray(new Graph[forbidden.size()]);
// Graph[] guarantees = theVerificationTask.getNonexistent().toArray(new
// Graph[theVerificationTask.getNonexistent().size()]);
// Graph[] combinedArray = new Graph[props.length + guarantees.length];
Graph[] combinedArray = new Graph[props.length];
System.arraycopy(props, 0, combinedArray, 0, props.length);
// System.arraycopy(guarantees, 0, combinedArray, props.length,
// guarantees.length);
this.internalHelper = new ContainsPropertyHelper(combinedArray);
}
public void produce() {
checked++;
// System.out.println("spf " + this.currentInput.pair.second.getName() +
// " " + ((NegatedCondition)
// this.currentInput.pair.first.eContainer().eContainer()).getName());
// System.out.println(this.currentInput.second.second.getNodes().size()
// + "::" + this.currentInput.second.second.getEdges().size());
if (this.internalHelper.findPreservedProperties(this.currentInput.second.second)) {
discarded++;
return;
} else {
try {
this.defaultOutputPipe.queue(this.currentInput);
} catch (InterruptedException e) {
this.running = false;
}
}
}
@Override
protected void initFilter() {
super.initFilter();
this.filterName = "StructuralPropertyTargetPatternFilter";
}
}