DATACMNS-1035 - Moved CustomConversions to Spring Data Commons.

Extracted CustomConversions — whose code has largely been duplicated between the MongoDB, Couchbase and Cassandra modules — into Spring Data Commons. Store-specific extensions can now be contributed via a StoreConversions value type that carries both, store-specific default converters as well as a store-specific SimpleTypeHolder to augment the default list of simple types.

Removed SimpleTypeHolders public default constructor in favour of a protected one and a static DEFAULT instance for plain references.

Original pull request: #210.
This commit is contained in:
Oliver Gierke
2017-04-20 18:01:22 +02:00
parent 713976d2a6
commit 233fde36b5
6 changed files with 828 additions and 51 deletions

View File

@@ -89,7 +89,7 @@ public abstract class AbstractMappingContext<E extends MutablePersistentEntity<?
private Set<? extends Class<?>> initialEntitySet = new HashSet<>();
private boolean strict = false;
private SimpleTypeHolder simpleTypeHolder = new SimpleTypeHolder();
private SimpleTypeHolder simpleTypeHolder = SimpleTypeHolder.DEFAULT;
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock read = lock.readLock();

View File

@@ -32,39 +32,43 @@ import org.springframework.util.Assert;
*/
public class SimpleTypeHolder {
private static final Set<Class<?>> DEFAULTS = new HashSet<>();
private static final Set<Class<?>> DEFAULTS = new HashSet<Class<?>>() {
static {
DEFAULTS.add(boolean.class);
DEFAULTS.add(boolean[].class);
DEFAULTS.add(long.class);
DEFAULTS.add(long[].class);
DEFAULTS.add(short.class);
DEFAULTS.add(short[].class);
DEFAULTS.add(int.class);
DEFAULTS.add(int[].class);
DEFAULTS.add(byte.class);
DEFAULTS.add(byte[].class);
DEFAULTS.add(float.class);
DEFAULTS.add(float[].class);
DEFAULTS.add(double.class);
DEFAULTS.add(double[].class);
DEFAULTS.add(char.class);
DEFAULTS.add(char[].class);
DEFAULTS.add(Boolean.class);
DEFAULTS.add(Long.class);
DEFAULTS.add(Short.class);
DEFAULTS.add(Integer.class);
DEFAULTS.add(Byte.class);
DEFAULTS.add(Float.class);
DEFAULTS.add(Double.class);
DEFAULTS.add(Character.class);
DEFAULTS.add(String.class);
DEFAULTS.add(Date.class);
DEFAULTS.add(Locale.class);
DEFAULTS.add(Class.class);
DEFAULTS.add(Enum.class);
}
private static final long serialVersionUID = -1738594126505221500L;
{
add(boolean.class);
add(boolean[].class);
add(long.class);
add(long[].class);
add(short.class);
add(short[].class);
add(int.class);
add(int[].class);
add(byte.class);
add(byte[].class);
add(float.class);
add(float[].class);
add(double.class);
add(double[].class);
add(char.class);
add(char[].class);
add(Boolean.class);
add(Long.class);
add(Short.class);
add(Integer.class);
add(Byte.class);
add(Float.class);
add(Double.class);
add(Character.class);
add(String.class);
add(Date.class);
add(Locale.class);
add(Class.class);
add(Enum.class);
}
};
public static final SimpleTypeHolder DEFAULT = new SimpleTypeHolder();
private final Set<Class<?>> simpleTypes;
@@ -73,8 +77,7 @@ public class SimpleTypeHolder {
*
* @see #SimpleTypeHolder(Set, boolean)
*/
@SuppressWarnings("unchecked")
public SimpleTypeHolder() {
protected SimpleTypeHolder() {
this(Collections.emptySet(), true);
}
@@ -128,13 +131,8 @@ public class SimpleTypeHolder {
return true;
}
for (Class<?> clazz : simpleTypes) {
if (clazz.isAssignableFrom(type)) {
simpleTypes.add(type);
return true;
}
}
return false;
return simpleTypes.stream()//
.filter(it -> it.isAssignableFrom(type))//
.peek(it -> simpleTypes.add(type)).findFirst().isPresent();
}
}