/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.operations;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.HashSet;
import java.util.Set;
import org.whole.lang.bindings.BindingManagerFactory;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.bindings.IBindingScope;
import org.whole.lang.events.IdentityRequestEventHandler;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.FeatureDescriptor;
import org.whole.lang.visitors.GenericTemplateInterpreterVisitor;
import org.whole.lang.visitors.IVisitor;
/**
* @author Riccardo Solmi
*/
public class InterpreterOperation extends AbstractOperation {
public static final String ID = "interpreter";
private Reader reader;
private Writer writer;
private PrintWriter printWriter;
public static IBindingScope interpret(IEntity program) {
return interpret(program, BindingManagerFactory.instance.createArguments());
}
public static IBindingScope interpret(IEntity program, IBindingManager args) {
return interpret(program, args, false);
}
public static IBindingScope interpret(IEntity program, IBindingManager args, boolean resultsInArgs) {
InterpreterOperation op = new InterpreterOperation(args, resultsInArgs);
op.stagedVisit(program, 0);
return op.getResultsScope();
}
public static IBindingScope interpret(IEntity program, IBindingManager args, int relativeStage) {
InterpreterOperation op = new InterpreterOperation(args, null);
op.stagedVisit(program, relativeStage);
return op.getResultsScope();
}
public static IBindingScope interpret(IEntity program, IBindingManager args, InputStream in, OutputStream out) {
return interpret(program, args, new InputStreamReader(in), new OutputStreamWriter(out));
}
public static IBindingScope interpret(IEntity program, IBindingManager args, Reader in, Writer out) {
final Set<String> newIONames = new HashSet<String>();
if (!args.wIsSet("reader"))
newIONames.add("reader");
if (!args.wIsSet("writer"))
newIONames.add("writer");
if (!args.wIsSet("printWriter"))
newIONames.add("printWriter");
final InterpreterOperation op = new InterpreterOperation(args, null);
if (in != null)
args.wDefValue("reader", op.reader = in);
else if (!args.wIsSet("reader")) {
args.wDefValue("reader", (Object) null);
args.wGet("reader").wAddRequestEventHandler(new IdentityRequestEventHandler() {
public Object notifyRequested(IEntity source, FeatureDescriptor feature, Object value) {
return op.getReader();
}
});
} else
op.reader = (Reader) args.wGetValue("reader");
if (out != null) {
args.wDefValue("writer", op.writer = out);
if (out instanceof PrintWriter)
args.wDefValue("printWriter", op.printWriter = (PrintWriter) out);
} else {
if (args.wIsSet("printWriter"))
op.writer = op.printWriter = (PrintWriter) args.wGetValue("printWriter");
if (args.wIsSet("writer"))
op.writer = (Writer) args.wGetValue("writer");
else {
args.wDefValue("writer", (Object) null);
args.wGet("writer").wAddRequestEventHandler(new IdentityRequestEventHandler() {
public Object notifyRequested(IEntity source, FeatureDescriptor feature, Object value) {
return op.getWriter();
}
});
}
}
if (!args.wIsSet("printWriter")) {
args.wDefValue("printWriter", (Object) null);
args.wGet("printWriter").wAddRequestEventHandler(new IdentityRequestEventHandler() {
public Object notifyRequested(IEntity source, FeatureDescriptor feature, Object value) {
return op.getPrintWriter();
}
});
}
op.stagedVisit(program);
for (String name : newIONames)
args.wUnset(name);
op.flushPrintWriter();
return op.getResultsScope();
}
protected InterpreterOperation(IBindingManager args, boolean resultsInArgs) {
super(ID, args, resultsInArgs);
}
protected InterpreterOperation(IBindingManager args, IBindingScope resultsScope) {
super(ID, args, null);
}
protected IVisitor createDefaultVisitor(IEntity entity, int normalizedStage) {
if (normalizedStage > 0)
return new GenericTemplateInterpreterVisitor();
else
return super.createDefaultVisitor(entity, normalizedStage);
}
public Reader getReader() {
if (reader == null)
reader = new InputStreamReader(System.in);
return reader;
}
public Writer getWriter() {
if (writer == null)
writer = new OutputStreamWriter(System.out);
return writer;
}
public PrintWriter getPrintWriter() {
if (printWriter == null)
printWriter = new PrintWriter(getWriter());
return printWriter;
}
public void flushPrintWriter() {
if (printWriter != null)
printWriter.flush();
}
}