Skip to content

Commit c286cd6

Browse files
committed
Added yaml support
1 parent 74cd1d6 commit c286cd6

File tree

6 files changed

+169
-47
lines changed

6 files changed

+169
-47
lines changed

pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@
1414
<artifactId>gson</artifactId>
1515
<version>2.8.6</version>
1616
</dependency>
17+
<dependency>
18+
<groupId>org.javawebstack</groupId>
19+
<artifactId>QueryString</artifactId>
20+
<version>1.0-SNAPSHOT</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>org.yaml</groupId>
24+
<artifactId>snakeyaml</artifactId>
25+
<version>1.27</version>
26+
</dependency>
1727
</dependencies>
1828

1929
<build>

src/main/java/org/javawebstack/graph/GraphArray.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ public JsonElement toJson() {
110110
return array;
111111
}
112112

113+
public Object toAbstractObject() {
114+
List<Object> list = new ArrayList<>();
115+
elements.forEach(e -> list.add(e.toAbstractObject()));
116+
return list;
117+
}
118+
113119
public static GraphArray fromJson(JsonArray array){
114120
GraphArray a = new GraphArray();
115121
array.forEach(e -> a.add(GraphElement.fromJson(e)));

src/main/java/org/javawebstack/graph/GraphElement.java

Lines changed: 139 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,188 @@
11
package org.javawebstack.graph;
22

3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
35
import com.google.gson.JsonElement;
6+
import org.javawebstack.querystring.QueryString;
7+
import org.yaml.snakeyaml.DumperOptions;
8+
import org.yaml.snakeyaml.Yaml;
49

510
import java.util.HashMap;
11+
import java.util.List;
612
import java.util.Map;
713

814
public interface GraphElement {
915
Type getType();
10-
default boolean isPrimitive(){
16+
17+
default boolean isPrimitive() {
1118
return false;
1219
}
13-
default boolean isObject(){
20+
21+
default boolean isObject() {
1422
return false;
1523
}
16-
default boolean isArray(){
24+
25+
default boolean isArray() {
1726
return false;
1827
}
19-
default boolean isNull(){
28+
29+
default boolean isNull() {
2030
return false;
2131
}
22-
default boolean isNumber(){
32+
33+
default boolean isNumber() {
2334
return false;
2435
}
25-
default boolean isBoolean(){
36+
37+
default boolean isBoolean() {
2638
return false;
2739
}
28-
default boolean isString(){
40+
41+
default boolean isString() {
2942
return false;
3043
}
31-
default GraphPrimitive primitive(){
44+
45+
default GraphPrimitive primitive() {
3246
return null;
3347
}
34-
default GraphArray array(){
48+
49+
default GraphArray array() {
3550
return null;
3651
}
37-
default GraphObject object(){
52+
53+
default GraphObject object() {
3854
return null;
3955
}
40-
default String string(){
41-
if(!isString())
56+
57+
default String string() {
58+
if (!isString())
4259
return null;
4360
return primitive().string();
4461
}
45-
default Boolean bool(){
46-
if(!isBoolean())
62+
63+
default Boolean bool() {
64+
if (!isBoolean())
4765
return null;
4866
return primitive().bool();
4967
}
50-
default Number number(){
51-
if(!isNumber())
68+
69+
default Number number() {
70+
if (!isNumber())
5271
return null;
5372
return primitive().number();
5473
}
74+
5575
JsonElement toJson();
76+
default String toJsonString(boolean pretty){
77+
if(pretty)
78+
return new GsonBuilder().setPrettyPrinting().create().toJson(toJson());
79+
return new Gson().toJson(toJson());
80+
}
81+
default String toJsonString(){
82+
return toJsonString(false);
83+
}
5684

57-
default Map<String, String> toFormData(){
58-
Map<String[], Object> tree = toTree();
59-
Map<String, String> data = new HashMap<>();
60-
for(String[] key : tree.keySet()){
61-
if(key == null || key.length == 0)
62-
continue;
63-
StringBuilder sb = new StringBuilder(key[0]);
64-
for(int i=1; i<key.length; i++)
65-
sb.append('[').append(key[i]).append(']');
66-
Object value = tree.get(key);
67-
data.put(sb.toString(), value == null ? "" : value.toString());
85+
Object toAbstractObject();
86+
87+
default String toYaml(boolean pretty){
88+
Yaml yaml;
89+
if(pretty){
90+
DumperOptions options = new DumperOptions();
91+
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
92+
options.setPrettyFlow(true);
93+
yaml = new Yaml(options);
94+
}else{
95+
yaml = new Yaml();
6896
}
97+
return yaml.dump(toAbstractObject());
98+
}
99+
100+
default String toYaml(){
101+
return toYaml(true);
102+
}
103+
104+
static GraphElement fromYaml(String source, boolean singleRoot){
105+
Yaml yaml = new Yaml();
106+
Object object = yaml.load(source);
107+
if(singleRoot && object instanceof List){
108+
List<Object> list = (List<Object>) object;
109+
if(list.size() == 0){
110+
object = new HashMap<>();
111+
}else{
112+
object = list.get(0);
113+
}
114+
}
115+
return fromAbstractObject(object);
116+
}
117+
118+
static GraphElement fromYaml(String source){
119+
return fromYaml(source, false);
120+
}
121+
122+
static GraphElement fromAbstractObject(Object object){
123+
if(object == null)
124+
return GraphNull.INSTANCE;
125+
if(object instanceof List){
126+
List<Object> list = (List<Object>) object;
127+
GraphArray array = new GraphArray();
128+
list.forEach(e -> array.add(fromAbstractObject(e)));
129+
return array;
130+
}
131+
if(object instanceof Map){
132+
Map<String, Object> map = (Map<String, Object>) object;
133+
GraphObject graphObject = new GraphObject();
134+
map.forEach((k,v) -> graphObject.set(k, fromAbstractObject(v)));
135+
return graphObject;
136+
}
137+
if(object instanceof Number)
138+
return new GraphPrimitive((Number) object);
139+
if(object instanceof String)
140+
return new GraphPrimitive((String) object);
141+
if(object instanceof Boolean)
142+
return new GraphPrimitive((Boolean) object);
143+
return GraphNull.INSTANCE;
144+
}
145+
146+
default QueryString toFormData() {
147+
Map<String[], Object> tree = toTree();
148+
QueryString data = new QueryString();
149+
for (String[] key : tree.keySet())
150+
data.set(key, tree.get(key) == null ? "" : tree.get(key).toString());
69151
return data;
70152
}
71153

154+
default String toFormDataString() {
155+
return toFormData().toString();
156+
}
157+
72158
Map<String[], Object> toTree();
73159

74-
static GraphElement fromJson(JsonElement element){
75-
if(element == null)
160+
static GraphElement fromJson(JsonElement element) {
161+
if (element == null)
76162
return null;
77-
if(element.isJsonArray())
163+
if (element.isJsonArray())
78164
return GraphArray.fromJson(element.getAsJsonArray());
79-
if(element.isJsonObject())
165+
if (element.isJsonObject())
80166
return GraphObject.fromJson(element.getAsJsonObject());
81-
if(element.isJsonPrimitive())
167+
if (element.isJsonPrimitive())
82168
return GraphPrimitive.fromJson(element.getAsJsonPrimitive());
83169
return GraphNull.INSTANCE;
84170
}
85171

86-
static GraphElement fromTree(Map<String[], Object> tree){
172+
static GraphElement fromJson(String json) {
173+
return fromJson(new Gson().fromJson(json, JsonElement.class));
174+
}
175+
176+
static GraphElement fromTree(Map<String[], Object> tree) {
87177
GraphObject object = new GraphObject();
88-
for(String[] key : tree.keySet()){
178+
for (String[] key : tree.keySet()) {
89179
GraphObject current = object;
90180
Object value = tree.get(key);
91181
int offset = 0;
92-
while (key.length - offset > 1){
93-
if(current.has(key[offset])){
182+
while (key.length - offset > 1) {
183+
if (current.has(key[offset])) {
94184
current = current.get(key[offset]).object();
95-
}else{
185+
} else {
96186
GraphObject n = new GraphObject();
97187
current.set(key[offset], n);
98188
current = n;
@@ -104,15 +194,16 @@ static GraphElement fromTree(Map<String[], Object> tree){
104194
return object;
105195
}
106196

107-
static GraphElement fromFormData(Map<String, String> formData){
108-
Map<String[], Object> tree = new HashMap<>();
109-
for(String k : formData.keySet()){
110-
String[] key = k.split("\\[");
111-
for(int i=1; i<key.length; i++)
112-
key[i] = key[i].substring(0, key[i].length()-1);
113-
tree.put(key, formData.get(k));
114-
}
115-
return fromTree(tree);
197+
static GraphElement fromFormData(Map<String, String> formData) {
198+
return fromFormData(new QueryString(formData));
199+
}
200+
201+
static GraphElement fromFormData(QueryString formData) {
202+
return fromTree(formData.toTree());
203+
}
204+
205+
static GraphElement fromFormData(String formData) {
206+
return fromFormData(new QueryString(formData));
116207
}
117208

118209
enum Type {
@@ -122,7 +213,8 @@ enum Type {
122213
BOOLEAN,
123214
OBJECT,
124215
ARRAY;
125-
public boolean isPrimitive(){
216+
217+
public boolean isPrimitive() {
126218
return this == NUMBER || this == BOOLEAN || this == STRING;
127219
}
128220
}

src/main/java/org/javawebstack/graph/GraphNull.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ public JsonElement toJson() {
2020
return JsonNull.INSTANCE;
2121
}
2222

23+
public Object toAbstractObject() {
24+
return null;
25+
}
26+
2327
public Map<String[], Object> toTree() {
2428
Map<String[], Object> map = new HashMap<>();
2529
map.put(new String[0], null);

src/main/java/org/javawebstack/graph/GraphObject.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ public JsonElement toJson() {
8888
return object;
8989
}
9090

91+
public Object toAbstractObject() {
92+
Map<String, Object> map = new HashMap<>();
93+
forEach((k,v) -> map.put(k, v.toAbstractObject()));
94+
return map;
95+
}
96+
9197
public static GraphObject fromJson(JsonObject object){
9298
GraphObject o = new GraphObject();
9399
object.keySet().forEach(k -> o.set(k, GraphElement.fromJson(object.get(k))));

src/main/java/org/javawebstack/graph/GraphPrimitive.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public JsonElement toJson() {
5858
return null;
5959
}
6060

61+
public Object toAbstractObject() {
62+
return value;
63+
}
64+
6165
public Map<String[], Object> toTree() {
6266
Map<String[], Object> tree = new HashMap<>();
6367
tree.put(new String[0], value);

0 commit comments

Comments
 (0)