diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java index 6289dd810..97671b6ed 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java @@ -197,6 +197,13 @@ public class DatabasePlatform { return platform == null || platform.name().equalsIgnoreCase(name); } + /** + * Return true if this matches the given platform. + */ + public boolean isPlatform(Platform platform) { + return platform.name().equalsIgnoreCase(name); + } + /** * Return the name of the DatabasePlatform. *
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ArrayElementConverter.java b/src/main/java/com/avaje/ebeaninternal/server/type/ArrayElementConverter.java
index 0899fa40a..9bd2d23b7 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ArrayElementConverter.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ArrayElementConverter.java
@@ -5,7 +5,7 @@ import java.util.UUID;
/**
* Type conversion for use with ScalarTypeArrayList.
*/
-public interface ArrayElementConverter {
private static ScalarTypeArrayList UUID = new ScalarTypeArrayList("uuid", DocPropertyType.UUID, ArrayElementConverter.UUID);
-
private static ScalarTypeArrayList LONG = new ScalarTypeArrayList("bigint", DocPropertyType.LONG, ArrayElementConverter.LONG);
-
private static ScalarTypeArrayList INTEGER = new ScalarTypeArrayList("integer", DocPropertyType.INTEGER, ArrayElementConverter.INTEGER);
-
+ private static ScalarTypeArrayList DOUBLE = new ScalarTypeArrayList("float", DocPropertyType.DOUBLE, ArrayElementConverter.DOUBLE);
private static ScalarTypeArrayList STRING = new ScalarTypeArrayList("varchar", DocPropertyType.STRING, ArrayElementConverter.STRING);
- /**
- * Return the ScalarType to use based on the List's generic parameter type.
- */
- public static ScalarTypeArrayList typeFor(Type valueType) {
- if (valueType.equals(UUID.class)) {
- return UUID;
+ static PlatformArrayTypeFactory factory() {
+ return new Factory();
+ }
+
+ static class Factory implements PlatformArrayTypeFactory {
+
+ /**
+ * Return the ScalarType to use based on the List's generic parameter type.
+ */
+ public ScalarTypeArrayList typeFor(Type valueType) {
+ if (valueType.equals(UUID.class)) {
+ return UUID;
+ }
+ if (valueType.equals(Long.class)) {
+ return LONG;
+ }
+ if (valueType.equals(Integer.class)) {
+ return INTEGER;
+ }
+ if (valueType.equals(Double.class)) {
+ return DOUBLE;
+ }
+ if (valueType.equals(String.class)) {
+ return STRING;
+ }
+ throw new IllegalArgumentException("Type [" + valueType + "] not supported for @DbArray mapping");
}
- if (valueType.equals(Long.class)) {
- return LONG;
- }
- if (valueType.equals(Integer.class)) {
- return INTEGER;
- }
- if (valueType.equals(String.class)) {
- return STRING;
- }
- throw new IllegalArgumentException("Type [" + valueType + "] not supported for @DbArray mapping");
}
private final String arrayType;
@@ -79,7 +87,7 @@ public class ScalarTypeArrayList extends ScalarTypeJsonCollection
{
return new ModifyAwareList(list);
}
- private Object[] toArray(List value) {
+ protected Object[] toArray(List value) {
return value.toArray();
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListH2.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListH2.java
new file mode 100644
index 000000000..b9b4175d8
--- /dev/null
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListH2.java
@@ -0,0 +1,67 @@
+package com.avaje.ebeaninternal.server.type;
+
+import com.avaje.ebeanservice.docstore.api.mapping.DocPropertyType;
+
+import java.lang.reflect.Type;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+/**
+ * H2 database support for DB ARRAY.
+ */
+class ScalarTypeArrayListH2 extends ScalarTypeArrayList {
+
+ private static ScalarTypeArrayListH2 UUID = new ScalarTypeArrayListH2("uuid", DocPropertyType.UUID, ArrayElementConverter.UUID);
+ private static ScalarTypeArrayListH2 LONG = new ScalarTypeArrayListH2("bigint", DocPropertyType.LONG, ArrayElementConverter.LONG);
+ private static ScalarTypeArrayListH2 INTEGER = new ScalarTypeArrayListH2("integer", DocPropertyType.INTEGER, ArrayElementConverter.INTEGER);
+ private static ScalarTypeArrayListH2 DOUBLE = new ScalarTypeArrayListH2("double", DocPropertyType.DOUBLE, ArrayElementConverter.DOUBLE);
+ private static ScalarTypeArrayListH2 STRING = new ScalarTypeArrayListH2("varchar", DocPropertyType.STRING, ArrayElementConverter.STRING);
+
+ static PlatformArrayTypeFactory factory() {
+ return new ScalarTypeArrayListH2.Factory();
+ }
+
+ static class Factory implements PlatformArrayTypeFactory {
+
+ /**
+ * Return the ScalarType to use based on the List's generic parameter type.
+ */
+ public ScalarTypeArrayListH2 typeFor(Type valueType) {
+ if (valueType.equals(java.util.UUID.class)) {
+ return UUID;
+ }
+ if (valueType.equals(Long.class)) {
+ return LONG;
+ }
+ if (valueType.equals(Integer.class)) {
+ return INTEGER;
+ }
+ if (valueType.equals(Double.class)) {
+ return DOUBLE;
+ }
+ if (valueType.equals(String.class)) {
+ return STRING;
+ }
+ throw new IllegalArgumentException("Type [" + valueType + "] not supported for @DbArray mapping");
+ }
+ }
+
+ private ScalarTypeArrayListH2(String arrayType, DocPropertyType docPropertyType, ArrayElementConverter converter) {
+ super(arrayType, docPropertyType, converter);
+ }
+
+ @Override
+ public String getDbColumnDefn() {
+ return "array";
+ }
+
+ @Override
+ public void bind(DataBind bind, List value) throws SQLException {
+ if (value == null) {
+ bind.setNull(Types.ARRAY);
+ } else {
+ bind.setObject(toArray(value));
+ }
+ }
+}
diff --git a/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListTest.java b/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListTest.java
index 9a60004e5..22398359e 100644
--- a/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListTest.java
+++ b/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeArrayListTest.java
@@ -14,8 +14,7 @@ public class ScalarTypeArrayListTest {
DataReader mock = Mockito.mock(DataReader.class);
Mockito.when(mock.getArray()).thenReturn(null);
- ScalarTypeArrayList scalarType = ScalarTypeArrayList.typeFor(Long.class);
+ ScalarType> scalarType = ScalarTypeArrayList.factory().typeFor(Long.class);
scalarType.read(mock);
-
}
}
\ No newline at end of file
diff --git a/src/test/java/com/avaje/tests/model/array/EArrayBean.java b/src/test/java/com/avaje/tests/model/array/EArrayBean.java
index a16670a8c..c16960592 100644
--- a/src/test/java/com/avaje/tests/model/array/EArrayBean.java
+++ b/src/test/java/com/avaje/tests/model/array/EArrayBean.java
@@ -27,6 +27,9 @@ public class EArrayBean {
@DbArray
List