[Major] Made user and session rest query API paging

This commit is contained in:
Robert von Burg 2019-01-14 14:33:36 +01:00
parent 37fb641892
commit 368247726b
6 changed files with 108 additions and 51 deletions

View File

@ -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<Resource> 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<JsonObject> 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<Order> 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<JsonObject> 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<Activity> 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<JsonObject> 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();

View File

@ -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<LogMessage> messages = operationsLog.getMessages(realm).stream();
List<LogMessage> allMessages = operationsLog.getMessages(realm);
Stream<LogMessage> 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<LogMessage> paging = Paging.asPage(messages.collect(Collectors.toList()), offset, limit);
paging.setDataSetSize(allMessages.size());
return ResponseUtil.toResponse(paging, LogMessage::toJson);
}
}

View File

@ -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<UserRep> users = privilegeHandler.getUsers(cert);
JsonArray usersArr = toJson(users);
SearchResult<UserRep> result = new ValueSearch<UserRep>() //
.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<UserRep> 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<UserRep> 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<UserRep> users) {
JsonArray usersArr = new JsonArray();
for (UserRep userRep : users) {
usersArr.add(userRep.accept(new PrivilegeElementToJsonVisitor()));
}
return usersArr;
}
}

View File

@ -1,12 +1,12 @@
/*
* Copyright 2015 Robert von Burg <eitch@eitchnet.ch>
*
*
* 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<UserSession> sessions = sessionHandler.getSessions(cert);
SearchResult<UserSession> result = new ValueSearch<UserSession>() //
.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

View File

@ -202,6 +202,7 @@ public class ResponseUtil {
private static <T> void addPagingInfo(Paging<T> 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());

View File

@ -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 <T extends StrolchRootElement> JsonObject toJson(QueryData queryData, long dataSetSize,
RootElementSearchResult<T> result, StrolchRootElementVisitor<JsonObject> toJsonVisitor) {
// paging
Paging<T> paging = result.toPaging(queryData.getOffset(), queryData.getLimit());
Function<T, JsonObject> toJsonFunc = t -> t.accept(toJsonVisitor);
return toJson(queryData, dataSetSize, paging, toJsonFunc);
}
public static <T> JsonObject toJson(QueryData queryData, long dataSetSize, SearchResult<T> result,
Function<T, JsonObject> toJsonVisitor) {
Paging<T> paging = result.toPaging(queryData.getOffset(), queryData.getLimit());
return toJson(queryData, dataSetSize, paging, toJsonVisitor);
}
public static <T> JsonObject toJson(QueryData queryData, long dataSetSize, Stream<T> stream,
Function<T, JsonObject> toJsonVisitor) {
Paging<T> paging = Paging.asPage(stream.collect(toList()), queryData.getOffset(), queryData.getLimit());
return toJson(queryData, dataSetSize, paging, toJsonVisitor);
}
public static <T> JsonObject toJson(QueryData queryData, long dataSetSize, Paging<T> paging,
Function<T, JsonObject> toJsonVisitor) {
// get page
List<T> 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;