package com.framsticks.params; import java.util.Iterator; import java.util.Map; import com.framsticks.params.types.EventParam; import com.framsticks.params.types.ObjectParam; import com.framsticks.params.types.ProcedureParam; import com.framsticks.params.types.UniversalParam; import com.framsticks.util.UnimplementedException; public class FreeAccess implements ObjectAccess { protected FreeObject object; protected final String typeName; /** * @param typeName */ public FreeAccess(String typeName) { this.typeName = typeName; } @Override public Param getParam(int i) { throw new InvalidOperationException(); } @Override public Param getParam(String id) { return Param.build().type(UniversalParam.class).idAndName(id).finish(); } @Override public int getParamCount() { return object.size(); } @Override public Iterable getParams() { return new Iterable() { @Override public Iterator iterator() { return new Iterator() { protected final Iterator> internal = object.iterator(); @Override public boolean hasNext() { return internal.hasNext(); } @Override public Param next() { return Param.build().idAndName(internal.next().getKey()).type(UniversalParam.class).finish(Param.class); } @Override public void remove() { throw new UnimplementedException().msg("remove element from FreeAccess").arg("access", FreeAccess.this); } }; } }; } @Override public String getTypeId() { return typeName; } @Override public Object call(String id, Object... arguments) { throw new InvalidOperationException().msg("properties access does not support calling methods").arg("id", id); } @Override public Object call(ProcedureParam param, Object... arguments) { throw new InvalidOperationException().msg("properties access does not support calling methods").arg("param", param); } @Override public T get(int i, Class type) { throw new InvalidOperationException(); } @Override public T get(String id, Class type) { return object.get(id, type); } @Override public T get(ValueParam param, Class type) { return get(param.getId(), type); } @Override public int set(int i, T value) { throw new InvalidOperationException(); } @Override public int set(String id, T value) { object.set(id, (value instanceof String) ? ParamsUtil.deserialize((String) value) : value); return 0; } @Override public int set(ValueParam param, T value) { return set(param.getId(), value); } @Override public void reg(EventParam param, EventListener listener) { throw new InvalidOperationException().msg("properties access does not support registering events").arg("param", param).arg("access", this); } @Override public void regRemove(EventParam param, EventListener listener) { throw new InvalidOperationException().msg("properties access does not support registering events").arg("param", param).arg("access", this); } @Override public void clearValues() { object.clear(); } @Override public Access select(Object object) { this.object = ParamsUtil.selectObjectForAccess(this, object, FreeObject.class); return this; } @Override public Object getSelected() { return object; } @Override public Access cloneAccess() { return new FreeAccess(typeName); } @Override public Object createAccessee() { return new FreeObject(typeName); } @Override public FramsClass getFramsClass() { throw new InvalidOperationException(); } @Override public void tryAutoAppend(Object object) { throw new InvalidOperationException(); } @Override public int getCompositeParamCount() { return 0; } @Override public CompositeParam getCompositeParam(int number) { throw new InvalidOperationException(); } @Override public ParamBuilder buildParam(ParamBuilder builder) { return builder.name(typeName).type(ObjectParam.class).containedTypeName(typeName); } @Override public String toString() { return "FreeAccess[" + typeName + "]"; } }