package com.lordofthejars.nosqlunit.couchdb;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.ektorp.CouchDbConnector;
public class DataLoader {
private static final ObjectMapper MAPPER = new ObjectMapper();
public static final String ROOT_ELEMENT = "data";
private CouchDbConnector connector;
public DataLoader(CouchDbConnector connector) {
this.connector = connector;
}
public void load(InputStream dataScript) {
try {
List<Map<String, Object>> documentsIterator = getDocuments(dataScript);
insertDocuments(documentsIterator);
} catch (JsonParseException e) {
throw new IllegalArgumentException(e);
} catch (JsonMappingException e) {
throw new IllegalArgumentException(e);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
private void insertDocuments(List<Map<String, Object>> documentsIterator) {
for (Map<String, Object> map : documentsIterator) {
this.connector.create(map);
}
}
public static List<Map<String, Object>> getDocuments(InputStream dataScript)
throws IOException, JsonProcessingException {
Map<String, Object> rootNode = MAPPER.readValue(dataScript, Map.class);
Object dataElements = rootNode.get(ROOT_ELEMENT);
if (dataElements instanceof List) {
return (List<Map<String, Object>>) dataElements;
} else {
throw new IllegalArgumentException("Array of documents are required.");
}
}
}