From 368247726b6371ead7d76fa4141039d32acaaf42 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Mon, 14 Jan 2019 14:33:36 +0100 Subject: [PATCH] [Major] Made user and session rest query API paging --- .../li/strolch/rest/endpoint/Inspector.java | 21 +++--- .../rest/endpoint/OperationsLogResource.java | 5 +- .../rest/endpoint/PrivilegeUsersService.java | 65 +++++++++++-------- .../rest/endpoint/UserSessionsService.java | 37 ++++++++--- .../li/strolch/rest/helper/ResponseUtil.java | 1 + .../li/strolch/rest/helper/RestfulHelper.java | 30 +++++++-- 6 files changed, 108 insertions(+), 51 deletions(-) diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/Inspector.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/Inspector.java index 60b4670f5..7be51fdae 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/Inspector.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/Inspector.java @@ -16,6 +16,8 @@ package li.strolch.rest.endpoint; import static li.strolch.rest.StrolchRestfulConstants.MSG; +import static li.strolch.rest.helper.RestfulHelper.toJson; +import static li.strolch.search.SearchBuilder.orderBy; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; @@ -59,7 +61,6 @@ import li.strolch.privilege.model.Certificate; import li.strolch.rest.RestfulStrolchComponent; import li.strolch.rest.StrolchRestfulConstants; import li.strolch.rest.helper.ResponseUtil; -import li.strolch.rest.helper.RestfulHelper; import li.strolch.rest.model.QueryData; import li.strolch.search.*; import li.strolch.service.*; @@ -405,12 +406,12 @@ public class Inspector { RootElementSearchResult result; long dataSetSize; try (StrolchTransaction tx = openTx(cert, realm)) { - dataSetSize = tx.getResourceMap().querySize(tx); + dataSetSize = tx.getResourceMap().querySize(tx, type); result = search.search(tx); } // do ordering - result = SearchBuilder.orderBy(result, queryData.getOrderBy(), queryData.isDescending()); + result = orderBy(result, queryData.getOrderBy(), queryData.isDescending()); // build JSON response ResourceVisitor visitor; @@ -427,7 +428,7 @@ public class Inspector { return jsonObject; }; } - JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, result, visitor); + JsonObject root = toJson(queryData, dataSetSize, result, visitor); // marshall result return Response.ok(toString(root)).build(); @@ -450,12 +451,12 @@ public class Inspector { RootElementSearchResult result; long dataSetSize; try (StrolchTransaction tx = openTx(cert, realm)) { - dataSetSize = tx.getOrderMap().querySize(tx); + dataSetSize = tx.getOrderMap().querySize(tx, type); result = search.search(tx); } // do ordering - result = SearchBuilder.orderBy(result, queryData.getOrderBy(), queryData.isDescending()); + result = orderBy(result, queryData.getOrderBy(), queryData.isDescending()); // build JSON response OrderVisitor visitor; @@ -474,7 +475,7 @@ public class Inspector { return jsonObject; }; } - JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, result, visitor); + JsonObject root = toJson(queryData, dataSetSize, result, visitor); // marshall result return Response.ok(toString(root)).build(); @@ -497,12 +498,12 @@ public class Inspector { RootElementSearchResult result; long dataSetSize; try (StrolchTransaction tx = openTx(cert, realm)) { - dataSetSize = tx.getActivityMap().querySize(tx); + dataSetSize = tx.getActivityMap().querySize(tx, type); result = search.search(tx); } // do ordering - result = SearchBuilder.orderBy(result, queryData.getOrderBy(), queryData.isDescending()); + result = orderBy(result, queryData.getOrderBy(), queryData.isDescending()); // build JSON response ActivityVisitor visitor; @@ -521,7 +522,7 @@ public class Inspector { return jsonObject; }; } - JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, result, visitor); + JsonObject root = toJson(queryData, dataSetSize, result, visitor); // marshall result return Response.ok(toString(root)).build(); diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/OperationsLogResource.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/OperationsLogResource.java index 9eea289d1..46524ba2b 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/OperationsLogResource.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/OperationsLogResource.java @@ -11,6 +11,7 @@ import javax.ws.rs.core.Response; import java.time.LocalDate; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -42,7 +43,8 @@ public class OperationsLogResource { ctx.assertHasPrivilege(OperationsLog.class.getName()); OperationsLog operationsLog = RestfulStrolchComponent.getInstance().getComponent(OperationsLog.class); - Stream messages = operationsLog.getMessages(realm).stream(); + List allMessages = operationsLog.getMessages(realm); + Stream messages = allMessages.stream(); if (isNotEmpty(severityS)) { LogSeverity severity = LogSeverity.valueOf(severityS); @@ -81,6 +83,7 @@ public class OperationsLogResource { messages = messages.sorted(comparing(LogMessage::getId).reversed()); Paging paging = Paging.asPage(messages.collect(Collectors.toList()), offset, limit); + paging.setDataSetSize(allMessages.size()); return ResponseUtil.toResponse(paging, LogMessage::toJson); } } diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java index 85ce0fac5..cf4d8d5f6 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java @@ -15,6 +15,10 @@ */ package li.strolch.rest.endpoint; +import static li.strolch.rest.helper.RestfulHelper.toJson; +import static li.strolch.search.ValueSearchExpressionBuilder.collectionContains; +import static li.strolch.search.ValueSearchExpressionBuilder.containsIgnoreCase; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; import javax.ws.rs.core.Context; @@ -25,8 +29,7 @@ import java.util.Base64; import java.util.List; import java.util.Locale; -import com.google.gson.JsonArray; -import com.google.gson.JsonParser; +import com.google.gson.*; import li.strolch.agent.api.ComponentContainer; import li.strolch.model.json.PrivilegeElementFromJsonVisitor; import li.strolch.model.json.PrivilegeElementToJsonVisitor; @@ -38,6 +41,9 @@ import li.strolch.rest.RestfulStrolchComponent; import li.strolch.rest.StrolchRestfulConstants; import li.strolch.rest.StrolchSessionHandler; import li.strolch.rest.helper.ResponseUtil; +import li.strolch.rest.model.QueryData; +import li.strolch.search.SearchResult; +import li.strolch.search.ValueSearch; import li.strolch.service.JsonServiceArgument; import li.strolch.service.api.ServiceHandler; import li.strolch.service.api.ServiceResult; @@ -56,12 +62,40 @@ public class PrivilegeUsersService { @GET @Produces(MediaType.APPLICATION_JSON) - public Response getUsers(@Context HttpServletRequest request) { + public Response queryUsers(@Context HttpServletRequest request, @BeanParam QueryData queryData) { Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE); PrivilegeHandler privilegeHandler = getPrivilegeHandler(); + String query = queryData.getQuery(); List users = privilegeHandler.getUsers(cert); - JsonArray usersArr = toJson(users); + SearchResult result = new ValueSearch() // + .where(containsIgnoreCase(UserRep::getUsername, query) // + .or(containsIgnoreCase(UserRep::getFirstname, query)) // + .or(containsIgnoreCase(UserRep::getLastname, query)) // + .or(collectionContains(UserRep::getRoles, query)) // + ).search(users); + + PrivilegeElementToJsonVisitor visitor = new PrivilegeElementToJsonVisitor(); + JsonObject root = toJson(queryData, users.size(), result, t -> t.accept(visitor)); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + return Response.ok(gson.toJson(root), MediaType.APPLICATION_JSON).build(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("query") + public Response queryUsersByUserRep(String query, @Context HttpServletRequest request) { + Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE); + PrivilegeHandler privilegeHandler = getPrivilegeHandler(); + + UserRep queryRep = new PrivilegeElementFromJsonVisitor().userRepFromJson(query); + List users = privilegeHandler.queryUsers(cert, queryRep); + + JsonArray usersArr = new JsonArray(); + for (UserRep userRep : users) { + usersArr.add(userRep.accept(new PrivilegeElementToJsonVisitor())); + } return Response.ok(usersArr.toString(), MediaType.APPLICATION_JSON).build(); } @@ -77,20 +111,6 @@ public class PrivilegeUsersService { .build(); } - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("query") - public Response queryUsers(String query, @Context HttpServletRequest request) { - Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE); - PrivilegeHandler privilegeHandler = getPrivilegeHandler(); - - UserRep queryRep = new PrivilegeElementFromJsonVisitor().userRepFromJson(query); - List users = privilegeHandler.queryUsers(cert, queryRep); - JsonArray usersArr = toJson(users); - return Response.ok(usersArr.toString(), MediaType.APPLICATION_JSON).build(); - } - @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @@ -281,13 +301,4 @@ public class PrivilegeUsersService { } return ResponseUtil.toResponse(svcResult); } - - private JsonArray toJson(List users) { - JsonArray usersArr = new JsonArray(); - for (UserRep userRep : users) { - usersArr.add(userRep.accept(new PrivilegeElementToJsonVisitor())); - } - return usersArr; - } - } \ No newline at end of file diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java index 177c745e5..83ae61733 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java @@ -1,12 +1,12 @@ /* * Copyright 2015 Robert von Burg - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,21 +15,31 @@ */ package li.strolch.rest.endpoint; +import static li.strolch.rest.helper.RestfulHelper.toJson; +import static li.strolch.search.ValueSearchExpressionBuilder.collectionContains; +import static li.strolch.search.ValueSearchExpressionBuilder.containsIgnoreCase; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.text.MessageFormat; +import java.util.List; import java.util.Locale; -import com.google.gson.JsonArray; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; import li.strolch.privilege.model.Certificate; import li.strolch.rest.RestfulStrolchComponent; import li.strolch.rest.StrolchRestfulConstants; import li.strolch.rest.StrolchSessionHandler; import li.strolch.rest.helper.ResponseUtil; +import li.strolch.rest.model.QueryData; import li.strolch.rest.model.UserSession; +import li.strolch.search.SearchResult; +import li.strolch.search.ValueSearch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,14 +50,23 @@ public class UserSessionsService { @GET @Produces(MediaType.APPLICATION_JSON) - public Response getSessions(@Context HttpServletRequest request) { + public Response querySessions(@Context HttpServletRequest request, @BeanParam QueryData queryData) { Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE); - logger.info("[" + cert.getUsername() + "] Returning all sessions..."); + logger.info("[" + cert.getUsername() + "] Querying user sessions..."); StrolchSessionHandler sessionHandler = RestfulStrolchComponent.getInstance().getSessionHandler(); - JsonArray sessionsJ = new JsonArray(); - sessionHandler.getSessions(cert).stream().map(UserSession::toJson).forEach(sessionsJ::add); - return Response.ok(sessionsJ.toString(), MediaType.APPLICATION_JSON).build(); + String query = queryData.getQuery(); + List sessions = sessionHandler.getSessions(cert); + SearchResult result = new ValueSearch() // + .where(containsIgnoreCase(UserSession::getUsername, query) // + .or(containsIgnoreCase(UserSession::getFirstname, query)) // + .or(containsIgnoreCase(UserSession::getLastname, query)) // + .or(collectionContains(UserSession::getUserRoles, query)) // + ).search(sessions); + + JsonObject root = toJson(queryData, sessions.size(), result, UserSession::toJson); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + return Response.ok(gson.toJson(root), MediaType.APPLICATION_JSON).build(); } @GET diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/helper/ResponseUtil.java b/li.strolch.rest/src/main/java/li/strolch/rest/helper/ResponseUtil.java index 2ae6d9865..6ddfc9178 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/helper/ResponseUtil.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/helper/ResponseUtil.java @@ -202,6 +202,7 @@ public class ResponseUtil { private static void addPagingInfo(Paging paging, JsonObject response) { response.addProperty(MSG, StringHelper.DASH); + response.addProperty(DATA_SET_SIZE, paging.getDataSetSize()); response.addProperty(LIMIT, paging.getLimit()); response.addProperty(OFFSET, paging.getOffset()); response.addProperty(SIZE, paging.getSize()); diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/helper/RestfulHelper.java b/li.strolch.rest/src/main/java/li/strolch/rest/helper/RestfulHelper.java index 0cfe62f1d..1f50a8a8b 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/helper/RestfulHelper.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/helper/RestfulHelper.java @@ -15,13 +15,16 @@ */ package li.strolch.rest.helper; +import static java.util.stream.Collectors.toList; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import java.util.List; import java.util.Locale; +import java.util.function.Function; +import java.util.stream.Stream; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import li.strolch.model.StrolchRootElement; import li.strolch.model.visitor.StrolchRootElementVisitor; @@ -29,6 +32,7 @@ import li.strolch.privilege.model.Certificate; import li.strolch.rest.StrolchRestfulConstants; import li.strolch.rest.model.QueryData; import li.strolch.search.RootElementSearchResult; +import li.strolch.search.SearchResult; import li.strolch.utils.collections.Paging; import li.strolch.utils.dbc.DBC; import li.strolch.utils.helper.StringHelper; @@ -53,8 +57,27 @@ public class RestfulHelper { public static JsonObject toJson(QueryData queryData, long dataSetSize, RootElementSearchResult result, StrolchRootElementVisitor toJsonVisitor) { - // paging Paging paging = result.toPaging(queryData.getOffset(), queryData.getLimit()); + Function toJsonFunc = t -> t.accept(toJsonVisitor); + return toJson(queryData, dataSetSize, paging, toJsonFunc); + } + + public static JsonObject toJson(QueryData queryData, long dataSetSize, SearchResult result, + Function toJsonVisitor) { + + Paging paging = result.toPaging(queryData.getOffset(), queryData.getLimit()); + return toJson(queryData, dataSetSize, paging, toJsonVisitor); + } + + public static JsonObject toJson(QueryData queryData, long dataSetSize, Stream stream, + Function toJsonVisitor) { + + Paging paging = Paging.asPage(stream.collect(toList()), queryData.getOffset(), queryData.getLimit()); + return toJson(queryData, dataSetSize, paging, toJsonVisitor); + } + + public static JsonObject toJson(QueryData queryData, long dataSetSize, Paging paging, + Function toJsonVisitor) { // get page List page = paging.getPage(); @@ -77,8 +100,7 @@ public class RestfulHelper { // add items JsonArray data = new JsonArray(); for (T t : page) { - JsonElement element = t.accept(toJsonVisitor); - data.add(element); + data.add(toJsonVisitor.apply(t)); } root.add("data", data); return root;