diff --git a/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java b/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java index 40d123a1587f8b18676e05adf57f814ad758409f..7c39a2f174f267de1b84dd269e6aa17c3329199d 100644 --- a/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java +++ b/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java @@ -11,64 +11,107 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * @author bba1792 Dr. Herbert Lange - * @version 20210705 + * @version 20211004 * Resource to list corpus functions defined in the corpus services + * Scope: any */ @Path("list_corpus_functions") public class ListCorpusFunctions { + /** + * Class representing the relevant information for a corpus function, used to (de)serialize JSON + */ + public static class CorpusFunctionInfo { + String name; + String description; + boolean available ; + Set<String> usableFor; + + public CorpusFunctionInfo(String name, String description, boolean available, Set<String> usableFor) { + this.name = name; + this.description = description; + this.available = available; + this.usableFor = usableFor; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public boolean isAvailable() { + return available; + } + + public Set<String> getUsableFor() { + return usableFor; + } + } /** * Method handling HTTP GET requests. The returned object will be sent - * to the client as "text/plain" media type. + * to the client as "application/json" media type. * - * @return String that will be returned as a text/plain response. + * @return JSON response containing the list of corpus functions or HTTP error code 400 */ @GET @Produces(MediaType.APPLICATION_JSON) - public Response listFunctions() { - ArrayList<Map<String,String>> functionList = new ArrayList<>() ; + public Response getCorpusFunctions() { + // Convert to JSON + ArrayList<CorpusFunctionInfo> functionList = listFunctions(); + ObjectMapper mapper = new ObjectMapper(); + try { + String json = mapper.writeValueAsString(functionList); + return Response.ok().entity(json).build() ; + } + // On error return empty JSON and an error code + catch (JsonProcessingException e) { + return Response.status(400).entity(new JsonObject().toString()).build(); + } + } + + + /** + * Gets the list of all corpus functions available in corpus services + * + * @return list of CorpusFunctionInfo objects representing the functions + */ + public ArrayList<CorpusFunctionInfo> listFunctions() { + + ArrayList<CorpusFunctionInfo> functionList = new ArrayList<>(); for (String s : CorpusServices.getCorpusFunctions()) { String function, description; - boolean available ; + Set<String> usableClasses = new HashSet<>(); + boolean available; try { + // Create the corpus function object using reflections and get its information CorpusFunction cf = (CorpusFunction) Class.forName(s).getDeclaredConstructor().newInstance(); function = cf.getFunction(); + usableClasses.addAll(cf.getIsUsableFor().stream().map(Class::getSimpleName).collect(Collectors.toSet())); try { description = cf.getDescription(); - available = true ; + available = true; } catch (Exception e) { - description = "Error reading description" ; - available = false ; + description = "Error reading description"; + available = false; } } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { - function = s ; - description = "Error loading class" ; - available = false ; + function = s; + description = "Error loading class"; + available = false; } - HashMap<String,String> functionInfo = new HashMap<>(); - functionInfo.put("name", function); - functionInfo.put("description",description); - functionInfo.put("available",Boolean.toString(available)); - + // Create new info object and add it to the list + CorpusFunctionInfo functionInfo = new CorpusFunctionInfo(function, description, available, usableClasses); functionList.add(functionInfo); } // Sort the list by name - functionList.sort(Comparator.comparing((x) -> x.get("name"))); - // Convert to JSON - ObjectMapper mapper = new ObjectMapper(); - try { - String json = mapper.writeValueAsString(functionList); - return Response.ok().entity(json).build() ; - } - // On error return empty JSON and an error code - catch (JsonProcessingException e) { - return Response.status(400).entity(new JsonObject().toString()).build(); - } + functionList.sort(Comparator.comparing(CorpusFunctionInfo::getName)); + return functionList; } }