code: /**
   * <copyright>
   * Copyright (c) 2010-2014 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
   * </copyright>
   */
  package org.eclipse.emf.henshin.interpreter;
  
  import java.util.Map;
  
  import javax.script.ScriptEngine;
  
  import org.eclipse.emf.henshin.model.Rule;
  
  /**
   * Interface for interpreter engines.
   * 
   * @author Christian Krause, Enrico Biermann
   */
  public interface Engine {
  
  	/**
  	 * Option for general injective rule matching.
  	 */
  	String OPTION_INJECTIVE_MATCHING = "INJECTIVE_MATCHING";
  
  	/**
  	 * Option for general checks for dangling edges.
  	 */
  	String OPTION_CHECK_DANGLING = "CHECK_DANGLING";
  
  	/**
  	 * Option for general deterministic engine behavior.
  	 */
  	String OPTION_DETERMINISTIC = "DETERMINISTIC";
  
  	/**
  	 * Option for enabling / disabling automatic variable sorting.
  	 */
  	String OPTION_SORT_VARIABLES = "SORT_VARIABLES";
  
  	/**
  	 * Option for enabling / disabling inverse matching order.
  	 */
  	String OPTION_INVERSE_MATCHING_ORDER = "INVERSE_MATCHING_ORDER";
  
  	/**
  	 * Option for allowing the engine to destroy matching in {@link #createChange(Rule, EGraph, Match, Match)}.
  	 */
  	String OPTION_DESTROY_MATCHES = "DESTROY_MATCHES";
  
  	/**
  	 * Option for setting the number of worker threads to be used.
  	 */
  	String OPTION_WORKER_THREADS = "WORKER_THREADS";
  
  	/**
  	 * Find matches for a {@link Rule} in an {@link EGraph}.
  	 * 
  	 * @param rule Rule to be matched.
  	 * @param graph Graph where the match should be found.
  	 * @param partialMatch Partial match (can be empty or <code>null</code>).
  	 * @return An iterable list of matches.
  	 */
  	Iterable<Match> findMatches(Rule rule, EGraph graph, Match partialMatch);
  
  	/**
  	 * Create an {@link Change} for applying a rule.
  	 * 
  	 * @param rule Rule to be applied.
  	 * @param graph Graph where the rule should be applied.
  	 * @param completeMatch A <b>complete</b> match for the rule in the graph.
  	 * @param resultMatch This result match will be initialized by the engine!
  	 * @return An {@link Change} object that can be used to apply the rule
  	 */
  	Change createChange(Rule rule, EGraph graph, Match completeMatch, Match resultMatch);
  
  	/**
  	 * Get the used script engine.
  	 * 
  	 * @return Script engine.
  	 */
  	ScriptEngine getScriptEngine();
  
  	/**
  	 * Get or set the options for this engine.
  	 * 
  	 * @return Options map.
  	 */
  	Map<String, Object> getOptions();
  
  	/**
  	 * Shutdown this engine.
  	 */
  	void shutdown();
  	
  	/**
  	 * Set monitoring-Object
  	 */
  	void setMonitor(ApplicationMonitor monitor);
  	
  	/**
  	 * Get monitoring-Object
  	 */
  	ApplicationMonitor getMonitor();
  	
  }
  