[#2655] Improve ArrayIndexOutOfBoundsException: -1 error message when unknown field is accessed from a record

This commit is contained in:
Lukas Eder 2013-12-13 14:21:46 +01:00
parent 73dcad7687
commit bae00eca77
4 changed files with 83 additions and 26 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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
*/