CorpusDocumentOOPTokensIdxAnnotationSubannotation.java
package io.outofprintmagazine.web.rest.browse;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.outofprintmagazine.web.servlets.AbstractOOPCacheableServlet;
@Path("/Corpora/{Corpus}/{Document}/OOP/tokens/{TokenIdx}/{Annotation}/{Subannotation}")
public class CorpusDocumentOOPTokensIdxAnnotationSubannotation extends AbstractOOPCacheableServlet {
private static final long serialVersionUID = 1L;
@Context
private ServletConfig servletConfig;
@Context
private ServletContext servletContext;
@Context
private HttpServletRequest httpServletRequest;
@Context
private HttpServletResponse httpServletResponse;
@GET
@Produces("application/json; charset=utf-8")
public String doGet(
@PathParam("Corpus") String corpus,
@PathParam("Document") String document,
@PathParam("TokenIdx") Integer tokenIdx,
@PathParam("Annotation") String annotation,
@PathParam("Subannotation") String subannotation
) throws IOException, ServletException
{
if (getStorage() == null) {
super.init(servletConfig);
}
if (tokenIdx.intValue() < 0 ) {
throw new IndexOutOfBoundsException();
}
ObjectNode retval = getMapper().createObjectNode();
JsonNode oop = getStorage().getCorpusDocumentOOPJson(corpus, document);
if (oop.hasNonNull("sentences")) {
int tokenCount = 0;
ArrayNode sentencesNode = (ArrayNode) oop.get("sentences");
Iterator<JsonNode> sentencesIter = sentencesNode.iterator();
while (sentencesIter.hasNext()) {
JsonNode sentenceNode = sentencesIter.next();
ArrayNode tokensNode = (ArrayNode) sentenceNode.get("tokens");
Iterator<JsonNode> tokensIter = tokensNode.iterator();
while (tokensIter.hasNext()) {
JsonNode tokenNode = tokensIter.next();
if (tokenIdx.intValue() == tokenCount) {
if (tokenNode.hasNonNull(annotation)) {
JsonNode annotationNode = tokensNode.get(tokenIdx.intValue()).get(annotation);
if (annotationNode.isObject()) {
ObjectNode o = (ObjectNode)annotationNode;
if (o.hasNonNull(subannotation)) {
retval.set(subannotation, o.get(subannotation));
return getMapper().writeValueAsString(retval);
}
}
else if (annotationNode.isArray()) {
ArrayNode o = (ArrayNode)annotationNode;
Iterator<JsonNode> annotationListIter = o.iterator();
while (annotationListIter.hasNext()) {
JsonNode subannotationNode = annotationListIter.next();
if (subannotationNode.hasNonNull("name") && subannotationNode.get("name").asText().equals(subannotation)) {
retval.set(subannotation, subannotationNode);
return getMapper().writeValueAsString(retval);
}
}
}
}
}
tokenCount++;
}
}
}
throw new IndexOutOfBoundsException();
}
}