/*
 * #%L
 * SciJava Common shared library for SciJava software.
 * %%
 * Copyright (C) 2009 - 2015 Board of Regents of the University of
 * Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
 * Institute of Molecular Cell Biology and Genetics.
 * %%
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * #L%
 */
package org.scijava.script;

import javax.script.ScriptEngine;
import javax.script.ScriptException;

import org.scijava.prefs.PrefService;

/**
 * The default implementation of a {@link ScriptInterpreter}.
 *  
 * @author Johannes Schindelin
 */
public class DefaultScriptInterpreter implements ScriptInterpreter {

	private final ScriptLanguage language;
	private final ScriptEngine engine;
	private final History history;

	/**
	 * Constructs a new {@link DefaultScriptInterpreter}.
	 * 
	 * @param scriptService the script service
	 * @param language the script language
	 */
	public DefaultScriptInterpreter(final PrefService prefs,
		final ScriptService scriptService, final ScriptLanguage language)
	{
		this.language = language;
		engine = language.getScriptEngine();
		history = new History(prefs, engine.getClass().getName());
		readHistory();
	}

	@Override
	public synchronized void readHistory() {
		if (history == null) return;
		history.read();
	}

	@Override
	public synchronized void writeHistory() {
		if (history == null) return;
		history.write();
	}

	@Override
	public synchronized String walkHistory(final String currentCommand,
		final boolean forward)
	{
		if (history == null) return currentCommand;
		history.replace(currentCommand);
		return forward ? history.next() : history.previous();
	}

	@Override
	public Object eval(final String command) throws ScriptException {
		if (history != null) history.add(command);
		if (engine == null) throw new java.lang.IllegalArgumentException();
		return engine.eval(command);
	}

	@Override
	public ScriptLanguage getLanguage() {
		return language;
	}

	@Override
	public ScriptEngine getEngine() {
		return engine;
	}

}

@@ -2009,40 +2009,98 @@
 ;%0A%0A%09
-/**%0A%09 * Constructs a new
+@Parameter(required = false)%0A%09private PrefService prefs;%0A%0A%09/**%0A%09 * @deprecated Use
  %7B@link 
 Defa
@@ -2095,16 +2095,17 @@
  %7B@link 
+#
 DefaultS
@@ -2124,59 +2124,310 @@
 eter
-%7D
+(ScriptLanguage)%7D instead
 .%0A%09 *
- %0A%09 * @param scriptService the script service
+/%0A%09@Deprecated%0A%09@SuppressWarnings(%22unused%22)%0A%09public DefaultScriptInterpreter(final PrefService prefs,%0A%09%09final ScriptService scriptService, final ScriptLanguage language)%0A%09%7B%0A%09%09this(language);%0A%09%7D%0A%0A%09/**%0A%09 * Creates a new script interpreter for the given script language.%0A%09 * 
 %0A%09 *
@@ -2447,27 +2447,49 @@
 age 
-the s
+%7B@link S
 cript
- l
+L
 anguage
+%7D of the interpreter
 %0A%09 *
@@ -2533,97 +2533,492 @@
 nal 
-PrefService prefs,%0A%09%09final ScriptService scriptService, final ScriptLanguage language)%0A%09%7B
+ScriptLanguage language) %7B%0A%09%09this(language, null);%0A%09%7D%0A%0A%09/**%0A%09 * Creates a new script interpreter for the given script language, using the%0A%09 * specified script engine.%0A%09 * %0A%09 * @param language %7B@link ScriptLanguage%7D of the interpreter%0A%09 * @param engine %7B@link ScriptEngine%7D to use, or null for the specified%0A%09 *          language's default engine%0A%09 */%0A%09public DefaultScriptInterpreter(final ScriptLanguage language,%0A%09%09final ScriptEngine engine)%0A%09%7B%0A%09%09language.getContext().inject(this);
 %0A%09%09t
@@ -3044,24 +3044,29 @@
 uage;%0A%09%09
+this.
 engine =
  languag
@@ -3057,16 +3057,33 @@
 engine =
+ engine == null ?
  languag
@@ -3101,16 +3101,25 @@
 Engine()
+ : engine
 ;%0A%09%09hist
@@ -3124,16 +3124,42 @@
 story = 
+prefs == null ? null :%0A%09%09%09
 new Hist
@@ -3169,16 +3169,21 @@
 (prefs, 
+this.
 engine.g
@@ -3217,32 +3217,69 @@
 dHistory();%0A%09%7D%0A%0A
+%09// -- ScriptInterpreter methods --%0A%0A
 %09@Override%0A%09publ

improve constructors