package com.belladati.sdk.util.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.belladati.sdk.impl.BellaDatiServiceImpl;
import com.belladati.sdk.util.CachedList;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
public abstract class CachedListImpl<T> implements CachedList<T> {
private final List<T> data = new ArrayList<T>();
private final BellaDatiServiceImpl service;
private final String uri;
private final String field;
private boolean isLoaded = false;
public CachedListImpl(BellaDatiServiceImpl service, String uri, String field) {
this.service = service;
this.uri = uri;
this.field = field;
}
@Override
public List<T> get() {
return Collections.unmodifiableList(data);
}
@Override
public List<T> toList() {
return get();
}
@Override
public CachedList<T> load() {
data.clear();
JsonNode json = service.getAsJson(uri);
if (json.get(field) instanceof ArrayNode) {
ArrayNode nodes = (ArrayNode) json.get(field);
for (JsonNode node : nodes) {
try {
data.add(parse(service, node));
} catch (ParseException e) {
// nothing to do, just ignore
}
}
}
isLoaded = true;
return this;
}
@Override
public CachedList<T> loadFirstTime() {
if (!isLoaded()) {
load();
}
return this;
}
@Override
public boolean isLoaded() {
return isLoaded;
}
@Override
public String toString() {
return data.toString();
}
protected abstract T parse(BellaDatiServiceImpl service, JsonNode node) throws ParseException;
protected static class ParseException extends Exception {
/** The serialVersionUID */
private static final long serialVersionUID = -3237010782121691680L;
public ParseException(JsonNode node) {
super("Failed to parse node " + node);
}
public ParseException(JsonNode node, Throwable cause) {
super("Failed to parse node " + node, cause);
}
}
}