forked from aws/aws-sdk-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAstJsonToAstJava.java
More file actions
154 lines (134 loc) · 6 KB
/
AstJsonToAstJava.java
File metadata and controls
154 lines (134 loc) · 6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
* Copyright 2010-2016 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.fasterxml.jackson.databind.JsonNode;
import com.amazonaws.jmespath.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class AstJsonToAstJava {
public static JmesPathExpression fromAstJsonToAstJava(JsonNode jsonNode) throws InvalidTypeException {
switch(jsonNode.get("type").asText()) {
case "subexpression":
return jsonToSubExpression(jsonNode);
case "field":
return jsonToField(jsonNode);
case "projection":
return jsonToProjection(jsonNode);
case "flatten":
return jsonToFlatten(jsonNode);
case "value_projection":
return jsonToValueProjection(jsonNode);
case "filter_projection":
return jsonToFilterProjection(jsonNode);
case "and_expression":
return jsonToAndExpression(jsonNode);
case "not_expression":
return jsonToNotExpression(jsonNode);
case "multi_select_list":
return jsonToMultiSelectList(jsonNode);
case "comparator":
return jsonToComparator(jsonNode);
case "pipe":
//Pipe expression is similar to a sub-expression with a distinction that
// a sub-expression restricts the type of expression that can be on rhs
return jsonToSubExpression(jsonNode);
case "identity":
return new JmesPathIdentity();
case "function_expression":
return jsonToFunctionExpression(jsonNode);
case "literal":
return jsonToLiteral(jsonNode);
}
throw new InvalidTypeException("JsonNode type not found");
}
private static JmesPathExpression jsonToLiteral(JsonNode jsonNode) {
return new JmesPathLiteral(jsonNode.get("value"));
}
private static JmesPathExpression jsonToField(JsonNode jsonNode) {
return new JmesPathField(jsonNode.get("value").asText());
}
private static JmesPathExpression jsonToFlatten(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathFlatten(args.get(0));
}
private static JmesPathExpression jsonToFunctionExpression(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
switch (jsonNode.get("value").asText()){
case "length":
return new JmesPathLengthFunction(args);
case "contains":
return new JmesPathContainsFunction(args);
}
return null;
}
private static JmesPathExpression jsonToFilterProjection(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathFilter(args.get(0), args.get(1), args.get(2));
}
private static JmesPathExpression jsonToValueProjection(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathValueProjection(args.get(0), args.get(1));
}
private static JmesPathExpression jsonToProjection(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathProjection(args.get(0), args.get(1));
}
private static JmesPathExpression jsonToSubExpression(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathSubExpression(args);
}
private static JmesPathExpression jsonToComparator(JsonNode jsonNode) {
List<JmesPathExpression> args = getChildren(jsonNode);
switch(jsonNode.get("value").asText()) {
case "eq":
return new OpEquals(args.get(0), args.get(1));
case "ne":
return new OpNotEquals(args.get(0), args.get(1));
case "gt":
return new OpGreaterThan(args.get(0), args.get(1));
case "lt":
return new OpLessThan(args.get(0), args.get(1));
case "gte":
return new OpGreaterThanOrEqualTo(args.get(0), args.get(1));
case "lte":
return new OpLessThanOrEqualTo(args.get(0), args.get(1));
default: throw new InvalidTypeException("Didn't match any of the expected comparator type");
}
}
private static JmesPathExpression jsonToAndExpression(JsonNode jsonNode){
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathAndExpression(args.get(0), args.get(1));
}
private static JmesPathExpression jsonToNotExpression(JsonNode jsonNode){
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathNotExpression(args.get(0));
}
private static JmesPathExpression jsonToMultiSelectList(JsonNode jsonNode){
List<JmesPathExpression> args = getChildren(jsonNode);
return new JmesPathMultiSelectList(args);
}
private static List<JmesPathExpression> getChildren(JsonNode jsonNode){
if(jsonNode.get("children").size() < 1) {
throw new RuntimeException("Expected one or more arguments");
}
Iterator<JsonNode> children = jsonNode.get("children").elements();
final List<JmesPathExpression> childrenList = new ArrayList<>();
while (children.hasNext()) {
childrenList.add(fromAstJsonToAstJava(children.next()));
}
return childrenList;
}
}