package ch.vorburger.el.engine;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.compiler.ImportManager;
import org.eclipse.xtext.xbase.compiler.output.FakeTreeAppendable;
import ch.vorburger.el.generator.ELCompiler;
import com.google.inject.Inject;
@SuppressWarnings("restriction")
public class ExpressionImpl implements Expression {
private final static Logger LOGGER = Logger.getLogger(ExpressionImpl.class);
@Inject protected ELCompiler compiler;
protected XExpression xExpression;
// TODO This is a mess/short-term hack... must improve @see http://rd.oams.com/browse/DS-5853
public void setELCompiler(ELCompiler compiler) {
this.compiler = compiler;
}
public void setXExpression(XExpression xExpression) {
this.xExpression = xExpression;
}
@Override
public XExpression getXExpression() {
return xExpression;
}
@Override
public String generateJavaCode(Class<?> expectedType) {
ImportManager importManager = new ImportManager(false);
FakeTreeAppendable appendable = new FakeTreeAppendable(importManager);
return compiler.compileAsJavaExpression(getXExpression(), appendable, expectedType).toString();
}
@Override
public void dispose() {
try {
xExpression.eResource().delete(null);
} catch (IOException e) {
LOGGER.warn("XExpression.eResource.delete failed", e);
// If we cannot delete, can we at least unload?
xExpression.eResource().unload();
}
}
}