package com.lordofthejars.nosqlunit.neo4j.extension.springtemplate;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class DataParser {
private static final String IMPLEMENTATION_TOKEN = "implementation";
private static final String DATA_TOKEN = "data";
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
public List<Object> readValues(InputStream dataStream) {
List<Object> definedObjects = new ArrayList<Object>();
try {
Iterator<JsonNode> elements = dataElements(dataStream);
while (elements.hasNext()) {
JsonNode definedObject = elements.next();
String implementationValue = getImplementationValue(definedObject);
JsonNode objectDefinition = getObjectDefinition(definedObject);
Object unmarshallObject = unmarshallObject(objectDefinition, implementationValue);
definedObjects.add(unmarshallObject);
}
} catch (JsonParseException e) {
throw new IllegalArgumentException(e);
} catch (JsonMappingException e) {
throw new IllegalArgumentException(e);
} catch (IOException e) {
throw new IllegalArgumentException(e);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException(e);
}
return definedObjects;
}
private Object unmarshallObject(JsonNode value, String implementationValue) throws IOException, JsonParseException,
JsonMappingException, ClassNotFoundException {
return OBJECT_MAPPER.readValue(value, Class.forName(implementationValue));
}
private JsonNode getObjectDefinition(JsonNode definedObject) {
JsonNode object = definedObject.get("object");
if (object != null) {
return object;
} else {
throw new IllegalArgumentException("Object token should be used for defining object properties.");
}
}
private String getImplementationValue(JsonNode definedObject) {
JsonNode implementationNode = definedObject.get(IMPLEMENTATION_TOKEN);
if (implementationNode != null) {
return implementationNode.getValueAsText();
} else {
throw new IllegalArgumentException("No implementation class has been provided.");
}
}
private Iterator<JsonNode> dataElements(InputStream dataStream) throws IOException, JsonParseException,
JsonMappingException {
JsonNode rootNode = OBJECT_MAPPER.readValue(dataStream, JsonNode.class);
JsonNode dataNode = rootNode.path(DATA_TOKEN);
Iterator<JsonNode> elements = dataNode.getElements();
return elements;
}
}