/* * Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file 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 com.amazonaws.codegen; import com.amazonaws.jmespath.Comparator; import com.amazonaws.jmespath.InvalidTypeException; import com.amazonaws.jmespath.JmesPathAndExpression; import com.amazonaws.jmespath.JmesPathField; import com.amazonaws.jmespath.JmesPathFilter; import com.amazonaws.jmespath.JmesPathFlatten; import com.amazonaws.jmespath.JmesPathFunction; import com.amazonaws.jmespath.JmesPathIdentity; import com.amazonaws.jmespath.JmesPathLiteral; import com.amazonaws.jmespath.JmesPathMultiSelectList; import com.amazonaws.jmespath.JmesPathNotExpression; import com.amazonaws.jmespath.JmesPathProjection; import com.amazonaws.jmespath.JmesPathSubExpression; import com.amazonaws.jmespath.JmesPathValueProjection; import com.amazonaws.jmespath.JmesPathVisitor; import org.apache.commons.lang3.StringEscapeUtils; import java.util.stream.Collectors; public class JmesPathCodeGenVisitor implements JmesPathVisitor<Void, String> { /** * Generates the code for a new JmesPathSubExpression. * * @param subExpression JmesPath subexpression type * @param aVoid void * @return String that represents a call to * the new subexpression * @throws InvalidTypeException */ @Override public String visit(final JmesPathSubExpression subExpression, final Void aVoid) throws InvalidTypeException { final String prefix = "new JmesPathSubExpression( "; return subExpression.getExpressions().stream() .map(a -> a.accept(this, aVoid)) .collect(Collectors.joining(",", prefix, ")")); } /** * Generates the code for a new JmesPathField. * * @param fieldNode JmesPath field type * @param aVoid void * @return String that represents a call to * the new fieldNode */ @Override public String visit(final JmesPathField fieldNode, final Void aVoid) { return "new JmesPathField( \"" + fieldNode.getValue() + "\")"; } /** * Generates the code for a new JmesPathProjection. * * @param jmesPathProjection JmesPath projection type * @param aVoid void * @return String that represents a call to * the new list projection * @throws InvalidTypeException */ @Override public String visit(final JmesPathProjection jmesPathProjection, final Void aVoid) throws InvalidTypeException { return "new JmesPathProjection( " + jmesPathProjection.getLhsExpr() .accept(this, aVoid) + ", " + jmesPathProjection.getProjectionExpr() .accept(this, aVoid) + ")"; } /** * Generates the code for a new JmesPathFlatten. * * @param flatten JmesPath flatten type * @param aVoid void * @return String that represents a call to * the new flatten projection * @throws InvalidTypeException */ @Override public String visit(final JmesPathFlatten flatten, final Void aVoid) throws InvalidTypeException { return "new JmesPathFlatten( " + flatten.getFlattenExpr() .accept(this, aVoid) + ")"; } /** * Generates the code for a new JmesPathIdentity. * * @param jmesPathIdentity JmesPath identity type * @param aVoid void * @return String that represents a call to * the new identity expression */ @Override public String visit(final JmesPathIdentity jmesPathIdentity, final Void aVoid) { return "new JmesPathIdentity()"; } /** * Generates the code for a new JmesPathValueProjection. * * @param valueProjection JmesPath value projection type * @param aVoid void * @return String that represents a call to * the new value projection * @throws InvalidTypeException */ @Override public String visit(final JmesPathValueProjection valueProjection, final Void aVoid) throws InvalidTypeException { return "new JmesPathValueProjection( " + valueProjection.getLhsExpr() .accept(this, aVoid) + ", " + valueProjection.getRhsExpr() .accept(this, aVoid) + ")"; } /** * Generates the code for a new JmesPathLiteral. * * @param literal JmesPath literal type * @param aVoid void * @return String that represents a call to * the new literal expression */ @Override public String visit(final JmesPathLiteral literal, final Void aVoid) { return "new JmesPathLiteral(\"" + StringEscapeUtils .escapeJava(literal.getValue().toString()) + "\")"; } /** * Generates the code for a new JmesPathFilter. * * @param filter JmesPath filter type * @param aVoid void * @return String that represents a call to * the new filter expression * @throws InvalidTypeException */ @Override public String visit(final JmesPathFilter filter, final Void aVoid) throws InvalidTypeException { return "new JmesPathFilter( " + filter.getLhsExpr().accept(this, aVoid) + ", " + filter.getRhsExpr().accept(this, aVoid) + ", " + filter.getComparator().accept(this, aVoid) + ")"; } /** * Generates the code for a new JmesPathFunction. * * @param function JmesPath function type * @param aVoid void * @return String that represents a call to * the new function expression * @throws InvalidTypeException */ @Override public String visit(final JmesPathFunction function, final Void aVoid) throws InvalidTypeException { final String prefix = "new " + function.getClass() .getSimpleName() + "( "; return function.getExpressions().stream() .map(a -> a.accept(this, aVoid)) .collect(Collectors.joining(",", prefix, ")")); } /** * Generates the code for a new Comparator. * * @param op JmesPath comparison operator type * @param aVoid void * @return String that represents a call to * the new comparator expression * @throws InvalidTypeException */ @Override public String visit(final Comparator op, final Void aVoid) throws InvalidTypeException { String lhs = op.getLhsExpr().accept(this, aVoid); String rhs = op.getRhsExpr().accept(this, aVoid); return String.format("new %s(%s, %s)", op.getClass() .getSimpleName(), lhs, rhs); } /** * Generates the code for a new JmesPathNotExpression. * * @param notExpression JmesPath not-expression type * @param aVoid void * @return String that represents a call to * the new not-expression * @throws InvalidTypeException */ @Override public String visit(final JmesPathNotExpression notExpression, final Void aVoid) throws InvalidTypeException { return "new JmesPathNotExpression( " + notExpression.getExpr() .accept(this, aVoid) + " )"; } /** * Generates the code for a new JmesPathAndExpression. * * @param andExpression JmesPath and-expression type * @param aVoid void * @return String that represents a call to * the new and-expression * @throws InvalidTypeException */ @Override public String visit(final JmesPathAndExpression andExpression, final Void aVoid) throws InvalidTypeException { return "new JmesPathAndExpression( " + andExpression.getLhsExpr() .accept(this, aVoid) + ", " + andExpression.getRhsExpr() .accept(this, aVoid) + " )"; } /** * Generates the code for a new JmesPathMultiSelectList. * * @param multiSelectList JmesPath multiSelectList type * @param aVoid void * @return String that represents a call to * the new multiSelectList * @throws InvalidTypeException */ @Override public String visit(final JmesPathMultiSelectList multiSelectList, final Void aVoid) throws InvalidTypeException { final String prefix = "new JmesPathMultiSelectList( "; return multiSelectList.getExpressions().stream() .map(a -> a.accept(this, aVoid)) .collect(Collectors.joining(",", prefix, ")")); } }