package com.temenos.interaction.odataext.odataparser.odata4j;
/*
* A mutable copy of oData4j's PrintExpressionVisior. This is identical to org.odata4j.expression. PrintExpressionVisior
* apart from the append() methods are changed from private to protected. So they can be overridden in sub class.
*/
/*
* #%L
* interaction-odata4j-ext
* %%
* Copyright (C) 2012 - 2013 Temenos Holdings N.V.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import org.odata4j.expression.AddExpression;
import org.odata4j.expression.AggregateAllFunction;
import org.odata4j.expression.AggregateAnyFunction;
import org.odata4j.expression.AndExpression;
import org.odata4j.expression.BinaryLiteral;
import org.odata4j.expression.BoolParenExpression;
import org.odata4j.expression.BooleanLiteral;
import org.odata4j.expression.ByteLiteral;
import org.odata4j.expression.CastExpression;
import org.odata4j.expression.CeilingMethodCallExpression;
import org.odata4j.expression.CommonExpression;
import org.odata4j.expression.ConcatMethodCallExpression;
import org.odata4j.expression.DateTimeLiteral;
import org.odata4j.expression.DateTimeOffsetLiteral;
import org.odata4j.expression.DayMethodCallExpression;
import org.odata4j.expression.DecimalLiteral;
import org.odata4j.expression.DivExpression;
import org.odata4j.expression.DoubleLiteral;
import org.odata4j.expression.EndsWithMethodCallExpression;
import org.odata4j.expression.EntitySimpleProperty;
import org.odata4j.expression.EqExpression;
import org.odata4j.expression.ExpressionParser;
import org.odata4j.expression.ExpressionVisitor;
import org.odata4j.expression.FloorMethodCallExpression;
import org.odata4j.expression.GeExpression;
import org.odata4j.expression.GtExpression;
import org.odata4j.expression.GuidLiteral;
import org.odata4j.expression.HourMethodCallExpression;
import org.odata4j.expression.IndexOfMethodCallExpression;
import org.odata4j.expression.Int64Literal;
import org.odata4j.expression.IntegralLiteral;
import org.odata4j.expression.IsofExpression;
import org.odata4j.expression.LeExpression;
import org.odata4j.expression.LengthMethodCallExpression;
import org.odata4j.expression.LtExpression;
import org.odata4j.expression.MinuteMethodCallExpression;
import org.odata4j.expression.ModExpression;
import org.odata4j.expression.MonthMethodCallExpression;
import org.odata4j.expression.MulExpression;
import org.odata4j.expression.NeExpression;
import org.odata4j.expression.NegateExpression;
import org.odata4j.expression.NotExpression;
import org.odata4j.expression.NullLiteral;
import org.odata4j.expression.OrExpression;
import org.odata4j.expression.OrderByExpression;
import org.odata4j.expression.OrderByExpression.Direction;
import org.odata4j.expression.ParenExpression;
import org.odata4j.expression.ReplaceMethodCallExpression;
import org.odata4j.expression.RoundMethodCallExpression;
import org.odata4j.expression.SByteLiteral;
import org.odata4j.expression.SecondMethodCallExpression;
import org.odata4j.expression.SingleLiteral;
import org.odata4j.expression.StartsWithMethodCallExpression;
import org.odata4j.expression.StringLiteral;
import org.odata4j.expression.SubExpression;
import org.odata4j.expression.SubstringMethodCallExpression;
import org.odata4j.expression.SubstringOfMethodCallExpression;
import org.odata4j.expression.TimeLiteral;
import org.odata4j.expression.ToLowerMethodCallExpression;
import org.odata4j.expression.ToUpperMethodCallExpression;
import org.odata4j.expression.TrimMethodCallExpression;
import org.odata4j.expression.YearMethodCallExpression;
import org.odata4j.internal.InternalUtil;
import org.odata4j.repack.org.apache.commons.codec.binary.Hex;
public class PrintExpressionVisitor implements ExpressionVisitor {
private final StringBuilder sb = new StringBuilder();
public void reset() {
// Clear down the buffer.
sb.setLength(0);
}
public static String asString(CommonExpression expr) {
PrintExpressionVisitor v = new PrintExpressionVisitor();
expr.visit(v);
return v.toString();
}
@Override
public String toString() {
return sb.toString();
}
protected void append(String value) {
sb.append(value);
}
protected void append(String format, Object... args) {
sb.append(String.format(format, args));
}
@Override
public void visit(String type) {
append(type);
}
@Override
public void afterDescend() {
append(")");
}
@Override
public void beforeDescend() {
append("(");
}
@Override
public void betweenDescend() {
append(",");
}
@Override
public void visit(AddExpression expr) {
append("add");
}
@Override
public void visit(AndExpression expr) {
append("and");
}
@Override
public void visit(BooleanLiteral expr) {
append("boolean(%s)", expr.getValue());
}
@Override
public void visit(CastExpression expr) {
append("cast");
}
@Override
public void visit(ConcatMethodCallExpression expr) {
append("concat");
}
@Override
public void visit(DateTimeLiteral expr) {
append("datetime(%s)", InternalUtil.formatDateTimeForXml(expr.getValue()));
}
@Override
public void visit(DateTimeOffsetLiteral expr) {
append("datetime(%s)", InternalUtil.formatDateTimeOffsetForXml(expr.getValue()));
}
@Override
public void visit(DecimalLiteral expr) {
append("decimal(%s)", expr.getValue());
}
@Override
public void visit(DivExpression expr) {
append("div");
}
@Override
public void visit(EndsWithMethodCallExpression expr) {
append("endswith");
}
@Override
public void visit(EntitySimpleProperty expr) {
append("simpleProperty(%s)", expr.getPropertyName());
}
@Override
public void visit(EqExpression expr) {
append("eq");
}
@Override
public void visit(GeExpression expr) {
append("ge");
}
@Override
public void visit(GtExpression expr) {
append("gt");
}
@Override
public void visit(GuidLiteral expr) {
append("guid(%s)", expr.getValue());
}
@Override
public void visit(IndexOfMethodCallExpression expr) {
append("indexof");
}
@Override
public void visit(IntegralLiteral expr) {
append("integral(%s)", expr.getValue());
}
@Override
public void visit(IsofExpression expr) {
append("isof");
}
@Override
public void visit(LeExpression expr) {
append("le");
}
@Override
public void visit(LengthMethodCallExpression expr) {
append("length");
}
@Override
public void visit(LtExpression expr) {
append("lt");
}
@Override
public void visit(ModExpression expr) {
append("mod");
}
@Override
public void visit(MulExpression expr) {
append("mul");
}
@Override
public void visit(NeExpression expr) {
append("ne");
}
@Override
public void visit(NegateExpression expr) {
append("negate");
}
@Override
public void visit(NotExpression expr) {
append("not");
}
@Override
public void visit(NullLiteral expr) {
append("null");
}
@Override
public void visit(OrExpression expr) {
append("or");
}
@Override
public void visit(ParenExpression expr) {
append("paren");
}
@Override
public void visit(BoolParenExpression expr) {
append("boolParen");
}
@Override
public void visit(ReplaceMethodCallExpression expr) {
append("replace");
}
@Override
public void visit(StartsWithMethodCallExpression expr) {
append("startswith");
}
@Override
public void visit(StringLiteral expr) {
append("string(%s)", expr.getValue());
}
@Override
public void visit(SubExpression expr) {
append("sub");
}
@Override
public void visit(SubstringMethodCallExpression expr) {
append("substring");
}
@Override
public void visit(SubstringOfMethodCallExpression expr) {
append("substringof");
}
@Override
public void visit(TimeLiteral expr) {
append("time(%s)", expr.getValue().toString(ExpressionParser.TIME_FORMATTER));
}
@Override
public void visit(ToLowerMethodCallExpression expr) {
append("tolower");
}
@Override
public void visit(ToUpperMethodCallExpression expr) {
append("toupper");
}
@Override
public void visit(TrimMethodCallExpression expr) {
append("trim");
}
@Override
public void visit(YearMethodCallExpression expr) {
append("year");
}
@Override
public void visit(MonthMethodCallExpression expr) {
append("month");
}
@Override
public void visit(DayMethodCallExpression expr) {
append("day");
}
@Override
public void visit(HourMethodCallExpression expr) {
append("hour");
}
@Override
public void visit(MinuteMethodCallExpression expr) {
append("minute");
}
@Override
public void visit(SecondMethodCallExpression expr) {
append("second");
}
@Override
public void visit(RoundMethodCallExpression expr) {
append("round");
}
@Override
public void visit(FloorMethodCallExpression expr) {
append("floor");
}
@Override
public void visit(CeilingMethodCallExpression expr) {
append("ceiling");
}
@Override
public void visit(OrderByExpression expr) {
append("orderBy");
}
@Override
public void visit(Direction direction) {
append(direction == Direction.ASCENDING ? "asc" : "desc");
}
@Override
public void visit(Int64Literal expr) {
append("int64(%s)", expr.getValue());
}
@Override
public void visit(SingleLiteral expr) {
append("single(%s)", expr.getValue());
}
@Override
public void visit(DoubleLiteral expr) {
append("double(%s)", expr.getValue());
}
@Override
public void visit(BinaryLiteral expr) {
append("binary(%s)", Hex.encodeHexString(expr.getValue()));
}
@Override
public void visit(ByteLiteral expr) {
append("byte(%s)", expr.getValue());
}
@Override
public void visit(SByteLiteral expr) {
append("sbyte(%s)", expr.getValue());
}
@Override
public void visit(AggregateAnyFunction expr) {
if (expr.getVariable() != null) {
append("any:(%s =>)", expr.getVariable());
} else {
append("any()");
}
}
@Override
public void visit(AggregateAllFunction expr) {
append("all:%s =>", expr.getVariable());
}
}