
package org.eclipse.emf.henshin.sam.invcheck.filter;

import org.eclipse.emf.henshin.sam.invcheck.algorithm.RuleApplication;
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.samrules.GraphRule;
import org.eclipse.emf.henshin.sam.paf.FilterSkeleton;
import org.eclipse.emf.henshin.sam.paf.annotation.ResultDictEntry;

public class RuleApplicationFilter extends FilterSkeleton<Pair<Pair<Graph, GraphRule>, Graph>, GraphVerificationData> {

	private RuleApplication ruleApplication = new RuleApplication();

	@ResultDictEntry(entryName = "checked")
	private int checked = 0;

	@ResultDictEntry(entryName = "discarded")
	private int discarded = 0;

	public void produce() {
		checked++;
		try {
			ruleApplication.reset();
			Graph targetGraph = this.currentInput.second;

			Graph sourceGraph = ruleApplication.reverseRuleApplication(targetGraph, this.currentInput.first.second);
			if (sourceGraph != null) {
				// if
				// (ruleApplication.checkCorrectRuleApplication(this.currentInput.first.second.getLeft(),
				// sourceGraph)) {
				// this.wroteItems++;
				// this.currentInput.second.clear();

				// this removes all nacs from the right sidfe to save memory
				/*
				 * for (NegativeApplicationCondition nac :
				 * SamGraphInvCheckGraphAdapter.getInstance(targetGraph).getNacs
				 * ()) { for (Edge e : nac.getEdges()) { e.setSource(null);
				 * e.setTarget(null); } } if
				 * (SamrulesPackage.eINSTANCE.getRuleGraph().isSuperTypeOf(
				 * targetGraph.eClass())) { ((RuleGraph)
				 * targetGraph).setCondition(null); }
				 */
				GraphVerificationData newGVD = new GraphVerificationData(this.currentInput.first, sourceGraph,
						targetGraph);
				// GraphVerificationData newGVD = new
				// GraphVerificationData(this.currentInput.first, targetGraph,
				// targetGraph);

				this.defaultOutputPipe.queue(newGVD);
				// }
			} else {
				discarded++;
			}
			// }
		} catch (InterruptedException ie) {
			this.running = false;
		}
	}

	@Override
	protected void initFilter() {
		super.initFilter();
		this.filterName = "RuleApplicationFilter";
	}

}
