/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. ******************************************************************************/ package org.apache.olingo.odata2.core.uri.expression; import java.io.IOException; import java.io.StringWriter; import java.util.List; import org.apache.olingo.odata2.api.edm.Edm; import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmLiteral; import org.apache.olingo.odata2.api.edm.EdmType; import org.apache.olingo.odata2.api.edm.EdmTyped; import org.apache.olingo.odata2.api.uri.expression.BinaryExpression; import org.apache.olingo.odata2.api.uri.expression.BinaryOperator; import org.apache.olingo.odata2.api.uri.expression.CommonExpression; import org.apache.olingo.odata2.api.uri.expression.ExpressionVisitor; import org.apache.olingo.odata2.api.uri.expression.FilterExpression; import org.apache.olingo.odata2.api.uri.expression.LiteralExpression; import org.apache.olingo.odata2.api.uri.expression.MemberExpression; import org.apache.olingo.odata2.api.uri.expression.MethodExpression; import org.apache.olingo.odata2.api.uri.expression.MethodOperator; import org.apache.olingo.odata2.api.uri.expression.OrderByExpression; import org.apache.olingo.odata2.api.uri.expression.OrderExpression; import org.apache.olingo.odata2.api.uri.expression.PropertyExpression; import org.apache.olingo.odata2.api.uri.expression.SortOrder; import org.apache.olingo.odata2.api.uri.expression.UnaryExpression; import org.apache.olingo.odata2.api.uri.expression.UnaryOperator; import org.apache.olingo.odata2.core.ep.util.JsonStreamWriter; /** * */ public class JsonVisitor implements ExpressionVisitor { @Override public Object visitFilterExpression(final FilterExpression filterExpression, final String expressionString, final Object expression) { return expression; } @Override public Object visitBinary(final BinaryExpression binaryExpression, final BinaryOperator operator, final Object leftSide, final Object rightSide) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", binaryExpression.getKind().toString()).separator() .namedStringValue("operator", operator.toUriLiteral()).separator().namedStringValueRaw("type", getType(binaryExpression)).separator().name("left").unquotedValue(leftSide.toString()).separator().name( "right").unquotedValue(rightSide.toString()).endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitOrderByExpression(final OrderByExpression orderByExpression, final String expressionString, final List<Object> orders) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", "order collection").separator().name("orders") .beginArray(); boolean first = true; for (final Object order : orders) { if (first) { first = false; } else { jsonStreamWriter.separator(); } jsonStreamWriter.unquotedValue(order.toString()); } jsonStreamWriter.endArray().endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitOrder(final OrderExpression orderExpression, final Object filterResult, final SortOrder sortOrder) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", orderExpression.getKind().toString()).separator() .namedStringValueRaw("sortorder", sortOrder.toString()).separator().name("expression").unquotedValue( filterResult.toString()).endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitLiteral(final LiteralExpression literal, final EdmLiteral edmLiteral) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", literal.getKind().toString()).separator() .namedStringValueRaw("type", getType(literal)).separator().namedStringValue("value", edmLiteral.getLiteral()) .endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitMethod(final MethodExpression methodExpression, final MethodOperator method, final List<Object> parameters) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", methodExpression.getKind().toString()).separator() .namedStringValueRaw("operator", method.toUriLiteral()).separator().namedStringValueRaw("type", getType(methodExpression)).separator().name("parameters").beginArray(); boolean first = true; for (Object parameter : parameters) { if (first) { first = false; } else { jsonStreamWriter.separator(); } jsonStreamWriter.unquotedValue(parameter.toString()); } jsonStreamWriter.endArray().endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitMember(final MemberExpression memberExpression, final Object path, final Object property) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", memberExpression.getKind().toString()).separator() .namedStringValueRaw("type", getType(memberExpression)).separator().name("source").unquotedValue( path.toString()).separator().name("path").unquotedValue(property.toString()).endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitProperty(final PropertyExpression propertyExpression, final String uriLiteral, final EdmTyped edmProperty) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", propertyExpression.getKind().toString()) .separator().namedStringValue("name", uriLiteral).separator().namedStringValueRaw("type", getType(propertyExpression)).endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } @Override public Object visitUnary(final UnaryExpression unaryExpression, final UnaryOperator operator, final Object operand) { try { StringWriter writer = new StringWriter(); JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer); jsonStreamWriter.beginObject().namedStringValueRaw("nodeType", unaryExpression.getKind().toString()).separator() .namedStringValueRaw("operator", operator.toUriLiteral()).separator().namedStringValueRaw("type", getType(unaryExpression)).separator().name("operand").unquotedValue(operand.toString()).endObject(); writer.flush(); return writer.toString(); } catch (final IOException e) { return null; } } private static String getType(final CommonExpression expression) { try { final EdmType type = expression.getEdmType(); return type == null ? null : type.getNamespace() + Edm.DELIMITER + type.getName(); } catch (final EdmException e) { return "EdmException occurred: " + e.getMessage(); } } }