package com.dropbox.client2.jsonextract; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * (Internal class for extracting JSON.) * * A JSON "array" (a list of arbitrary JSON values). */ public final class JsonList extends JsonBase<java.util.List<Object>> implements Iterable<JsonThing> { public JsonList(java.util.List<Object> internal, String path) { super(internal, path); } public JsonList(java.util.List<Object> internal) { super(internal); } private static String pathConcatIndex(String path, int index) { return JsonThing.pathConcat(path, Integer.toString(index)); } public JsonThing get(int index) throws JsonExtractionException { if (index >= internal.size()) { throw error("expecting array to have an element at index " + index + ", but it only has length " + internal.size()); } return new JsonThing(internal.get(index), pathConcatIndex(path, index)); } public void expectLength(int length) throws JsonExtractionException { if (internal.size() != length) { throw error("expecting array to have length " + length + ", but it has length " + internal.size()); } } public int length() { return internal.size(); } private static final class WrapperIterator implements Iterator<JsonThing> { private int numReturned = 0; private final String path; private final Iterator<Object> internal; private WrapperIterator(String path, Iterator<Object> internal) { this.path = path; this.internal = internal; } public boolean hasNext() { return internal.hasNext(); } public void remove() { throw new UnsupportedOperationException("can't remove"); } public JsonThing next() { int index = numReturned++; return new JsonThing(internal.next(), pathConcatIndex(path, index)); } } public Iterator<JsonThing> iterator() { return new WrapperIterator(path, internal.iterator()); } public static final class Extractor<T> extends JsonExtractor<List<T>> { public final JsonExtractor<T> elementExtractor; public Extractor(JsonExtractor<T> elementExtractor) { this.elementExtractor = elementExtractor; } public List<T> extract(JsonThing jt) throws JsonExtractionException { return jt.expectList().extract(this.elementExtractor); } } public <T> ArrayList<T> extract(JsonExtractor<T> elementExtractor) throws JsonExtractionException { ArrayList<T> result = new ArrayList<T>(length()); for (Object o : internal) { result.add(elementExtractor.extract(new JsonThing(o))); } return result; } }