blob: 5055e56a146de9004f302d01d9231cb3c7551c19 [file] [log] [blame]
margaretha38d530e2017-07-11 19:06:50 +02001package de.ids_mannheim.korap.web.service.full;
2
margarethaa14f1c22017-07-19 18:51:04 +02003import java.io.IOException;
4import java.util.ArrayList;
margaretha38d530e2017-07-11 19:06:50 +02005import java.util.List;
6
margarethaa14f1c22017-07-19 18:51:04 +02007import javax.ws.rs.Consumes;
margaretha38d530e2017-07-11 19:06:50 +02008import javax.ws.rs.GET;
9import javax.ws.rs.POST;
10import javax.ws.rs.Path;
11import javax.ws.rs.Produces;
margaretha38d530e2017-07-11 19:06:50 +020012import javax.ws.rs.core.MediaType;
13import javax.ws.rs.core.Response;
14
15import org.slf4j.Logger;
16import org.slf4j.LoggerFactory;
margarethae353dfa2017-07-18 19:23:29 +020017import org.springframework.beans.factory.annotation.Autowired;
18import org.springframework.stereotype.Controller;
margaretha38d530e2017-07-11 19:06:50 +020019
margarethaa14f1c22017-07-19 18:51:04 +020020import com.fasterxml.jackson.databind.JsonNode;
margaretha38d530e2017-07-11 19:06:50 +020021import com.sun.jersey.spi.container.ResourceFilters;
22
margarethae353dfa2017-07-18 19:23:29 +020023import de.ids_mannheim.korap.dao.AnnotationDao;
margaretha50179c82017-07-20 15:36:05 +020024import de.ids_mannheim.korap.dto.FoundryDto;
margarethaa14f1c22017-07-19 18:51:04 +020025import de.ids_mannheim.korap.dto.LayerDto;
26import de.ids_mannheim.korap.dto.converter.AnnotationConverter;
margarethae353dfa2017-07-18 19:23:29 +020027import de.ids_mannheim.korap.entity.AnnotationPair;
margaretha8a71e3b2017-07-25 12:22:47 +020028import de.ids_mannheim.korap.exceptions.KustvaktException;
margaretha38d530e2017-07-11 19:06:50 +020029import de.ids_mannheim.korap.exceptions.StatusCodes;
margarethaf68daa62017-09-21 02:11:24 +020030import de.ids_mannheim.korap.filter.AuthFilter;
margarethae353dfa2017-07-18 19:23:29 +020031import de.ids_mannheim.korap.utils.JsonUtils;
margaretha38d530e2017-07-11 19:06:50 +020032import de.ids_mannheim.korap.web.filter.DemoUserFilter;
33import de.ids_mannheim.korap.web.filter.PiwikFilter;
34import de.ids_mannheim.korap.web.utils.KustvaktResponseHandler;
35
36/**
37 * Provides services regarding annotation related information.
38 *
39 * @author margaretha
40 *
41 */
margarethae353dfa2017-07-18 19:23:29 +020042@Controller
43@Path("annotation/")
margaretha38d530e2017-07-11 19:06:50 +020044@ResourceFilters({ AuthFilter.class, DemoUserFilter.class, PiwikFilter.class })
45@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
46public class AnnotationService {
47
margarethaa14f1c22017-07-19 18:51:04 +020048 private static Logger jlog =
49 LoggerFactory.getLogger(AnnotationService.class);
margaretha38d530e2017-07-11 19:06:50 +020050
margarethae353dfa2017-07-18 19:23:29 +020051 @Autowired
52 private AnnotationDao annotationDao;
margarethaa14f1c22017-07-19 18:51:04 +020053
54 @Autowired
55 private AnnotationConverter annotationConverter;
56
57
58 /**
59 * Returns information about all supported layers
margarethae353dfa2017-07-18 19:23:29 +020060 *
margarethaa14f1c22017-07-19 18:51:04 +020061 * @return a json serialization of all supported layers
margarethae353dfa2017-07-18 19:23:29 +020062 */
margaretha38d530e2017-07-11 19:06:50 +020063 @GET
64 @Path("layers")
65 public Response getLayers () {
margarethae353dfa2017-07-18 19:23:29 +020066 List<AnnotationPair> layers = annotationDao.getAllFoundryLayerPairs();
margaretha50179c82017-07-20 15:36:05 +020067 jlog.debug("/layers " + layers.toString());
margarethaa14f1c22017-07-19 18:51:04 +020068 List<LayerDto> layerDto = annotationConverter.convertToLayerDto(layers);
69 String result = JsonUtils.toJSON(layerDto);
margarethae353dfa2017-07-18 19:23:29 +020070 return Response.ok(result).build();
margaretha38d530e2017-07-11 19:06:50 +020071 }
72
73
margarethaa14f1c22017-07-19 18:51:04 +020074 /**
margaretha50179c82017-07-20 15:36:05 +020075 * Returns a list of foundry descriptions.
margarethaa14f1c22017-07-19 18:51:04 +020076 *
77 * @param codes
78 * foundry-layer code or a Kleene-star
79 * @param language
80 * 2-letter language code (description language)
81 * @return a list of foundry, layer, value information in json
82 */
margaretha38d530e2017-07-11 19:06:50 +020083 @POST
84 @Path("description")
margarethaa14f1c22017-07-19 18:51:04 +020085 @Consumes(MediaType.APPLICATION_JSON)
margaretha50179c82017-07-20 15:36:05 +020086 public Response getFoundryDescriptions (String json) {
margarethaa14f1c22017-07-19 18:51:04 +020087 JsonNode node = JsonUtils.readTree(json);
margaretha50179c82017-07-20 15:36:05 +020088 if (node == null) {
margaretha8a71e3b2017-07-25 12:22:47 +020089 throw KustvaktResponseHandler.throwit(new KustvaktException(
90 StatusCodes.MISSING_ARGUMENT, "Missing a json string.", ""));
margaretha50179c82017-07-20 15:36:05 +020091 }
margarethaa14f1c22017-07-19 18:51:04 +020092
93 String language;
94 if (!node.has("language")) {
margaretha38d530e2017-07-11 19:06:50 +020095 language = "en";
96 }
margaretha38d530e2017-07-11 19:06:50 +020097 else {
margarethaa14f1c22017-07-19 18:51:04 +020098 language = node.get("language").asText();
99 if (language == null || language.isEmpty()) {
100 language = "en";
margaretha38d530e2017-07-11 19:06:50 +0200101 }
margaretha50179c82017-07-20 15:36:05 +0200102 else if (!(language.equals("en") || language.equals("de"))) {
103 throw KustvaktResponseHandler.throwit(
margaretha8a71e3b2017-07-25 12:22:47 +0200104 new KustvaktException(StatusCodes.UNSUPPORTED_VALUE,
105 "Unsupported value:", language));
margaretha50179c82017-07-20 15:36:05 +0200106 }
margaretha38d530e2017-07-11 19:06:50 +0200107 }
margarethaa14f1c22017-07-19 18:51:04 +0200108
109 List<String> codes;
110 try {
111 codes = JsonUtils.convert(node.get("codes"), List.class);
112 }
113 catch (IOException | NullPointerException e) {
margaretha8a71e3b2017-07-25 12:22:47 +0200114 throw KustvaktResponseHandler.throwit(new KustvaktException(
115 StatusCodes.INVALID_ARGUMENT, "Bad argument:", json));
margarethaa14f1c22017-07-19 18:51:04 +0200116 }
margaretha50179c82017-07-20 15:36:05 +0200117 if (codes == null) {
margaretha8a71e3b2017-07-25 12:22:47 +0200118 throw KustvaktResponseHandler.throwit(
119 new KustvaktException(StatusCodes.MISSING_ATTRIBUTE,
120 "Missing attribute:", "codes"));
margaretha50179c82017-07-20 15:36:05 +0200121 }
margaretha8a71e3b2017-07-25 12:22:47 +0200122 else if (codes.isEmpty()) {
123 throw KustvaktResponseHandler.throwit(new KustvaktException(
124 StatusCodes.NO_VALUE_FOUND, "No result found.","codes:[]"));
125 }
126
margarethaa14f1c22017-07-19 18:51:04 +0200127 List<AnnotationPair> annotationPairs = null;
128 String foundry = "", layer = "";
129 if (codes.contains("*")) {
130 annotationPairs =
131 annotationDao.getAnnotationDescriptions(foundry, layer);
132 }
133 else {
134 String[] annotationCode;
135 annotationPairs = new ArrayList<AnnotationPair>();
136 for (String code : codes) {
137 jlog.debug("code " + code);
138 annotationCode = code.split("/");
139 if (annotationCode.length == 1) {
140 foundry = annotationCode[0];
141 }
142 else if (annotationCode.length == 2) {
143 foundry = annotationCode[0];
144 layer = annotationCode[1];
145 }
146 else {
147 jlog.error("Annotation code is wrong: " + annotationCode);
148 throw KustvaktResponseHandler.throwit(
margaretha8a71e3b2017-07-25 12:22:47 +0200149 new KustvaktException(StatusCodes.INVALID_ATTRIBUTE,
150 "Bad attribute:", code));
margarethaa14f1c22017-07-19 18:51:04 +0200151 }
152
153 annotationPairs.addAll(annotationDao
154 .getAnnotationDescriptions(foundry, layer));
155 }
156 }
157
158 if (annotationPairs != null && !annotationPairs.isEmpty()) {
margaretha50179c82017-07-20 15:36:05 +0200159 List<FoundryDto> dtos = annotationConverter
160 .convertToFoundryDto(annotationPairs, language);
margaretha8a71e3b2017-07-25 12:22:47 +0200161 jlog.debug("/description " + annotationPairs.toString());
margaretha50179c82017-07-20 15:36:05 +0200162 String result = JsonUtils.toJSON(dtos);
margarethae353dfa2017-07-18 19:23:29 +0200163 return Response.ok(result).build();
164 }
margarethaa14f1c22017-07-19 18:51:04 +0200165 else {
margaretha8a71e3b2017-07-25 12:22:47 +0200166 throw KustvaktResponseHandler.throwit(new KustvaktException(
167 StatusCodes.NO_VALUE_FOUND, "No result found.",""));
margarethae353dfa2017-07-18 19:23:29 +0200168 }
margaretha38d530e2017-07-11 19:06:50 +0200169 }
170
171}
172