[#2655] Improve ArrayIndexOutOfBoundsException: -1 error message when unknown field is accessed from a record
This commit is contained in:
parent
73dcad7687
commit
bae00eca77
@ -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 <T> Value<T> getValue0(Field<T> 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 <T> void setValue(Field<T> field, T value) {
|
||||
setValue(fields.indexOf(field), field, value);
|
||||
setValue(indexOrFail(fields, field), field, value);
|
||||
}
|
||||
|
||||
private final <T> void setValue(int index, Field<T> 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> T original(Field<T> 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
|
||||
|
||||
@ -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<R extends Record> extends AbstractQueryPart implements RecordType<R
|
||||
|
||||
@Override
|
||||
public final Class<?> type(String fieldName) {
|
||||
return type(indexOf(fieldName));
|
||||
return type(indexOrFail(this, fieldName));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -227,14 +229,14 @@ class Fields<R extends Record> extends AbstractQueryPart implements RecordType<R
|
||||
|
||||
@Override
|
||||
public final DataType<?> 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<R extends Record> extends AbstractQueryPart implements RecordType<R
|
||||
int[] result = new int[fieldNames.length];
|
||||
|
||||
for (int i = 0; i < fieldNames.length; i++) {
|
||||
result[i] = indexOf(fieldNames[i]);
|
||||
result[i] = indexOrFail(this, fieldNames[i]);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@ -43,6 +43,7 @@ package org.jooq.impl;
|
||||
|
||||
import static java.lang.Math.max;
|
||||
import static java.lang.Math.min;
|
||||
import static org.jooq.impl.Utils.indexOrFail;
|
||||
import static org.jooq.tools.StringUtils.abbreviate;
|
||||
import static org.jooq.tools.StringUtils.leftPad;
|
||||
import static org.jooq.tools.StringUtils.rightPad;
|
||||
@ -224,7 +225,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public final <T> List<T> getValues(Field<T> field) {
|
||||
return (List<T>) getValues(fieldsRow().indexOf(field));
|
||||
return (List<T>) getValues(indexOrFail(fieldsRow(), field));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -774,7 +775,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public final <K> Map<K, R> intoMap(Field<K> key) {
|
||||
int index = fieldsRow().indexOf(key);
|
||||
int index = indexOrFail(fieldsRow(), key);
|
||||
Map<K, R> map = new LinkedHashMap<K, R>();
|
||||
|
||||
for (R record : this) {
|
||||
@ -789,8 +790,8 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public final <K, V> Map<K, V> intoMap(Field<K> key, Field<V> value) {
|
||||
int kIndex = fieldsRow().indexOf(key);
|
||||
int vIndex = fieldsRow().indexOf(value);
|
||||
int kIndex = indexOrFail(fieldsRow(), key);
|
||||
int vIndex = indexOrFail(fieldsRow(), value);
|
||||
|
||||
Map<K, V> map = new LinkedHashMap<K, V>();
|
||||
|
||||
@ -855,7 +856,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@Override
|
||||
public final <K, E> Map<K, E> intoMap(Field<K> key, Class<? extends E> type) {
|
||||
RecordMapper<R, E> mapper = Utils.configuration(this).recordMapperProvider().provide(fields, type);
|
||||
int index = fieldsRow().indexOf(key);
|
||||
int index = indexOrFail(fieldsRow(), key);
|
||||
Map<K, E> map = new LinkedHashMap<K, E>();
|
||||
|
||||
for (R record : this) {
|
||||
@ -870,7 +871,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public final <K> Map<K, Result<R>> intoGroups(Field<K> key) {
|
||||
int index = fieldsRow().indexOf(key);
|
||||
int index = indexOrFail(fieldsRow(), key);
|
||||
Map<K, Result<R>> map = new LinkedHashMap<K, Result<R>>();
|
||||
|
||||
for (R record : this) {
|
||||
@ -891,8 +892,8 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public final <K, V> Map<K, List<V>> intoGroups(Field<K> key, Field<V> value) {
|
||||
int kIndex = fieldsRow().indexOf(key);
|
||||
int vIndex = fieldsRow().indexOf(value);
|
||||
int kIndex = indexOrFail(fieldsRow(), key);
|
||||
int vIndex = indexOrFail(fieldsRow(), value);
|
||||
|
||||
Map<K, List<V>> map = new LinkedHashMap<K, List<V>>();
|
||||
|
||||
@ -944,7 +945,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
@Override
|
||||
public final <K, E> Map<K, List<E>> intoGroups(Field<K> key, Class<? extends E> type) {
|
||||
RecordMapper<R, E> mapper = Utils.configuration(this).recordMapperProvider().provide(fields, type);
|
||||
int index = fieldsRow().indexOf(key);
|
||||
int index = indexOrFail(fieldsRow(), key);
|
||||
Map<K, List<E>> map = new LinkedHashMap<K, List<E>>();
|
||||
|
||||
for (R record : this) {
|
||||
@ -1124,7 +1125,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
|
||||
@Override
|
||||
public final <T> Result<R> sortAsc(Field<T> field, Comparator<? super T> comparator) {
|
||||
return sortAsc(fieldsRow().indexOf(field), comparator);
|
||||
return sortAsc(indexOrFail(fieldsRow(), field), comparator);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@ -1135,7 +1136,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
|
||||
|
||||
@Override
|
||||
public final Result<R> sortAsc(String fieldName, Comparator<?> comparator) {
|
||||
return sortAsc(fieldsRow().indexOf(fieldName), comparator);
|
||||
return sortAsc(indexOrFail(fieldsRow(), fieldName), comparator);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user