package com.nominanuda.dataobject;
import java.util.Iterator;
import java.util.List;
public class LazyDataArray implements Arr {
private Arr delegee;
private final String serialized;
public LazyDataArray(String serialized) {
this.serialized = serialized;
}
public boolean isExploded() {
return delegee != null;
}
public void explode() {
if(delegee == null) {
try {
delegee = (Arr)new JSONParser().parse(serialized);
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
}
@Override
public String toString() {
return serialized;
}
@Override
public boolean add(Object val) {
explode();
return delegee.add(val);
}
@Override
public Obj addNewObject() {
explode();
return delegee.addNewObject();
}
@Override
public Arr addNewArray() {
explode();
return delegee.addNewArray();
}
@Override
public int getLength() {
explode();
return delegee.getLength();
}
@Override
public boolean isEmpty() {
return getLength() == 0;
}
@Override
public Object get(Integer key) {
explode();
return delegee.get(key);
}
@Override
public Object getStrict(Integer key) throws NullPointerException {
explode();
return delegee.getStrict(key);
}
@Override
public boolean isArray() {
explode();
return delegee.isArray();
}
@Override
public boolean isObject() {
explode();
return delegee.isObject();
}
@Override
public boolean exists(Integer k) {
explode();
return delegee.exists(k);
}
@Override
public String getType() {
explode();
return delegee.getType();
}
@Override
public Arr asArray() throws ClassCastException {
explode();
return delegee.asArray();
}
@Override
public List<Integer> getKeys() {
explode();
return delegee.getKeys();
}
@Override
public Obj asObject() throws ClassCastException {
explode();
return delegee.asObject();
}
@Override
public boolean isPrimitiveOrNull(Object o) {
explode();
return DataStructHelper.STRUCT.isPrimitiveOrNull(o);
}
@Override
public Object getPathSafe(String path) {
explode();
return delegee.getPathSafe(path);
}
@Override
public Object getPathSafe(String... pathBits) {
explode();
return delegee.getPathSafe(pathBits);
}
@Override
public String getString(Integer key) throws ClassCastException {
explode();
return delegee.getString(key);
}
@Override
public Number getNumber(Integer key) throws ClassCastException {
explode();
return delegee.getNumber(key);
}
@Override
public Boolean getBoolean(Integer key) throws ClassCastException {
explode();
return delegee.getBoolean(key);
}
@Override
public Obj getObject(Integer key) throws ClassCastException {
explode();
return delegee.getObject(key);
}
@Override
public Arr getArray(Integer key) throws ClassCastException {
explode();
return delegee.getArray(key);
}
@Override
public String getPathSafeString(String path) throws ClassCastException {
explode();
return delegee.getPathSafeString(path);
}
@Override
public String getPathSafeString(String... pathBits) throws ClassCastException {
explode();
return delegee.getPathSafeString(pathBits);
}
@Override
public Number getPathSafeNumber(String path) throws ClassCastException {
explode();
return delegee.getPathSafeNumber(path);
}
@Override
public Number getPathSafeNumber(String... pathBits) throws ClassCastException {
explode();
return delegee.getPathSafeNumber(pathBits);
}
@Override
public Boolean getPathSafeBoolean(String path) throws ClassCastException {
explode();
return delegee.getPathSafeBoolean(path);
}
@Override
public Boolean getPathSafeBoolean(String... pathBits) throws ClassCastException {
explode();
return delegee.getPathSafeBoolean(pathBits);
}
@Override
public Obj getPathSafeObject(String path) throws ClassCastException {
explode();
return delegee.getPathSafeObject(path);
}
@Override
public Obj getPathSafeObject(String... pathBits) throws ClassCastException {
explode();
return delegee.getPathSafeObject(pathBits);
}
@Override
public Arr getPathSafeArray(String path) throws ClassCastException {
explode();
return delegee.getPathSafeArray(path);
}
@Override
public Arr getPathSafeArray(String... pathBits) throws ClassCastException {
explode();
return delegee.getPathSafeArray(pathBits);
}
@Override
public Long getLong(Integer key) throws ClassCastException {
explode();
return delegee.getLong(key);
}
@Override
public Double getDouble(Integer key) throws ClassCastException {
explode();
return delegee.getDouble(key);
}
@Override
public String getStrictString(Integer key) throws ClassCastException,
NullPointerException {
explode();
return delegee.getStrictString(key);
}
@Override
public Long getStrictLong(Integer key) throws ClassCastException,
NullPointerException {
explode();
return delegee.getStrictLong(key);
}
@Override
public Double getStrictDouble(Integer key) throws ClassCastException,
NullPointerException {
explode();
return delegee.getStrictDouble(key);
}
@Override
public Boolean getStrictBoolean(Integer key) throws ClassCastException,
NullPointerException {
explode();
return delegee.getStrictBoolean(key);
}
@Override
public Obj getStrictObject(Integer key) throws ClassCastException,
NullPointerException {
explode();
return delegee.getStrictObject(key);
}
@Override
public Arr getStrictArray(Integer key) throws ClassCastException,
NullPointerException {
explode();
return delegee.getStrictArray(key);
}
@Override
public Iterator<Object> iterator() {
explode();
return delegee.iterator();
}
@Override
public Iterator<Integer> keyIterator() {
explode();
return delegee.keyIterator();
}
@Override
public Object put(Integer key, Object o) {
explode();
return delegee.put(key, o);
}
@Override
public Object remove(int key) {
explode();
return delegee.remove(key);
}
@Override
public Arr putNewArray(Integer key) {
explode();
return delegee.putNewArray(key);
}
@Override
public Obj putNewObject(Integer key) {
explode();
return delegee.putNewObject(key);
}
@Override
public void setPathProperty(String path, Object value) {
explode();
delegee.setPathProperty(path, value);
}
@Override
public void setOrPushPathProperty(String path, Object value) {
explode();
delegee.setOrPushPathProperty(path, value);
}
@Override
public void setOrPushProperty(Object key, Object value) {
explode();
delegee.setOrPushProperty(key, value);
}
@Override
public Long putLong(Integer key, Long o) {
explode();
return delegee.putLong(key, o);
}
@Override
public Double putDouble(Integer key, Double o) {
explode();
return delegee.putDouble(key, o);
}
@Override
public String putString(Integer key, String o) {
explode();
return delegee.putString(key, o);
}
@Override
public Boolean putBoolean(Integer key, Boolean o) {
explode();
return delegee.putBoolean(key, o);
}
@Override
public Obj putObject(Integer key, Obj o) {
explode();
return delegee.putObject(key, o);
}
@Override
public Arr putArray(Integer key, Arr o) {
explode();
return delegee.putArray(key, o);
}
@Override
public Arr with(Object val) {
add(val);
return this;
}
}