Hmm, this breaks the isolation between our modules - jsonp impl must stay switchable in mapper and jsonb modules.
Can we just duplicate the class - the old shade+relocation hack is fine for me? Also, does Foo[] match Object[] or do we have some regression - think we should harness such an utility with an exhaustive test kit? Romain ---------- Forwarded message --------- De : <strub...@apache.org> Date: lun. 29 juil. 2019 à 23:08 Subject: [johnzon] branch master updated: JOHNZON-226 use own Array.length To: comm...@johnzon.apache.org <comm...@johnzon.apache.org> This is an automated email from the ASF dual-hosted git repository. struberg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git The following commit(s) were added to refs/heads/master by this push: new 41e0fdc JOHNZON-226 use own Array.length 41e0fdc is described below commit 41e0fdc50c59153a03e49e85afac534949ece4e6 Author: Mark Struberg <strub...@apache.org> AuthorDate: Mon Jul 29 22:49:54 2019 +0200 JOHNZON-226 use own Array.length --- .../apache/johnzon/core/JsonArrayBuilderImpl.java | 4 ++- .../org/apache/johnzon/core}/util/ArrayUtil.java | 36 +++++++++++++++++++++- .../org/apache/johnzon/jsonb/JohnzonJsonb.java | 15 ++++----- .../java/org/apache/johnzon/mapper/Mapper.java | 2 +- .../johnzon/mapper/MappingGeneratorImpl.java | 35 ++------------------- 5 files changed, 49 insertions(+), 43 deletions(-) diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java index f105eaf..effd30a 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java @@ -33,6 +33,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import org.apache.johnzon.core.util.ArrayUtil; + class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { private List<JsonValue> tmpList; private BufferStrategy.BufferProvider<char[]> bufferProvider; @@ -223,7 +225,7 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { } else if (value instanceof Collection) { add(new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider).build()); } else if (value.getClass().isArray()) { - final int length = Array.getLength(value); + final int length = ArrayUtil.getArrayLength(value); final Collection<Object> collection = new ArrayList<>(length); for (int i = 0; i < length; i++) { collection.add(Array.get(value, i)); diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/util/ArrayUtil.java b/johnzon-core/src/main/java/org/apache/johnzon/core/util/ArrayUtil.java similarity index 75% rename from johnzon-mapper/src/main/java/org/apache/johnzon/mapper/util/ArrayUtil.java rename to johnzon-core/src/main/java/org/apache/johnzon/core/util/ArrayUtil.java index a7a6c57..646c112 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/util/ArrayUtil.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/util/ArrayUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.mapper.util; +package org.apache.johnzon.core.util; import java.util.AbstractList; import java.util.List; @@ -27,6 +27,40 @@ public final class ArrayUtil { // utility class ct } + public static int getArrayLength(Object array) { + // Note: all types of multidimensional arrays are instanceof Object[] + if (array instanceof Object[]) { + return ((Object[]) array).length; + } + if (array instanceof boolean[]) { + return ((boolean[])array).length; + } + if (array instanceof byte[]) { + return ((byte[])array).length; + } + if (array instanceof char[]) { + return ((char[]) array).length; + } + if (array instanceof short[]) { + return ((short[]) array).length; + } + if (array instanceof int[]) { + return ((int[]) array).length; + } + if (array instanceof long[]) { + return ((long[]) array).length; + } + if (array instanceof float[]) { + return ((float[]) array).length; + } + if (array instanceof double[]) { + return ((double[]) array).length; + } + + throw new IllegalArgumentException("This is not an array! " + array); + } + + public static List<Integer> asList(final int[] vals) { return new AbstractList<Integer>() { @Override diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java index a9adada..7965519 100644 --- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java +++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java @@ -18,6 +18,7 @@ */ package org.apache.johnzon.jsonb; +import org.apache.johnzon.core.util.ArrayUtil; import org.apache.johnzon.jsonb.api.experimental.JsonbExtension; import org.apache.johnzon.jsonb.extension.JsonValueReader; import org.apache.johnzon.jsonb.extension.JsonValueWriter; @@ -254,43 +255,43 @@ public class JohnzonJsonb implements Jsonb, AutoCloseable, JsonbExtension { final Class<?> componentType = object.getClass().getComponentType(); Object[] array; if (int.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getInt(object, i); } } else if (double.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getDouble(object, i); } } else if (byte.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getByte(object, i); } } else if (char.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getChar(object, i); } } else if (float.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getFloat(object, i); } } else if (long.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getLong(object, i); } } else if (short.class == componentType) { - final int length = Array.getLength(object); + final int length = ArrayUtil.getArrayLength(object); array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Array.getShort(object, i); diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java index 1027fca..b95935e 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java @@ -53,7 +53,7 @@ import javax.json.stream.JsonGeneratorFactory; import org.apache.johnzon.mapper.internal.JsonPointerTracker; import org.apache.johnzon.mapper.reflection.JohnzonCollectionType; -import org.apache.johnzon.mapper.util.ArrayUtil; +import org.apache.johnzon.core.util.ArrayUtil; public class Mapper implements Closeable { diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java index 1b4d4e8..27de775 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java @@ -21,6 +21,7 @@ package org.apache.johnzon.mapper; import static java.util.Collections.emptyList; import org.apache.johnzon.mapper.internal.JsonPointerTracker; +import org.apache.johnzon.core.util.ArrayUtil; import javax.json.JsonValue; import javax.json.stream.JsonGenerator; @@ -470,7 +471,7 @@ public class MappingGeneratorImpl implements MappingGenerator { * @param key either the attribute key or {@code null} if the array should be rendered without key */ private void writeArray(Class<?> type, Adapter itemConverter, String key, Object arrayValue, Collection<String> ignoredProperties, JsonPointerTracker jsonPointer) { - final int length = getArrayLength(arrayValue); + final int length = ArrayUtil.getArrayLength(arrayValue); if (length == 0 && config.isSkipEmptyArray()) { return; } @@ -582,38 +583,6 @@ public class MappingGeneratorImpl implements MappingGenerator { generator.writeEnd(); } - private int getArrayLength(Object array) { - // Note: all types of multidimensional arrays are instanceof Object[] - if (array instanceof Object[]) { - return ((Object[]) array).length; - } - if (array instanceof boolean[]) { - return ((boolean[])array).length; - } - if (array instanceof byte[]) { - return ((byte[])array).length; - } - if (array instanceof char[]) { - return ((char[]) array).length; - } - if (array instanceof short[]) { - return ((short[]) array).length; - } - if (array instanceof int[]) { - return ((int[]) array).length; - } - if (array instanceof long[]) { - return ((long[]) array).length; - } - if (array instanceof float[]) { - return ((float[]) array).length; - } - if (array instanceof double[]) { - return ((double[]) array).length; - } - - throw new IllegalArgumentException("This is not an array! " + array); - } private void writeItem(final Object o, final Collection<String> ignoredProperties, JsonPointerTracker jsonPointer) { if (o == null) {