Skip to content

Commit e6790b8

Browse files
authored
Merge pull request #29 from JavaWebStack/dev
Release 1.0.6
2 parents 858625f + 3641371 commit e6790b8

File tree

12 files changed

+343
-89
lines changed

12 files changed

+343
-89
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ You can find the current docs on our [website](https://docs.javawebstack.org/fra
2222
<dependency>
2323
<groupId>org.javawebstack</groupId>
2424
<artifactId>abstract-data</artifactId>
25-
<version>1.0.5</version>
25+
<version>1.0.6</version>
2626
</dependency>
2727
```

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<properties>
88
<maven.compiler.source>8</maven.compiler.source>
99
<maven.compiler.target>8</maven.compiler.target>
10-
<buildVersion>1.0.5-SNAPSHOT</buildVersion>
10+
<buildVersion>1.0.6-SNAPSHOT</buildVersion>
1111
</properties>
1212

1313
<groupId>org.javawebstack</groupId>
@@ -44,18 +44,18 @@
4444
<dependency>
4545
<groupId>org.yaml</groupId>
4646
<artifactId>snakeyaml</artifactId>
47-
<version>2.0</version>
47+
<version>2.2</version>
4848
</dependency>
4949
<dependency>
5050
<groupId>org.mongodb</groupId>
5151
<artifactId>bson</artifactId>
52-
<version>4.9.1</version>
52+
<version>4.10.2</version>
5353
<optional>true</optional>
5454
</dependency>
5555
<dependency>
5656
<groupId>org.junit.jupiter</groupId>
5757
<artifactId>junit-jupiter</artifactId>
58-
<version>5.9.3</version>
58+
<version>5.10.0</version>
5959
<scope>test</scope>
6060
</dependency>
6161
</dependencies>

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

Lines changed: 0 additions & 64 deletions
This file was deleted.

src/main/java/org/javawebstack/abstractdata/mapper/DefaultMappers.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import java.lang.reflect.Constructor;
1111
import java.lang.reflect.InvocationTargetException;
12-
import java.sql.Time;
1312
import java.sql.Timestamp;
1413
import java.text.ParseException;
1514
import java.text.SimpleDateFormat;
@@ -28,7 +27,7 @@ public final class DefaultMappers {
2827
public static final FallbackMapper FALLBACK = new FallbackMapper();
2928

3029
public static Map<Class<?>, MapperTypeAdapter> create() {
31-
Map<Class<?>, MapperTypeAdapter> map = new HashMap<>();
30+
Map<Class<?>, MapperTypeAdapter> map = new LinkedHashMap<>();
3231

3332
for (MapperTypeAdapter adapter : new MapperTypeAdapter[]{
3433
ABSTRACT,
@@ -64,20 +63,20 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
6463
}
6564
if (type.equals(char.class) || type.equals(Character.class)) {
6665
if (type.isPrimitive() && element.isNull())
67-
throw new MapperWrongTypeException(context.getField().getName(), "number", "null");
66+
throw new MapperWrongTypeException(context.getFieldName(), "number", "null");
6867
String s = element.string(context.getMapper().isStrict());
6968
if (s.length() != 1)
70-
throw new MapperException("Expected string of length 1 for field " + context.getField().getName() + " but received " + s.length());
69+
throw new MapperException("Expected string of length 1 for field " + context.getFieldName() + " but received " + s.length());
7170
return s.charAt(0);
7271
}
7372
if (type.equals(Boolean.class) || type.equals(boolean.class)) {
7473
if (type.isPrimitive() && element.isNull())
75-
throw new MapperWrongTypeException(context.getField().getName(), "number", "null");
74+
throw new MapperWrongTypeException(context.getFieldName(), "number", "null");
7675
return element.bool(context.getMapper().isStrict());
7776
}
7877
if (Number.class.isAssignableFrom(type) || type.isPrimitive()) {
7978
if (type.isPrimitive() && element.isNull())
80-
throw new MapperWrongTypeException(context.getField().getName(), "number", "null");
79+
throw new MapperWrongTypeException(context.getFieldName(), "number", "null");
8180
if (type.equals(int.class) || type.equals(Integer.class))
8281
return element.number(context.getMapper().isStrict()).intValue();
8382
if (type.equals(long.class) || type.equals(Long.class))
@@ -95,9 +94,9 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
9594
return element.number(context.getMapper().isStrict());
9695
}
9796
} catch (AbstractCoercingException ex) {
98-
throw new MapperWrongTypeException(context.getField().getName(), "string", Helpers.typeName(element));
97+
throw new MapperWrongTypeException(context.getField() != null ? context.getFieldName() : "", "string", Helpers.typeName(element));
9998
}
100-
throw new MapperWrongTypeException(context.getField().getName(), "primitive", Helpers.typeName(element));
99+
throw new MapperWrongTypeException(context.getFieldName(), "primitive", Helpers.typeName(element));
101100
}
102101

103102
public Class<?>[] getSupportedTypes() {
@@ -136,7 +135,7 @@ public AbstractElement toAbstract(MapperContext context, Object value) throws Ma
136135
}
137136

138137
public Object fromAbstract(MapperContext context, AbstractElement element, Class<?> type) throws MapperException {
139-
if (type.equals(List.class) || type.equals(AbstractList.class))
138+
if (type.equals(List.class) || type.equals(Collection.class) || type.equals(AbstractList.class))
140139
type = ArrayList.class;
141140
if (type.equals(Set.class))
142141
type = HashSet.class;
@@ -157,12 +156,13 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
157156
} catch (InstantiationException | IllegalAccessException e) {
158157
throw new RuntimeException(e);
159158
} catch (AbstractCoercingException ex) {
160-
throw new MapperWrongTypeException(context.getField().getName(), "array", Helpers.typeName(element));
159+
throw new MapperWrongTypeException(context.getFieldName(), "array", Helpers.typeName(element));
161160
}
162161
}
163162

164163
public Class<?>[] getSupportedTypes() {
165164
return new Class[]{
165+
Collection.class,
166166
List.class,
167167
ArrayList.class,
168168
CopyOnWriteArrayList.class,
@@ -216,7 +216,7 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
216216
} catch (InstantiationException | IllegalAccessException e) {
217217
throw new RuntimeException(e);
218218
} catch (AbstractCoercingException ex) {
219-
throw new MapperWrongTypeException(context.getField().getName(), "object", Helpers.typeName(element));
219+
throw new MapperWrongTypeException(context.getFieldName(), "object", Helpers.typeName(element));
220220
}
221221
}
222222

@@ -284,7 +284,7 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
284284
return new Timestamp(date.getTime());
285285
throw new MapperException("Unsupported date type '" + type.getName() + "'");
286286
} catch (ParseException | NumberFormatException | AbstractCoercingException ex) {
287-
throw new MapperException("Failed to parse date '" + element.string() + "'" + (context.getField() != null ? (" for field '" + context.getField().getName() + "'") : ""));
287+
throw new MapperException("Failed to parse date '" + element.string() + "'" + (context.getField() != null ? (" for field '" + context.getFieldName() + "'") : ""));
288288
}
289289
}
290290

@@ -311,13 +311,13 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
311311
if (type.equals(AbstractElement.class))
312312
return element;
313313
if (type.equals(AbstractNull.class) && !(element instanceof AbstractNull))
314-
throw new MapperWrongTypeException(context.getField().getName(), "null", Helpers.typeName(element));
314+
throw new MapperWrongTypeException(context.getFieldName(), "null", Helpers.typeName(element));
315315
if (type.equals(AbstractPrimitive.class) && !(element instanceof AbstractPrimitive))
316-
throw new MapperWrongTypeException(context.getField().getName(), "primitive", Helpers.typeName(element));
316+
throw new MapperWrongTypeException(context.getFieldName(), "primitive", Helpers.typeName(element));
317317
if (type.equals(AbstractObject.class) && !(element instanceof AbstractObject))
318-
throw new MapperWrongTypeException(context.getField().getName(), "object", Helpers.typeName(element));
318+
throw new MapperWrongTypeException(context.getFieldName(), "object", Helpers.typeName(element));
319319
if (type.equals(AbstractArray.class) && !(element instanceof AbstractArray))
320-
throw new MapperWrongTypeException(context.getField().getName(), "array", Helpers.typeName(element));
320+
throw new MapperWrongTypeException(context.getFieldName(), "array", Helpers.typeName(element));
321321
return element;
322322
}
323323

@@ -368,7 +368,7 @@ public AbstractElement toAbstract(MapperContext context, Object value) throws Ma
368368
public Object fromAbstract(MapperContext context, AbstractElement element, Class type) throws MapperException {
369369
if (type.isEnum()) {
370370
if (!element.isString())
371-
throw new MapperWrongTypeException(context.getField().getName(), "string", Helpers.typeName(element));
371+
throw new MapperWrongTypeException(context.getFieldName(), "string", Helpers.typeName(element));
372372
try {
373373
return Enum.valueOf(type, element.string());
374374
} catch (IllegalArgumentException ex) {
@@ -378,7 +378,7 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
378378
if (type.equals(UUID.class))
379379
return UUID.fromString(element.string());
380380
if (!element.isObject())
381-
throw new MapperWrongTypeException(context.getField().getName(), "object", Helpers.typeName(element));
381+
throw new MapperWrongTypeException(context.getFieldName(), "object", Helpers.typeName(element));
382382
MapperTypeSpec spec = MapperTypeSpec.get(type);
383383
if (spec == null)
384384
throw new MapperException("Unmappable type '" + type.getName() + "'");

src/main/java/org/javawebstack/abstractdata/mapper/Mapper.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,19 @@ public <T> T map(MapperContext context, AbstractElement element, Class<T> type)
4141
}
4242
if(context.getAdapter() != null)
4343
return (T) context.getAdapter().fromAbstract(context, element, type);
44-
return (T) adapters.getOrDefault(type, DefaultMappers.FALLBACK).fromAbstract(context, element, type);
44+
return (T) findAdapter(type).fromAbstract(context, element, type);
45+
}
46+
47+
private MapperTypeAdapter findAdapter(Class<?> type) {
48+
MapperTypeAdapter adapter = adapters.get(type);
49+
if(adapter != null)
50+
return adapter;
51+
for(Class<?> t : adapters.keySet()) {
52+
if(t.isAssignableFrom(type)) {
53+
return adapters.get(t);
54+
}
55+
}
56+
return DefaultMappers.FALLBACK;
4557
}
4658

4759
public AbstractElement map(Object obj) throws MapperException {
@@ -59,7 +71,7 @@ public AbstractElement map(MapperContext context, Object obj) throws MapperExcep
5971
}
6072
if(context.getAdapter() != null)
6173
return context.getAdapter().toAbstract(context, obj);
62-
return adapters.getOrDefault(obj.getClass(), DefaultMappers.FALLBACK).toAbstract(context, obj);
74+
return findAdapter(obj.getClass()).toAbstract(context, obj);
6375
}
6476

6577
public Mapper strict() {

src/main/java/org/javawebstack/abstractdata/mapper/MapperContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ public Field getField() {
3434
return field;
3535
}
3636

37+
public String getFieldName() {
38+
return field != null ? field.getName() : null;
39+
}
40+
3741
public boolean isNested() {
3842
return field != null;
3943
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.javawebstack.abstractdata.xml;
2+
3+
import org.w3c.dom.*;
4+
import org.xml.sax.SAXException;
5+
6+
import javax.xml.parsers.DocumentBuilderFactory;
7+
import javax.xml.parsers.ParserConfigurationException;
8+
import java.io.ByteArrayInputStream;
9+
import java.io.IOException;
10+
import java.nio.charset.StandardCharsets;
11+
12+
/*
13+
This is a temporary implementation using Java's built-in xml implementation
14+
*/
15+
public class LegacyXMLParser {
16+
17+
@Deprecated
18+
protected static XMLElement parse(String s) {
19+
try {
20+
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8)));
21+
return convert(document.getDocumentElement());
22+
} catch (SAXException | IOException | ParserConfigurationException e) {
23+
throw new RuntimeException(e);
24+
}
25+
}
26+
27+
private static XMLElement convert(Element element) {
28+
String tag = element.getTagName();
29+
XMLElement e = new XMLElement(tag);
30+
NamedNodeMap attrNodeMap = element.getAttributes();
31+
for(int i=0; i<attrNodeMap.getLength(); i++) {
32+
String name = attrNodeMap.item(i).getNodeName();
33+
String value = ((Attr) attrNodeMap.item(i)).getValue();
34+
e.attr(name, value);
35+
}
36+
NodeList nodeList = element.getChildNodes();
37+
for(int i=0; i<nodeList.getLength(); i++) {
38+
Node node = nodeList.item(i);
39+
switch (node.getNodeType()) {
40+
case Node.ATTRIBUTE_NODE: {
41+
Attr attr = (Attr) node;
42+
e.attr(attr.getName(), attr.getValue());
43+
break;
44+
}
45+
case Node.ELEMENT_NODE: {
46+
e.child(convert((Element) node));
47+
break;
48+
}
49+
case Node.CDATA_SECTION_NODE:
50+
case Node.TEXT_NODE: {
51+
e.child(new XMLTextNode(((Text) node).getData()));
52+
break;
53+
}
54+
}
55+
}
56+
return e;
57+
}
58+
59+
}

0 commit comments

Comments
 (0)