/* * Author: tdanford * Date: Mar 21, 2009 */ package org.seqcode.gseutils.models; import java.lang.reflect.Array; public class ArrayFieldAccessor<T extends Model> implements Accessor<T> { private Accessor<T> arrayAccessor; private int idx; public ArrayFieldAccessor(Accessor<T> acc, int i) { arrayAccessor = acc; idx = i; if(!arrayAccessor.getType().isArray()) { throw new IllegalArgumentException(String.format( "Type of %s isn't array.", arrayAccessor.getType().getSimpleName())); } } public ArrayFieldAccessor(Class<T> cls, String arrayName, int i) { this(new FieldAccessor<T>(cls, arrayName), i); } public int hashCode() { int code = 17 + arrayAccessor.hashCode(); code *= 37; code += idx; code *= 37; return code; } public boolean equals(Object o) { if(!(o instanceof ArrayFieldAccessor)) { return false; } ArrayFieldAccessor f = (ArrayFieldAccessor)o; return f.arrayAccessor.equals(arrayAccessor) && idx == f.idx; } public String toString() { return getName(); } public Class getType() { return arrayAccessor.getType().getComponentType(); } public String getName() { return String.format("%s[%d]", arrayAccessor.getName(), idx); } public String getBaseName() { return arrayAccessor.getBaseName(); } public void set(T object, Object value) { Object array = arrayAccessor.get(object); Array.set(array, idx, value); } public Object get(T object) { Object array = arrayAccessor.get(object); return Array.get(array, idx); } }