//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.core.web.servlets; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.uima.jcas.tcas.Annotation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.gov.dstl.baleen.core.utils.ReflectionUtils; import uk.gov.dstl.baleen.core.web.security.WebPermission; /** * Return a list of all the UIMA types currently available on the class path */ public class TypesServlet extends AbstractApiServlet{ private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(TypesServlet.class); /** * Constructor */ public TypesServlet(){ super(LOGGER, TypesServlet.class); } @Override protected void get(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String path = req.getPathInfo(); if(path == null){ path = ""; }else if(path.startsWith("/")){ path = path.substring(1); } switch(path.toLowerCase()){ case "entities": respondWithJson(resp, getTypes("uk.gov.dstl.baleen.types.semantic.Entity")); break; case "events": respondWithJson(resp, getTypes("uk.gov.dstl.baleen.types.semantic.Event")); break; case "relations": respondWithJson(resp, getTypes("uk.gov.dstl.baleen.types.semantic.Relation")); break; case "": respondWithJson(resp, getTypes("uk.gov.dstl.baleen.types.BaleenAnnotation")); break; default: respondWithNotFound(resp); } } /** * Return a list of types that are sub-types of baseClass. * The baseClass will not be included in the list. */ @SuppressWarnings("unchecked") public List<String> getTypes(String baseClass){ Class<?> clazz = null; try { clazz = Class.forName(baseClass); } catch (ClassNotFoundException e) { LOGGER.error("Unable to find base class - type listing will not be available", e); return Collections.emptyList(); } Class<? extends Annotation> annotClazz = null; if(Annotation.class.isAssignableFrom(clazz)){ annotClazz = (Class<Annotation>) clazz; }else{ LOGGER.error("Base class is not a subclass of Annotation - type listing will not be available"); return Collections.emptyList(); } return getTypes(annotClazz); } /** * Return a list of types that are sub-types of baseClass. * The baseClass will not be included in the list. */ public List<String> getTypes(Class<? extends Annotation> baseClass){ return ReflectionUtils.getInstance().getSubTypesOf(baseClass).stream().map(Class::getName).collect(Collectors.toList()); } @Override public WebPermission[] getPermissions() { return new WebPermission[] { new WebPermission("Access Types", "types") }; } }