| margaretha | ac92c82 | 2023-05-15 11:43:22 +0200 | [diff] [blame] | 1 | package de.ids_mannheim.korap.core.web.controller; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 2 | |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 3 | import java.io.IOException; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 4 | import java.util.List; |
| 5 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 6 | import org.springframework.beans.factory.annotation.Autowired; |
| 7 | import org.springframework.stereotype.Controller; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 8 | |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 9 | import com.fasterxml.jackson.databind.JsonNode; |
| margaretha | 96c309d | 2023-08-16 12:24:12 +0200 | [diff] [blame] | 10 | |
| margaretha | 5b70879 | 2023-05-12 16:55:29 +0200 | [diff] [blame] | 11 | import de.ids_mannheim.korap.core.service.AnnotationService; |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 12 | import de.ids_mannheim.korap.dto.FoundryDto; |
| 13 | import de.ids_mannheim.korap.dto.LayerDto; |
| margaretha | 8a71e3b | 2017-07-25 12:22:47 +0200 | [diff] [blame] | 14 | import de.ids_mannheim.korap.exceptions.KustvaktException; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 15 | import de.ids_mannheim.korap.exceptions.StatusCodes; |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 16 | import de.ids_mannheim.korap.utils.JsonUtils; |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 17 | import de.ids_mannheim.korap.web.KustvaktResponseHandler; |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 18 | import de.ids_mannheim.korap.web.filter.APIVersionFilter; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 19 | import de.ids_mannheim.korap.web.filter.DemoUserFilter; |
| margaretha | 96c309d | 2023-08-16 12:24:12 +0200 | [diff] [blame] | 20 | import de.ids_mannheim.korap.web.utils.ResourceFilters; |
| 21 | import jakarta.ws.rs.Consumes; |
| 22 | import jakarta.ws.rs.GET; |
| 23 | import jakarta.ws.rs.POST; |
| 24 | import jakarta.ws.rs.Path; |
| 25 | import jakarta.ws.rs.Produces; |
| 26 | import jakarta.ws.rs.core.MediaType; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 27 | |
| 28 | /** |
| 29 | * Provides services regarding annotation related information. |
| 30 | * |
| 31 | * @author margaretha |
| 32 | * |
| 33 | */ |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 34 | @Controller |
| margaretha | ee0cbfe | 2018-08-28 17:47:14 +0200 | [diff] [blame] | 35 | @Path("/{version}/annotation/") |
| margaretha | f4df2c0 | 2024-01-09 09:13:17 +0100 | [diff] [blame] | 36 | @ResourceFilters({ APIVersionFilter.class, DemoUserFilter.class}) |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 37 | @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 38 | public class AnnotationController { |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 39 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 40 | @Autowired |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 41 | private KustvaktResponseHandler kustvaktResponseHandler; |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 42 | |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 43 | @Autowired |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 44 | private AnnotationService annotationService; |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 45 | |
| 46 | /** |
| 47 | * Returns information about all supported layers |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 48 | * |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 49 | * @return a json serialization of all supported layers |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 50 | */ |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 51 | @GET |
| 52 | @Path("layers") |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 53 | public List<LayerDto> getLayers () { |
| 54 | return annotationService.getLayerDtos(); |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 55 | } |
| 56 | |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 57 | /** |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame] | 58 | * Returns a list of foundry descriptions. |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 59 | * |
| 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 | */ |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 66 | @SuppressWarnings("unchecked") |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 67 | @POST |
| 68 | @Path("description") |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 69 | @Consumes(MediaType.APPLICATION_JSON) |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 70 | public List<FoundryDto> getFoundryDescriptions (String json) { |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 71 | if (json == null || json.isEmpty()) { |
| margaretha | 35e1ca2 | 2023-11-16 22:00:01 +0100 | [diff] [blame] | 72 | throw kustvaktResponseHandler.throwit( |
| 73 | new KustvaktException(StatusCodes.MISSING_PARAMETER, |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 74 | "Missing a json string.", "")); |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame] | 75 | } |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 76 | |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 77 | JsonNode node; |
| 78 | try { |
| 79 | node = JsonUtils.readTree(json); |
| 80 | } |
| 81 | catch (KustvaktException e1) { |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 82 | throw kustvaktResponseHandler.throwit(e1); |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 83 | } |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 84 | |
| 85 | String language; |
| 86 | if (!node.has("language")) { |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 87 | language = "en"; |
| 88 | } |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 89 | else { |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 90 | language = node.get("language").asText(); |
| 91 | if (language == null || language.isEmpty()) { |
| 92 | language = "en"; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 93 | } |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame] | 94 | else if (!(language.equals("en") || language.equals("de"))) { |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 95 | throw kustvaktResponseHandler.throwit( |
| margaretha | 8a71e3b | 2017-07-25 12:22:47 +0200 | [diff] [blame] | 96 | new KustvaktException(StatusCodes.UNSUPPORTED_VALUE, |
| 97 | "Unsupported value:", language)); |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame] | 98 | } |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 99 | } |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 100 | |
| 101 | List<String> codes; |
| 102 | try { |
| 103 | codes = JsonUtils.convert(node.get("codes"), List.class); |
| 104 | } |
| 105 | catch (IOException | NullPointerException e) { |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 106 | throw kustvaktResponseHandler.throwit(new KustvaktException( |
| margaretha | 8a71e3b | 2017-07-25 12:22:47 +0200 | [diff] [blame] | 107 | StatusCodes.INVALID_ARGUMENT, "Bad argument:", json)); |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 108 | } |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 109 | if (codes == null || codes.isEmpty()) { |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 110 | throw kustvaktResponseHandler.throwit( |
| margaretha | 8a71e3b | 2017-07-25 12:22:47 +0200 | [diff] [blame] | 111 | new KustvaktException(StatusCodes.MISSING_ATTRIBUTE, |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 112 | "codes is null or empty", "codes")); |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 113 | } |
| 114 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 115 | try { |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 116 | return annotationService.getFoundryDtos(codes, language); |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 117 | } |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 118 | catch (KustvaktException e) { |
| margaretha | da3c785 | 2018-06-14 20:35:11 +0200 | [diff] [blame] | 119 | throw kustvaktResponseHandler.throwit(e); |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 120 | } |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 121 | } |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 122 | } |