226 lines
8.5 KiB
Java
226 lines
8.5 KiB
Java
package li.strolch.rest.helper;
|
|
|
|
import com.google.gson.Gson;
|
|
import com.google.gson.JsonArray;
|
|
import com.google.gson.JsonElement;
|
|
import com.google.gson.JsonObject;
|
|
import jakarta.ws.rs.core.MediaType;
|
|
import jakarta.ws.rs.core.Response;
|
|
import jakarta.ws.rs.core.Response.Status;
|
|
import li.strolch.exception.StrolchElementNotFoundException;
|
|
import li.strolch.exception.StrolchException;
|
|
import li.strolch.exception.StrolchNotAuthenticatedException;
|
|
import li.strolch.exception.StrolchUserMessageException;
|
|
import li.strolch.model.i18n.I18nMessageToJsonVisitor;
|
|
import li.strolch.privilege.base.AccessDeniedException;
|
|
import li.strolch.privilege.base.PrivilegeException;
|
|
import li.strolch.privilege.base.PrivilegeModelException;
|
|
import li.strolch.service.JsonServiceResult;
|
|
import li.strolch.service.api.ServiceResult;
|
|
import li.strolch.utils.I18nMessage;
|
|
import li.strolch.utils.collections.Paging;
|
|
import li.strolch.utils.helper.StringHelper;
|
|
|
|
import java.util.List;
|
|
import java.util.function.Function;
|
|
import java.util.stream.Collectors;
|
|
|
|
import static li.strolch.rest.StrolchRestfulConstants.*;
|
|
import static li.strolch.utils.helper.ExceptionHelper.getExceptionMessageWithCauses;
|
|
import static li.strolch.utils.helper.ExceptionHelper.getRootCause;
|
|
|
|
/**
|
|
* Created by eitch on 29.08.16.
|
|
*/
|
|
public class ResponseUtil {
|
|
|
|
public static Response toResponse() {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(Status status, I18nMessage msg) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, msg.getMessage());
|
|
response.add(I18N, msg.accept(new I18nMessageToJsonVisitor()));
|
|
String json = new Gson().toJson(response);
|
|
return Response.status(status).entity(json).type(MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(String errorMsg) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, errorMsg);
|
|
String json = new Gson().toJson(response);
|
|
return Response.serverError().entity(json).type(MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(String prop, String value) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
response.addProperty(prop, value);
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(String prop1, String value1, String prop2, String value2) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
response.addProperty(prop1, value1);
|
|
response.addProperty(prop2, value2);
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(String prop1, String value1, JsonArray data) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
response.addProperty(prop1, value1);
|
|
response.add(DATA, data);
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static <T> Response toResponse(String member, T t, Function<T, JsonObject> toJson) {
|
|
return toResponse(member, toJson.apply(t));
|
|
}
|
|
|
|
public static Response toResponse(String member, JsonElement jsonElement) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
response.add(member, jsonElement);
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(JsonObject response) {
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static <T> Response toResponse(String member, List<T> list, Function<T, JsonObject> toJson) {
|
|
return toResponse(member, list.stream().map(toJson).collect(Collectors.toList()));
|
|
}
|
|
|
|
public static <T> Response listToResponse(String member, List<T> list, Function<T, JsonObject> toJson) {
|
|
return toResponse(member, list.stream().map(toJson).collect(Collectors.toList()));
|
|
}
|
|
|
|
public static Response toResponse(List<? extends JsonElement> jsonObjects) {
|
|
return toResponse(DATA, jsonObjects);
|
|
}
|
|
|
|
public static Response toResponse(String member, List<? extends JsonElement> jsonObjects) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
|
|
JsonArray arrayJ = new JsonArray();
|
|
for (JsonElement obj : jsonObjects) {
|
|
arrayJ.add(obj);
|
|
}
|
|
response.add(member, arrayJ);
|
|
|
|
String json = new Gson().toJson(response);
|
|
return Response.ok(json, MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(JsonServiceResult svcResult) {
|
|
if (svcResult.isOk())
|
|
return toResponse(DATA, svcResult.getResult());
|
|
return toResponse((ServiceResult) svcResult);
|
|
}
|
|
|
|
public static Response toResponse(ServiceResult svcResult) {
|
|
Throwable t = svcResult.getThrowable();
|
|
JsonObject response = svcResult.toJson();
|
|
String json = new Gson().toJson(response);
|
|
|
|
if (svcResult.isOk())
|
|
return Response.ok().entity(json).type(MediaType.APPLICATION_JSON).build();
|
|
|
|
Status status = switch (t) {
|
|
case AccessDeniedException ignored -> Status.FORBIDDEN;
|
|
case PrivilegeException ignored -> Status.UNAUTHORIZED;
|
|
case StrolchElementNotFoundException ignored -> Status.NOT_FOUND;
|
|
case null, default -> Status.INTERNAL_SERVER_ERROR;
|
|
};
|
|
|
|
return Response.status(status).entity(json).type(MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(Throwable t) {
|
|
return switch (t) {
|
|
case StrolchNotAuthenticatedException ignored -> toResponse(Status.UNAUTHORIZED, t);
|
|
case AccessDeniedException ignored -> toResponse(Status.FORBIDDEN, t);
|
|
case StrolchElementNotFoundException ignored -> toResponse(Status.NOT_FOUND, t);
|
|
case PrivilegeException ignored -> toResponse(Status.FORBIDDEN, t);
|
|
case null, default -> toResponse(Status.INTERNAL_SERVER_ERROR, t);
|
|
};
|
|
}
|
|
|
|
public static Response toResponse(Status status, String msg) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, msg);
|
|
String json = new Gson().toJson(response);
|
|
|
|
return Response.status(status).entity(json).type(MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static Response toResponse(Status status, Throwable t) {
|
|
JsonObject response = new JsonObject();
|
|
|
|
switch (t) {
|
|
case StrolchException ex when ex.hasI18n() ->
|
|
response.add("i18n", ex.getI18n().accept(new I18nMessageToJsonVisitor()));
|
|
case null, default -> {
|
|
Throwable rootCause = getRootCause(t);
|
|
if (rootCause instanceof StrolchUserMessageException ex && ex.hasI18n())
|
|
response.add("i18n", ex.getI18n().accept(new I18nMessageToJsonVisitor()));
|
|
}
|
|
}
|
|
|
|
response.addProperty(MSG, getExceptionMessageWithCauses(t, false));
|
|
String json = new Gson().toJson(response);
|
|
return Response.status(status).entity(json).type(MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
public static <T> Response toResponse(List<T> list, Function<T, JsonObject> visitor) {
|
|
JsonObject response = new JsonObject();
|
|
response.addProperty(MSG, StringHelper.DASH);
|
|
return handleIterable(visitor, response, list);
|
|
}
|
|
|
|
public static <T> Response toResponse(Paging<T> paging, Function<T, JsonObject> visitor) {
|
|
JsonObject response = new JsonObject();
|
|
addPagingInfo(paging, response);
|
|
return handleIterable(visitor, response, paging.getPage());
|
|
}
|
|
|
|
public static Response toResponse(Paging<JsonObject> paging) {
|
|
JsonObject response = new JsonObject();
|
|
addPagingInfo(paging, response);
|
|
return handleIterable(e -> e, response, paging.getPage());
|
|
}
|
|
|
|
private static <T> Response handleIterable(Function<T, JsonObject> visitor, JsonObject response, Iterable<T> page) {
|
|
JsonArray data = new JsonArray();
|
|
page.forEach(t -> data.add(visitor.apply(t)));
|
|
response.add(DATA, data);
|
|
return Response.ok(new Gson().toJson(response), MediaType.APPLICATION_JSON).build();
|
|
}
|
|
|
|
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());
|
|
response.addProperty(PREVIOUS_OFFSET, paging.getPreviousOffset());
|
|
response.addProperty(NEXT_OFFSET, paging.getNextOffset());
|
|
response.addProperty(LAST_OFFSET, paging.getLastOffset());
|
|
}
|
|
}
|