Skip to content

Commit 26c8c3a

Browse files
committed
Added support for custom implementations of Collections and Maps
1 parent 87c354e commit 26c8c3a

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

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

Lines changed: 3 additions & 3 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,
@@ -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;
@@ -163,6 +162,7 @@ public Object fromAbstract(MapperContext context, AbstractElement element, Class
163162

164163
public Class<?>[] getSupportedTypes() {
165164
return new Class[]{
165+
Collection.class,
166166
List.class,
167167
ArrayList.class,
168168
CopyOnWriteArrayList.class,

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() {

0 commit comments

Comments
 (0)