blob: ae60dca71868be7696218bfb9ed7d72116109c8b [file] [log] [blame]
margarethaac92c822023-05-15 11:43:22 +02001package de.ids_mannheim.korap.core.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
margarethae353dfa2017-07-18 19:23:29 +02006import org.springframework.beans.factory.annotation.Autowired;
7import org.springframework.stereotype.Controller;
margaretha38d530e2017-07-11 19:06:50 +02008
margarethaa14f1c22017-07-19 18:51:04 +02009import com.fasterxml.jackson.databind.JsonNode;
margaretha96c309d2023-08-16 12:24:12 +020010
margaretha5b708792023-05-12 16:55:29 +020011import de.ids_mannheim.korap.core.service.AnnotationService;
margaretha0e8f4e72018-04-05 14:11:52 +020012import de.ids_mannheim.korap.dto.FoundryDto;
13import de.ids_mannheim.korap.dto.LayerDto;
margaretha8a71e3b2017-07-25 12:22:47 +020014import de.ids_mannheim.korap.exceptions.KustvaktException;
margaretha38d530e2017-07-11 19:06:50 +020015import de.ids_mannheim.korap.exceptions.StatusCodes;
margarethae353dfa2017-07-18 19:23:29 +020016import de.ids_mannheim.korap.utils.JsonUtils;
margarethada3c7852018-06-14 20:35:11 +020017import de.ids_mannheim.korap.web.KustvaktResponseHandler;
margaretha398f4722019-01-09 19:07:20 +010018import de.ids_mannheim.korap.web.filter.APIVersionFilter;
margaretha38d530e2017-07-11 19:06:50 +020019import de.ids_mannheim.korap.web.filter.DemoUserFilter;
margaretha96c309d2023-08-16 12:24:12 +020020import de.ids_mannheim.korap.web.utils.ResourceFilters;
21import jakarta.ws.rs.Consumes;
22import jakarta.ws.rs.GET;
23import jakarta.ws.rs.POST;
24import jakarta.ws.rs.Path;
25import jakarta.ws.rs.Produces;
26import jakarta.ws.rs.core.MediaType;
margaretha38d530e2017-07-11 19:06:50 +020027
28/**
29 * Provides services regarding annotation related information.
30 *
31 * @author margaretha
32 *
33 */
margarethae353dfa2017-07-18 19:23:29 +020034@Controller
margarethaee0cbfe2018-08-28 17:47:14 +020035@Path("/{version}/annotation/")
margarethaf4df2c02024-01-09 09:13:17 +010036@ResourceFilters({ APIVersionFilter.class, DemoUserFilter.class})
margaretha38d530e2017-07-11 19:06:50 +020037@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
margarethad3c0fc92017-10-25 15:03:32 +020038public class AnnotationController {
margaretha38d530e2017-07-11 19:06:50 +020039
margarethae353dfa2017-07-18 19:23:29 +020040 @Autowired
margarethada3c7852018-06-14 20:35:11 +020041 private KustvaktResponseHandler kustvaktResponseHandler;
margaretha0e8f4e72018-04-05 14:11:52 +020042
margaretha894a7d72017-11-08 19:24:20 +010043 @Autowired
margarethad3c0fc92017-10-25 15:03:32 +020044 private AnnotationService annotationService;
margarethaa14f1c22017-07-19 18:51:04 +020045
46 /**
47 * Returns information about all supported layers
margarethae353dfa2017-07-18 19:23:29 +020048 *
margarethaa14f1c22017-07-19 18:51:04 +020049 * @return a json serialization of all supported layers
margarethae353dfa2017-07-18 19:23:29 +020050 */
margaretha38d530e2017-07-11 19:06:50 +020051 @GET
52 @Path("layers")
margaretha0e8f4e72018-04-05 14:11:52 +020053 public List<LayerDto> getLayers () {
54 return annotationService.getLayerDtos();
margaretha38d530e2017-07-11 19:06:50 +020055 }
56
margarethaa14f1c22017-07-19 18:51:04 +020057 /**
margaretha50179c82017-07-20 15:36:05 +020058 * Returns a list of foundry descriptions.
margarethaa14f1c22017-07-19 18:51:04 +020059 *
60 * @param codes
61 * foundry-layer code or a Kleene-star
62 * @param language
63 * 2-letter language code (description language)
64 * @return a list of foundry, layer, value information in json
65 */
margarethad3c0fc92017-10-25 15:03:32 +020066 @SuppressWarnings("unchecked")
margaretha38d530e2017-07-11 19:06:50 +020067 @POST
68 @Path("description")
margarethaa14f1c22017-07-19 18:51:04 +020069 @Consumes(MediaType.APPLICATION_JSON)
margaretha0e8f4e72018-04-05 14:11:52 +020070 public List<FoundryDto> getFoundryDescriptions (String json) {
margaretha894a7d72017-11-08 19:24:20 +010071 if (json == null || json.isEmpty()) {
margaretha35e1ca22023-11-16 22:00:01 +010072 throw kustvaktResponseHandler.throwit(
73 new KustvaktException(StatusCodes.MISSING_PARAMETER,
margarethad3c0fc92017-10-25 15:03:32 +020074 "Missing a json string.", ""));
margaretha50179c82017-07-20 15:36:05 +020075 }
margaretha0e8f4e72018-04-05 14:11:52 +020076
margaretha894a7d72017-11-08 19:24:20 +010077 JsonNode node;
78 try {
79 node = JsonUtils.readTree(json);
80 }
81 catch (KustvaktException e1) {
margarethada3c7852018-06-14 20:35:11 +020082 throw kustvaktResponseHandler.throwit(e1);
margaretha894a7d72017-11-08 19:24:20 +010083 }
margarethaa14f1c22017-07-19 18:51:04 +020084
85 String language;
86 if (!node.has("language")) {
margaretha38d530e2017-07-11 19:06:50 +020087 language = "en";
88 }
margaretha38d530e2017-07-11 19:06:50 +020089 else {
margarethaa14f1c22017-07-19 18:51:04 +020090 language = node.get("language").asText();
91 if (language == null || language.isEmpty()) {
92 language = "en";
margaretha38d530e2017-07-11 19:06:50 +020093 }
margaretha50179c82017-07-20 15:36:05 +020094 else if (!(language.equals("en") || language.equals("de"))) {
margarethada3c7852018-06-14 20:35:11 +020095 throw kustvaktResponseHandler.throwit(
margaretha8a71e3b2017-07-25 12:22:47 +020096 new KustvaktException(StatusCodes.UNSUPPORTED_VALUE,
97 "Unsupported value:", language));
margaretha50179c82017-07-20 15:36:05 +020098 }
margaretha38d530e2017-07-11 19:06:50 +020099 }
margarethaa14f1c22017-07-19 18:51:04 +0200100
101 List<String> codes;
102 try {
103 codes = JsonUtils.convert(node.get("codes"), List.class);
104 }
105 catch (IOException | NullPointerException e) {
margarethada3c7852018-06-14 20:35:11 +0200106 throw kustvaktResponseHandler.throwit(new KustvaktException(
margaretha8a71e3b2017-07-25 12:22:47 +0200107 StatusCodes.INVALID_ARGUMENT, "Bad argument:", json));
margarethaa14f1c22017-07-19 18:51:04 +0200108 }
margarethab5e1e0a2019-01-29 22:11:57 +0100109 if (codes == null || codes.isEmpty()) {
margarethada3c7852018-06-14 20:35:11 +0200110 throw kustvaktResponseHandler.throwit(
margaretha8a71e3b2017-07-25 12:22:47 +0200111 new KustvaktException(StatusCodes.MISSING_ATTRIBUTE,
margarethab5e1e0a2019-01-29 22:11:57 +0100112 "codes is null or empty", "codes"));
margarethaa14f1c22017-07-19 18:51:04 +0200113 }
114
margarethad3c0fc92017-10-25 15:03:32 +0200115 try {
margaretha0e8f4e72018-04-05 14:11:52 +0200116 return annotationService.getFoundryDtos(codes, language);
margarethae353dfa2017-07-18 19:23:29 +0200117 }
margarethad3c0fc92017-10-25 15:03:32 +0200118 catch (KustvaktException e) {
margarethada3c7852018-06-14 20:35:11 +0200119 throw kustvaktResponseHandler.throwit(e);
margarethae353dfa2017-07-18 19:23:29 +0200120 }
margaretha38d530e2017-07-11 19:06:50 +0200121 }
margaretha38d530e2017-07-11 19:06:50 +0200122}