blob: 06b9957479869dd78b273e14e667b8aef8885592 [file] [log] [blame]
margarethad3c0fc92017-10-25 15:03:32 +02001package de.ids_mannheim.korap.web.controller;
margaretha38d530e2017-07-11 19:06:50 +02002
margarethaa14f1c22017-07-19 18:51:04 +02003import java.io.IOException;
margaretha38d530e2017-07-11 19:06:50 +02004import java.util.List;
5
margarethaa14f1c22017-07-19 18:51:04 +02006import javax.ws.rs.Consumes;
margaretha38d530e2017-07-11 19:06:50 +02007import javax.ws.rs.GET;
8import javax.ws.rs.POST;
9import javax.ws.rs.Path;
10import javax.ws.rs.Produces;
margaretha38d530e2017-07-11 19:06:50 +020011import javax.ws.rs.core.MediaType;
margaretha38d530e2017-07-11 19:06:50 +020012
margarethae353dfa2017-07-18 19:23:29 +020013import org.springframework.beans.factory.annotation.Autowired;
14import org.springframework.stereotype.Controller;
margaretha38d530e2017-07-11 19:06:50 +020015
margarethaa14f1c22017-07-19 18:51:04 +020016import com.fasterxml.jackson.databind.JsonNode;
margaretha38d530e2017-07-11 19:06:50 +020017import com.sun.jersey.spi.container.ResourceFilters;
18
margaretha0e8f4e72018-04-05 14:11:52 +020019import de.ids_mannheim.korap.dto.FoundryDto;
20import de.ids_mannheim.korap.dto.LayerDto;
margaretha8a71e3b2017-07-25 12:22:47 +020021import de.ids_mannheim.korap.exceptions.KustvaktException;
margaretha38d530e2017-07-11 19:06:50 +020022import de.ids_mannheim.korap.exceptions.StatusCodes;
margarethad3c0fc92017-10-25 15:03:32 +020023import de.ids_mannheim.korap.service.AnnotationService;
margarethae353dfa2017-07-18 19:23:29 +020024import de.ids_mannheim.korap.utils.JsonUtils;
margarethada3c7852018-06-14 20:35:11 +020025import de.ids_mannheim.korap.web.KustvaktResponseHandler;
margarethaee0cbfe2018-08-28 17:47:14 +020026import de.ids_mannheim.korap.web.APIVersionFilter;
margaretha38d530e2017-07-11 19:06:50 +020027import de.ids_mannheim.korap.web.filter.DemoUserFilter;
28import de.ids_mannheim.korap.web.filter.PiwikFilter;
margaretha38d530e2017-07-11 19:06:50 +020029
30/**
31 * Provides services regarding annotation related information.
32 *
33 * @author margaretha
34 *
35 */
margarethae353dfa2017-07-18 19:23:29 +020036@Controller
margarethaee0cbfe2018-08-28 17:47:14 +020037@Path("/{version}/annotation/")
38@ResourceFilters({APIVersionFilter.class, DemoUserFilter.class, PiwikFilter.class })
margaretha38d530e2017-07-11 19:06:50 +020039@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
margarethad3c0fc92017-10-25 15:03:32 +020040public class AnnotationController {
margaretha38d530e2017-07-11 19:06:50 +020041
margarethae353dfa2017-07-18 19:23:29 +020042 @Autowired
margarethada3c7852018-06-14 20:35:11 +020043 private KustvaktResponseHandler kustvaktResponseHandler;
margaretha0e8f4e72018-04-05 14:11:52 +020044
margaretha894a7d72017-11-08 19:24:20 +010045 @Autowired
margarethad3c0fc92017-10-25 15:03:32 +020046 private AnnotationService annotationService;
margarethaa14f1c22017-07-19 18:51:04 +020047
48 /**
49 * Returns information about all supported layers
margarethae353dfa2017-07-18 19:23:29 +020050 *
margarethaa14f1c22017-07-19 18:51:04 +020051 * @return a json serialization of all supported layers
margarethae353dfa2017-07-18 19:23:29 +020052 */
margaretha38d530e2017-07-11 19:06:50 +020053 @GET
54 @Path("layers")
margaretha0e8f4e72018-04-05 14:11:52 +020055 public List<LayerDto> getLayers () {
56 return annotationService.getLayerDtos();
margaretha38d530e2017-07-11 19:06:50 +020057 }
58
59
margarethaa14f1c22017-07-19 18:51:04 +020060 /**
margaretha50179c82017-07-20 15:36:05 +020061 * Returns a list of foundry descriptions.
margarethaa14f1c22017-07-19 18:51:04 +020062 *
63 * @param codes
64 * foundry-layer code or a Kleene-star
65 * @param language
66 * 2-letter language code (description language)
67 * @return a list of foundry, layer, value information in json
68 */
margarethad3c0fc92017-10-25 15:03:32 +020069 @SuppressWarnings("unchecked")
margaretha38d530e2017-07-11 19:06:50 +020070 @POST
71 @Path("description")
margarethaa14f1c22017-07-19 18:51:04 +020072 @Consumes(MediaType.APPLICATION_JSON)
margaretha0e8f4e72018-04-05 14:11:52 +020073 public List<FoundryDto> getFoundryDescriptions (String json) {
margaretha894a7d72017-11-08 19:24:20 +010074 if (json == null || json.isEmpty()) {
margarethada3c7852018-06-14 20:35:11 +020075 throw kustvaktResponseHandler
margaretha6374f722018-04-17 18:45:57 +020076 .throwit(new KustvaktException(StatusCodes.MISSING_PARAMETER,
margarethad3c0fc92017-10-25 15:03:32 +020077 "Missing a json string.", ""));
margaretha50179c82017-07-20 15:36:05 +020078 }
margaretha0e8f4e72018-04-05 14:11:52 +020079
margaretha894a7d72017-11-08 19:24:20 +010080 JsonNode node;
81 try {
82 node = JsonUtils.readTree(json);
83 }
84 catch (KustvaktException e1) {
margarethada3c7852018-06-14 20:35:11 +020085 throw kustvaktResponseHandler.throwit(e1);
margaretha894a7d72017-11-08 19:24:20 +010086 }
margarethaa14f1c22017-07-19 18:51:04 +020087
88 String language;
89 if (!node.has("language")) {
margaretha38d530e2017-07-11 19:06:50 +020090 language = "en";
91 }
margaretha38d530e2017-07-11 19:06:50 +020092 else {
margarethaa14f1c22017-07-19 18:51:04 +020093 language = node.get("language").asText();
94 if (language == null || language.isEmpty()) {
95 language = "en";
margaretha38d530e2017-07-11 19:06:50 +020096 }
margaretha50179c82017-07-20 15:36:05 +020097 else if (!(language.equals("en") || language.equals("de"))) {
margarethada3c7852018-06-14 20:35:11 +020098 throw kustvaktResponseHandler.throwit(
margaretha8a71e3b2017-07-25 12:22:47 +020099 new KustvaktException(StatusCodes.UNSUPPORTED_VALUE,
100 "Unsupported value:", language));
margaretha50179c82017-07-20 15:36:05 +0200101 }
margaretha38d530e2017-07-11 19:06:50 +0200102 }
margarethaa14f1c22017-07-19 18:51:04 +0200103
104 List<String> codes;
105 try {
106 codes = JsonUtils.convert(node.get("codes"), List.class);
107 }
108 catch (IOException | NullPointerException e) {
margarethada3c7852018-06-14 20:35:11 +0200109 throw kustvaktResponseHandler.throwit(new KustvaktException(
margaretha8a71e3b2017-07-25 12:22:47 +0200110 StatusCodes.INVALID_ARGUMENT, "Bad argument:", json));
margarethaa14f1c22017-07-19 18:51:04 +0200111 }
margaretha50179c82017-07-20 15:36:05 +0200112 if (codes == null) {
margarethada3c7852018-06-14 20:35:11 +0200113 throw kustvaktResponseHandler.throwit(
margaretha8a71e3b2017-07-25 12:22:47 +0200114 new KustvaktException(StatusCodes.MISSING_ATTRIBUTE,
115 "Missing attribute:", "codes"));
margaretha50179c82017-07-20 15:36:05 +0200116 }
margaretha8a71e3b2017-07-25 12:22:47 +0200117 else if (codes.isEmpty()) {
margarethada3c7852018-06-14 20:35:11 +0200118 throw kustvaktResponseHandler
margarethad3c0fc92017-10-25 15:03:32 +0200119 .throwit(new KustvaktException(StatusCodes.NO_RESULT_FOUND,
120 "No result found.", "codes:[]"));
margarethaa14f1c22017-07-19 18:51:04 +0200121 }
122
margarethad3c0fc92017-10-25 15:03:32 +0200123 try {
margaretha0e8f4e72018-04-05 14:11:52 +0200124 return annotationService.getFoundryDtos(codes, language);
margarethae353dfa2017-07-18 19:23:29 +0200125 }
margarethad3c0fc92017-10-25 15:03:32 +0200126 catch (KustvaktException e) {
margarethada3c7852018-06-14 20:35:11 +0200127 throw kustvaktResponseHandler.throwit(e);
margarethae353dfa2017-07-18 19:23:29 +0200128 }
margaretha38d530e2017-07-11 19:06:50 +0200129 }
margaretha38d530e2017-07-11 19:06:50 +0200130}
131