From bae00eca77a8b3819ec87980e531eb6245f2152c Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 13 Dec 2013 14:21:46 +0100 Subject: [PATCH] [#2655] Improve ArrayIndexOutOfBoundsException: -1 error message when unknown field is accessed from a record --- .../java/org/jooq/impl/AbstractRecord.java | 23 ++++---- jOOQ/src/main/java/org/jooq/impl/Fields.java | 10 ++-- .../main/java/org/jooq/impl/ResultImpl.java | 23 ++++---- jOOQ/src/main/java/org/jooq/impl/Utils.java | 53 +++++++++++++++++++ 4 files changed, 83 insertions(+), 26 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java index 8b75461ece..7cf21c7bb8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java @@ -48,6 +48,7 @@ import static org.jooq.impl.Utils.getAnnotatedMembers; import static org.jooq.impl.Utils.getMatchingGetter; import static org.jooq.impl.Utils.getMatchingMembers; import static org.jooq.impl.Utils.hasColumnAnnotations; +import static org.jooq.impl.Utils.indexOrFail; import static org.jooq.impl.Utils.settings; import java.lang.reflect.Method; @@ -288,7 +289,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { } final Value getValue0(Field field) { - return getValue0(fieldsRow().indexOf(field)); + return getValue0(indexOrFail(fieldsRow(), field)); } final Value[] getValues() { @@ -305,7 +306,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void setValue(Field field, T value) { - setValue(fields.indexOf(field), field, value); + setValue(indexOrFail(fields, field), field, value); } private final void setValue(int index, Field field, T value) { @@ -351,7 +352,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { } final void setValue(Field field, Value value) { - setValue(fieldsRow().indexOf(field), value); + setValue(indexOrFail(fieldsRow(), field), value); } final void setValue(int index, Value value) { @@ -388,7 +389,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final T original(Field field) { - return (T) original(fieldsRow().indexOf(field)); + return (T) original(indexOrFail(fieldsRow(), field)); } @Override @@ -398,7 +399,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final Object original(String fieldName) { - return original(fieldsRow().indexOf(fieldName)); + return original(indexOrFail(fieldsRow(), fieldName)); } @Override @@ -414,7 +415,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final boolean changed(Field field) { - return changed(fieldsRow().indexOf(field)); + return changed(indexOrFail(fieldsRow(), field)); } @Override @@ -424,7 +425,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final boolean changed(String fieldName) { - return changed(fieldsRow().indexOf(fieldName)); + return changed(indexOrFail(fieldsRow(), fieldName)); } @Override @@ -436,7 +437,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void changed(Field field, boolean changed) { - changed(fieldsRow().indexOf(field), changed); + changed(indexOrFail(fieldsRow(), field), changed); } @Override @@ -446,7 +447,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void changed(String fieldName, boolean changed) { - changed(fieldsRow().indexOf(fieldName), changed); + changed(indexOrFail(fieldsRow(), fieldName), changed); } @Override @@ -458,7 +459,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void reset(Field field) { - reset(fieldsRow().indexOf(field)); + reset(indexOrFail(fieldsRow(), field)); } @Override @@ -468,7 +469,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void reset(String fieldName) { - reset(fieldsRow().indexOf(fieldName)); + reset(indexOrFail(fieldsRow(), fieldName)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Fields.java b/jOOQ/src/main/java/org/jooq/impl/Fields.java index ce3d11aafe..e0a6c83948 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Fields.java +++ b/jOOQ/src/main/java/org/jooq/impl/Fields.java @@ -41,6 +41,8 @@ package org.jooq.impl; +import static org.jooq.impl.Utils.indexOrFail; + import java.util.Collection; import org.jooq.BindContext; @@ -205,7 +207,7 @@ class Fields extends AbstractQueryPart implements RecordType type(String fieldName) { - return type(indexOf(fieldName)); + return type(indexOrFail(this, fieldName)); } @Override @@ -227,14 +229,14 @@ class Fields extends AbstractQueryPart implements RecordType dataType(String fieldName) { - return dataType(indexOf(fieldName)); + return dataType(indexOrFail(this, fieldName)); } final int[] indexesOf(Field... f) { int[] result = new int[f.length]; for (int i = 0; i < f.length; i++) { - result[i] = indexOf(f[i]); + result[i] = indexOrFail(this, f[i]); } return result; @@ -244,7 +246,7 @@ class Fields extends AbstractQueryPart implements RecordType implements Result, AttachableInternal { @SuppressWarnings("unchecked") @Override public final List getValues(Field field) { - return (List) getValues(fieldsRow().indexOf(field)); + return (List) getValues(indexOrFail(fieldsRow(), field)); } @Override @@ -774,7 +775,7 @@ class ResultImpl implements Result, AttachableInternal { @SuppressWarnings("unchecked") @Override public final Map intoMap(Field key) { - int index = fieldsRow().indexOf(key); + int index = indexOrFail(fieldsRow(), key); Map map = new LinkedHashMap(); for (R record : this) { @@ -789,8 +790,8 @@ class ResultImpl implements Result, AttachableInternal { @SuppressWarnings("unchecked") @Override public final Map intoMap(Field key, Field value) { - int kIndex = fieldsRow().indexOf(key); - int vIndex = fieldsRow().indexOf(value); + int kIndex = indexOrFail(fieldsRow(), key); + int vIndex = indexOrFail(fieldsRow(), value); Map map = new LinkedHashMap(); @@ -855,7 +856,7 @@ class ResultImpl implements Result, AttachableInternal { @Override public final Map intoMap(Field key, Class type) { RecordMapper mapper = Utils.configuration(this).recordMapperProvider().provide(fields, type); - int index = fieldsRow().indexOf(key); + int index = indexOrFail(fieldsRow(), key); Map map = new LinkedHashMap(); for (R record : this) { @@ -870,7 +871,7 @@ class ResultImpl implements Result, AttachableInternal { @SuppressWarnings("unchecked") @Override public final Map> intoGroups(Field key) { - int index = fieldsRow().indexOf(key); + int index = indexOrFail(fieldsRow(), key); Map> map = new LinkedHashMap>(); for (R record : this) { @@ -891,8 +892,8 @@ class ResultImpl implements Result, AttachableInternal { @SuppressWarnings("unchecked") @Override public final Map> intoGroups(Field key, Field value) { - int kIndex = fieldsRow().indexOf(key); - int vIndex = fieldsRow().indexOf(value); + int kIndex = indexOrFail(fieldsRow(), key); + int vIndex = indexOrFail(fieldsRow(), value); Map> map = new LinkedHashMap>(); @@ -944,7 +945,7 @@ class ResultImpl implements Result, AttachableInternal { @Override public final Map> intoGroups(Field key, Class type) { RecordMapper mapper = Utils.configuration(this).recordMapperProvider().provide(fields, type); - int index = fieldsRow().indexOf(key); + int index = indexOrFail(fieldsRow(), key); Map> map = new LinkedHashMap>(); for (R record : this) { @@ -1124,7 +1125,7 @@ class ResultImpl implements Result, AttachableInternal { @Override public final Result sortAsc(Field field, Comparator comparator) { - return sortAsc(fieldsRow().indexOf(field), comparator); + return sortAsc(indexOrFail(fieldsRow(), field), comparator); } @SuppressWarnings({ "rawtypes", "unchecked" }) @@ -1135,7 +1136,7 @@ class ResultImpl implements Result, AttachableInternal { @Override public final Result sortAsc(String fieldName, Comparator comparator) { - return sortAsc(fieldsRow().indexOf(fieldName), comparator); + return sortAsc(indexOrFail(fieldsRow(), fieldName), comparator); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Utils.java b/jOOQ/src/main/java/org/jooq/impl/Utils.java index 3c3ff09d36..b7e149d110 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Utils.java +++ b/jOOQ/src/main/java/org/jooq/impl/Utils.java @@ -110,6 +110,7 @@ import org.jooq.Field; import org.jooq.Param; import org.jooq.QueryPart; import org.jooq.Record; +import org.jooq.RecordType; import org.jooq.RenderContext; import org.jooq.Result; import org.jooq.Row; @@ -773,6 +774,58 @@ final class Utils { return result; } + /** + * A utility method that fails with an exception if + * {@link Row#indexOf(Field)} doesn't return any index. + */ + static final int indexOrFail(Row row, Field field) { + int result = row.indexOf(field); + + if (result < 0) + throw new IllegalArgumentException("Field (" + field + ") is not contained in Row " + row); + + return result; + } + + /** + * A utility method that fails with an exception if + * {@link Row#indexOf(String)} doesn't return any index. + */ + static final int indexOrFail(Row row, String fieldName) { + int result = row.indexOf(fieldName); + + if (result < 0) + throw new IllegalArgumentException("Field (" + fieldName + ") is not contained in Row " + row); + + return result; + } + + /** + * A utility method that fails with an exception if + * {@link RecordType#indexOf(Field)} doesn't return any index. + */ + static final int indexOrFail(RecordType row, Field field) { + int result = row.indexOf(field); + + if (result < 0) + throw new IllegalArgumentException("Field (" + field + ") is not contained in RecordType " + row); + + return result; + } + + /** + * A utility method that fails with an exception if + * {@link RecordType#indexOf(String)} doesn't return any index. + */ + static final int indexOrFail(RecordType row, String fieldName) { + int result = row.indexOf(fieldName); + + if (result < 0) + throw new IllegalArgumentException("Field (" + fieldName + ") is not contained in RecordType " + row); + + return result; + } + /** * Create a new array */