package com.framsticks.params; import com.framsticks.params.types.ArrayListParam; import com.framsticks.util.UnimplementedException; import com.framsticks.util.lang.Numbers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import static com.framsticks.params.SetStateFlags.*; /** * @author Piotr Sniegowski */ public class ArrayListAccess extends ListAccess { List list; public ArrayListAccess(Access elementAccess) { super(elementAccess); } @Override public ArrayListAccess cloneAccess() { return new ArrayListAccess(elementAccess.cloneAccess()); } @Override public List createAccessee() { return new ArrayList(); } @Override public CompositeParam getParam(int i) { if ((i < 0) || (i >= list.size())) { return null; } return paramBuilder.id(Integer.toString(i)).finish(CompositeParam.class); } @Override public CompositeParam getParam(String id) { Integer i = Numbers.parse(id, Integer.class); return (i == null ? null : getParam(i)); } @Override public String getTypeId() { return "l " + elementAccess.getTypeId(); } @Override public int getParamCount() { return list.size(); } @Override public T get(int i, Class type) { if ((i < 0) || (i >= list.size())) { return null; } return type.cast(list.get(i)); } @Override public T get(String id, Class type) { return get(Integer.parseInt(id), type); } @Override public T get(ValueParam param, Class type) { return get(param.getId(), type); } @Override public int set(int i, T value) { if (value != null) { while (i >= list.size()) { list.add(null); } list.set(i, value); return 0; } if (i >= list.size()) { return PSET_HITMAX; } list.remove(i); // for (int j = i + 1; j < list.size(); ++j) { // if (list.get(j) != null) { // list.set(i, null); // return 0; // } // } // while (list.size() > i) { // list.remove(i); // } return 0; } @Override public int set(String id, T value) { return set(Integer.parseInt(id), value); } @Override public int set(ValueParam param, T value) { return set(param.getId(), value); } @Override public void clearValues() { list.clear(); } /** covariant */ @Override public List getSelected() { return list; } @SuppressWarnings("unchecked") @Override public ArrayListAccess select(Object object) { list = ParamsUtil.selectObjectForAccess(this, object, List.class); return this; } @Override public Iterable getParams() { return new Iterable() { @Override public Iterator iterator() { return new Iterator() { protected ListIterator internal = list.listIterator(); @Override public boolean hasNext() { return internal.hasNext(); } @Override public Param next() { Param param = paramBuilder.id(Integer.toString(internal.nextIndex())).finish(CompositeParam.class); internal.next(); return param; } @Override public void remove() { throw new UnimplementedException().msg("remove element from list").arg("list", ArrayListAccess.this); } }; } }; } @Override public int getCompositeParamCount() { return list.size(); } @Override public CompositeParam getCompositeParam(int number) { return getParam(number); } @Override public ParamBuilder buildParam(ParamBuilder builder) { return builder.name(containedTypeName + " list").type(ArrayListParam.class).containedTypeName(containedTypeName); } }