Skip to content

Commit e710641

Browse files
authored
Merge pull request #4 from JavaWebStack/feature/implement-own-mapper
Implemented a new mapper as a replacement for gson.
2 parents 3cdd672 + f8505a2 commit e710641

31 files changed

+1276
-252
lines changed

pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@
4141
</scm>
4242

4343
<dependencies>
44-
<dependency>
45-
<groupId>com.google.code.gson</groupId>
46-
<artifactId>gson</artifactId>
47-
<version>2.8.9</version>
48-
</dependency>
4944
<dependency>
5045
<groupId>org.yaml</groupId>
5146
<artifactId>snakeyaml</artifactId>

src/main/java/org/javawebstack/abstractdata/AbstractArray.java

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.JsonArray;
4-
import com.google.gson.JsonElement;
5-
63
import java.util.*;
74
import java.util.stream.Stream;
85

@@ -242,7 +239,7 @@ public int size() {
242239

243240
public boolean contains(Object o) {
244241
for (AbstractElement element : elements) {
245-
if (o instanceof AbstractElement ? ((AbstractElement) o).toAbstractObject().equals(element.toAbstractObject()) : element.toAbstractObject().equals(o))
242+
if (o instanceof AbstractElement ? ((AbstractElement) o).toObject().equals(element.toObject()) : element.toObject().equals(o))
246243
return true;
247244
}
248245
return false;
@@ -257,25 +254,12 @@ public Iterator<AbstractElement> iterator() {
257254
return elements.iterator();
258255
}
259256

260-
public JsonElement toJson() {
261-
JsonArray array = new JsonArray();
262-
elements.forEach(e -> array.add(e.toJson()));
263-
return array;
264-
}
265-
266-
public Object toAbstractObject() {
257+
public Object toObject() {
267258
List<Object> list = new ArrayList<>();
268-
elements.forEach(e -> list.add(e.toAbstractObject()));
259+
elements.forEach(e -> list.add(e.toObject()));
269260
return list;
270261
}
271262

272-
public static AbstractArray fromJson(JsonArray array) {
273-
AbstractArray a = new AbstractArray();
274-
array.forEach(e -> a.add(AbstractElement.fromJson(e)));
275-
return a;
276-
}
277-
278-
279263
public static AbstractArray fromArray(Object[] objects) {
280264
return new AbstractArray(objects);
281265
}

src/main/java/org/javawebstack/abstractdata/AbstractElement.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.Gson;
4-
import com.google.gson.GsonBuilder;
5-
import com.google.gson.JsonElement;
3+
import org.javawebstack.abstractdata.json.JsonDumper;
4+
import org.javawebstack.abstractdata.json.JsonParser;
65
import org.javawebstack.abstractdata.util.QueryString;
76
import org.yaml.snakeyaml.DumperOptions;
87
import org.yaml.snakeyaml.Yaml;
98

9+
import java.text.ParseException;
1010
import java.util.HashMap;
1111
import java.util.List;
1212
import java.util.Map;
@@ -73,19 +73,15 @@ default Number number() {
7373
return primitive().number();
7474
}
7575

76-
JsonElement toJson();
77-
7876
default String toJsonString(boolean pretty) {
79-
if (pretty)
80-
return new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(toJson());
81-
return new GsonBuilder().disableHtmlEscaping().create().toJson(toJson());
77+
return new JsonDumper().setPretty(pretty).dump(this);
8278
}
8379

8480
default String toJsonString() {
8581
return toJsonString(false);
8682
}
8783

88-
Object toAbstractObject();
84+
Object toObject();
8985

9086
default String toYaml(boolean pretty) {
9187
Yaml yaml;
@@ -97,7 +93,7 @@ default String toYaml(boolean pretty) {
9793
} else {
9894
yaml = new Yaml();
9995
}
100-
return yaml.dump(toAbstractObject());
96+
return yaml.dump(toObject());
10197
}
10298

10399
default String toYaml() {
@@ -162,20 +158,13 @@ default String toFormDataString() {
162158

163159
Map<String[], Object> toTree();
164160

165-
static AbstractElement fromJson(JsonElement element) {
166-
if (element == null)
167-
return null;
168-
if (element.isJsonArray())
169-
return AbstractArray.fromJson(element.getAsJsonArray());
170-
if (element.isJsonObject())
171-
return AbstractObject.fromJson(element.getAsJsonObject());
172-
if (element.isJsonPrimitive())
173-
return AbstractPrimitive.fromJson(element.getAsJsonPrimitive());
174-
return AbstractNull.INSTANCE;
175-
}
176-
177161
static AbstractElement fromJson(String json) {
178-
return fromJson(new GsonBuilder().create().fromJson(json, JsonElement.class));
162+
try {
163+
return new JsonParser().parse(json);
164+
} catch (ParseException e) {
165+
e.printStackTrace();
166+
return null;
167+
}
179168
}
180169

181170
static AbstractElement fromTree(Map<String[], Object> tree) {

src/main/java/org/javawebstack/abstractdata/AbstractMapper.java

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.ExclusionStrategy;
4-
import com.google.gson.FieldAttributes;
5-
import com.google.gson.Gson;
6-
import com.google.gson.GsonBuilder;
7-
import com.google.gson.annotations.Expose;
8-
import org.javawebstack.abstractdata.util.GsonAbstractDataAdapter;
3+
import org.javawebstack.abstractdata.mapper.Mapper;
94

105
public class AbstractMapper {
116

12-
private Gson gson;
7+
private final Mapper mapper = new Mapper();
138
private NamingPolicy namingPolicy = NamingPolicy.NONE;
149
private String dateFormat = "yyyy-MM-dd HH:mm:ss";
1510
private boolean exposeRequired = false;
1611

1712
public AbstractMapper setNamingPolicy(NamingPolicy namingPolicy) {
1813
this.namingPolicy = namingPolicy;
19-
gson = null;
14+
mapper.namingPolicy(namingPolicy.getMapperPolicy());
2015
return this;
2116
}
2217

@@ -26,7 +21,7 @@ public NamingPolicy getNamingPolicy() {
2621

2722
public AbstractMapper setExposeRequired(boolean exposeRequired) {
2823
this.exposeRequired = exposeRequired;
29-
gson = null;
24+
mapper.requireExpose(exposeRequired);
3025
return this;
3126
}
3227

@@ -36,52 +31,22 @@ public boolean isExposeRequired() {
3631

3732
public AbstractMapper setDateFormat(String dateFormat) {
3833
this.dateFormat = dateFormat;
39-
gson = null;
34+
mapper.dateFormat(dateFormat);
4035
return this;
4136
}
4237

4338
public String getDateFormat() {
4439
return dateFormat;
4540
}
4641

47-
private Gson gson() {
48-
if (gson != null)
49-
return gson;
50-
GsonBuilder builder = new GsonBuilder()
51-
.registerTypeAdapter(AbstractElement.class, new GsonAbstractDataAdapter<>())
52-
.registerTypeAdapter(AbstractObject.class, new GsonAbstractDataAdapter<>())
53-
.registerTypeAdapter(AbstractArray.class, new GsonAbstractDataAdapter<>())
54-
.registerTypeAdapter(AbstractPrimitive.class, new GsonAbstractDataAdapter<>())
55-
.registerTypeAdapter(AbstractNull.class, new GsonAbstractDataAdapter<>())
56-
.setFieldNamingPolicy(namingPolicy.getGsonPolicy())
57-
.disableHtmlEscaping();
58-
if (dateFormat != null)
59-
builder.setDateFormat(dateFormat);
60-
if (exposeRequired) {
61-
builder.excludeFieldsWithoutExposeAnnotation();
62-
} else {
63-
builder.setExclusionStrategies(new ExclusionStrategy() {
64-
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
65-
return fieldAttributes.getAnnotation(Expose.class) != null && !fieldAttributes.getAnnotation(Expose.class).serialize();
66-
}
67-
68-
public boolean shouldSkipClass(Class<?> aClass) {
69-
return false;
70-
}
71-
});
72-
}
73-
gson = builder.create();
74-
return gson;
75-
}
76-
7742
public AbstractElement toAbstract(Object object) {
78-
return AbstractElement.fromJson(gson().toJsonTree(object));
43+
return mapper.map(object);
7944
}
8045

8146
public <T> T fromAbstract(AbstractElement element, Class<T> type) {
8247
if (element == null)
8348
return null;
84-
return gson().fromJson(element.toJson(), type);
49+
return mapper.map(element, type);
8550
}
8651

8752

src/main/java/org/javawebstack/abstractdata/AbstractNull.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.JsonElement;
4-
import com.google.gson.JsonNull;
5-
63
import java.util.HashMap;
74
import java.util.Map;
85

@@ -17,11 +14,7 @@ public boolean isNull() {
1714
return true;
1815
}
1916

20-
public JsonElement toJson() {
21-
return JsonNull.INSTANCE;
22-
}
23-
24-
public Object toAbstractObject() {
17+
public Object toObject() {
2518
return null;
2619
}
2720

src/main/java/org/javawebstack/abstractdata/AbstractObject.java

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.JsonElement;
4-
import com.google.gson.JsonObject;
5-
63
import java.lang.reflect.Field;
74
import java.util.HashMap;
5+
import java.util.LinkedHashMap;
86
import java.util.Map;
97
import java.util.Set;
108
import java.util.function.BiConsumer;
119

1210
public class AbstractObject implements AbstractElement {
1311

14-
private final Map<String, AbstractElement> entries = new HashMap<>();
12+
private final Map<String, AbstractElement> entries = new LinkedHashMap<>();
13+
14+
public Set<Map.Entry<String, AbstractElement>> entries() {
15+
return entries.entrySet();
16+
}
1517

1618
public AbstractObject setNull(String key) {
1719
set(key, AbstractNull.INSTANCE);
@@ -153,24 +155,12 @@ public Number number(String key, Number orElse) {
153155
return query(key, new AbstractPrimitive(orElse)).number();
154156
}
155157

156-
public JsonElement toJson() {
157-
JsonObject object = new JsonObject();
158-
entries.forEach((k, v) -> object.add(k, v.toJson()));
159-
return object;
160-
}
161-
162-
public Object toAbstractObject() {
158+
public Object toObject() {
163159
Map<String, Object> map = new HashMap<>();
164-
forEach((k, v) -> map.put(k, v.toAbstractObject()));
160+
forEach((k, v) -> map.put(k, v.toObject()));
165161
return map;
166162
}
167163

168-
public static AbstractObject fromJson(JsonObject object) {
169-
AbstractObject o = new AbstractObject();
170-
object.entrySet().stream().map(Map.Entry::getKey).forEach(k -> o.set(k, AbstractElement.fromJson(object.get(k))));
171-
return o;
172-
}
173-
174164
public Type getType() {
175165
return Type.OBJECT;
176166
}
@@ -188,7 +178,7 @@ public <T> T fill(Object object) {
188178
field.setAccessible(true);
189179

190180
try {
191-
field.set(object, get(field.getName()).toAbstractObject());
181+
field.set(object, get(field.getName()).toObject());
192182
} catch (IllegalAccessException e) {
193183
e.printStackTrace();
194184
}

src/main/java/org/javawebstack/abstractdata/AbstractPrimitive.java

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.JsonElement;
4-
import com.google.gson.JsonPrimitive;
5-
63
import java.util.HashMap;
74
import java.util.Map;
85

@@ -59,17 +56,7 @@ public Object value() {
5956
return value;
6057
}
6158

62-
public JsonElement toJson() {
63-
if (isString())
64-
return new JsonPrimitive(string());
65-
if (isBoolean())
66-
return new JsonPrimitive(bool());
67-
if (isNumber())
68-
return new JsonPrimitive(number());
69-
return null;
70-
}
71-
72-
public Object toAbstractObject() {
59+
public Object toObject() {
7360
return value;
7461
}
7562

@@ -79,16 +66,6 @@ public Map<String[], Object> toTree() {
7966
return tree;
8067
}
8168

82-
public static AbstractPrimitive fromJson(JsonPrimitive primitive) {
83-
if (primitive == null)
84-
return null;
85-
if (primitive.isNumber())
86-
return new AbstractPrimitive(primitive.getAsNumber());
87-
if (primitive.isBoolean())
88-
return new AbstractPrimitive(primitive.getAsBoolean());
89-
return new AbstractPrimitive(primitive.getAsString());
90-
}
91-
9269
public static AbstractPrimitive from(Object object) {
9370
if (object instanceof Number)
9471
return new AbstractPrimitive((Number) object);
Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package org.javawebstack.abstractdata;
22

3-
import com.google.gson.FieldNamingPolicy;
4-
53
public enum NamingPolicy {
6-
NONE(FieldNamingPolicy.IDENTITY),
7-
CAMEL_CASE(FieldNamingPolicy.IDENTITY),
8-
PASCAL_CASE(FieldNamingPolicy.UPPER_CAMEL_CASE),
9-
SNAKE_CASE(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES),
10-
KEBAB_CASE(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);
11-
private final FieldNamingPolicy policy;
4+
5+
NONE(org.javawebstack.abstractdata.mapper.naming.NamingPolicy.NONE),
6+
CAMEL_CASE(org.javawebstack.abstractdata.mapper.naming.NamingPolicy.CAMEL_CASE),
7+
PASCAL_CASE(org.javawebstack.abstractdata.mapper.naming.NamingPolicy.PASCAL_CASE),
8+
SNAKE_CASE(org.javawebstack.abstractdata.mapper.naming.NamingPolicy.SNAKE_CASE),
9+
KEBAB_CASE(org.javawebstack.abstractdata.mapper.naming.NamingPolicy.KEBAB_CASE);
10+
11+
private final org.javawebstack.abstractdata.mapper.naming.NamingPolicy mapperPolicy;
1212

13-
NamingPolicy(FieldNamingPolicy policy) {
14-
this.policy = policy;
13+
NamingPolicy(org.javawebstack.abstractdata.mapper.naming.NamingPolicy mapperPolicy) {
14+
this.mapperPolicy = mapperPolicy;
1515
}
1616

17-
public FieldNamingPolicy getGsonPolicy() {
18-
return policy;
17+
public org.javawebstack.abstractdata.mapper.naming.NamingPolicy getMapperPolicy() {
18+
return mapperPolicy;
1919
}
20+
2021
}

0 commit comments

Comments
 (0)