/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.antar.expr;
import org.openflexo.antar.expr.BindingValueAsExpression.AbstractBindingPathElement;
import org.openflexo.antar.expr.BindingValueAsExpression.MethodCallBindingPathElement;
import org.openflexo.antar.expr.BindingValueAsExpression.NormalBindingPathElement;
import org.openflexo.antar.expr.Constant.BooleanConstant;
import org.openflexo.antar.expr.Constant.DateConstant;
import org.openflexo.antar.expr.Constant.DurationConstant;
import org.openflexo.antar.expr.Constant.EnumConstant;
import org.openflexo.antar.expr.Constant.FloatConstant;
import org.openflexo.antar.expr.Constant.IntegerConstant;
import org.openflexo.antar.expr.Constant.StringConstant;
import org.openflexo.antar.pp.ExpressionPrettyPrinter;
import org.openflexo.toolbox.Duration;
import org.openflexo.xmlcode.StringEncoder;
public class DefaultExpressionPrettyPrinter extends ExpressionPrettyPrinter {
private StringEncoder.DateConverter dateConverter = new StringEncoder.DateConverter();
private Duration.DurationStringConverter durationConverter = new Duration.DurationStringConverter();
public DefaultExpressionPrettyPrinter() {
this(new DefaultGrammar());
}
protected DefaultExpressionPrettyPrinter(ExpressionGrammar grammar) {
super(grammar);
}
@Override
protected String makeStringRepresentation(BooleanConstant constant) {
if (constant == BooleanConstant.FALSE) {
return "false";
} else if (constant == BooleanConstant.TRUE) {
return "true";
}
return "???";
}
@Override
protected String makeStringRepresentation(FloatConstant constant) {
return Double.toString(constant.getValue());
}
@Override
protected String makeStringRepresentation(IntegerConstant constant) {
return Long.toString(constant.getValue());
}
@Override
protected String makeStringRepresentation(StringConstant constant) {
return '"' + constant.getValue() + '"';
}
@Override
protected String makeStringRepresentation(SymbolicConstant constant) {
return constant.getSymbol();
}
@Override
protected String makeStringRepresentation(Function function) {
StringBuffer args = new StringBuffer();
boolean isFirst = true;
for (Expression e : function.getArgs()) {
args.append((isFirst ? "" : ",") + getStringRepresentation(e));
isFirst = false;
}
return function.getName() + "(" + args + ")";
}
@Override
protected String makeStringRepresentation(UnaryOperatorExpression expression) {
try {
return "(" + getSymbol(expression.getOperator()) + "(" + getStringRepresentation(expression.getArgument()) + ")" + ")";
} catch (OperatorNotSupportedException e) {
return "<unsupported>";
}
}
@Override
protected String makeStringRepresentation(BinaryOperatorExpression expression) {
try {
return "(" + getStringRepresentation(expression.getLeftArgument()) + " " + getSymbol(expression.getOperator()) + " "
+ getStringRepresentation(expression.getRightArgument()) + ")";
} catch (OperatorNotSupportedException e) {
return "<unsupported>";
}
}
@Override
protected String makeStringRepresentation(DateConstant constant) {
if (constant == null || constant.getDate() == null) {
return "[null]";
}
return "[" + dateConverter.convertToString(constant.getDate()) + "]";
}
@Override
protected String makeStringRepresentation(DurationConstant constant) {
if (constant == null || constant.getDuration() == null) {
return "[null]";
}
return "[" + durationConverter.convertToString(constant.getDuration()) + "]";
}
@Override
protected final String makeStringRepresentation(EnumConstant constant) {
return constant.getName();
}
@Override
protected String makeStringRepresentation(BindingValueAsExpression bv) {
StringBuffer sb = new StringBuffer();
boolean isFirst = true;
for (AbstractBindingPathElement e : bv.getBindingPath()) {
sb.append((isFirst ? "" : ".") + makeStringRepresentation(e));
isFirst = false;
}
return sb.toString();
}
@Override
protected String makeStringRepresentation(AbstractBindingPathElement e) {
if (e instanceof NormalBindingPathElement) {
return ((NormalBindingPathElement) e).property;
} else if (e instanceof MethodCallBindingPathElement) {
StringBuffer sb = new StringBuffer();
sb.append(((MethodCallBindingPathElement) e).method);
sb.append("(");
boolean isFirst = true;
for (Expression arg : ((MethodCallBindingPathElement) e).args) {
sb.append((isFirst ? "" : ",") + getStringRepresentation(arg));
isFirst = false;
}
sb.append(")");
return sb.toString();
}
return e.toString();
}
@Override
protected String makeStringRepresentation(ConditionalExpression expression) {
return "(" + getStringRepresentation(expression.getCondition()) + " ? " + getStringRepresentation(expression.getThenExpression())
+ " : " + getStringRepresentation(expression.getElseExpression()) + ")";
}
}