This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 81c293db1f48bbf4335b0184ec5d5a91f4c55a5d Author: datph <[email protected]> AuthorDate: Wed Mar 13 17:33:51 2019 +0700 MAILBOX-373 Refactor EventDeadLettersRoutes with new dead letter APIs --- .../webadmin/routes/EventDeadLettersRoutes.java | 61 ++++---- .../service/EventDeadLettersRedeliverService.java | 6 +- .../service/EventDeadLettersRedeliverTask.java | 12 +- .../webadmin/service/EventDeadLettersService.java | 18 +-- .../james/webadmin/service/EventRetriever.java | 39 +++-- .../routes/EventDeadLettersRoutesTest.java | 160 ++++++++++++--------- src/site/markdown/server/manage-webadmin.md | 12 +- 7 files changed, 166 insertions(+), 142 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java index fb8949b..36f783f 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java @@ -31,6 +31,7 @@ import javax.ws.rs.Produces; import org.apache.james.event.json.EventSerializer; import org.apache.james.mailbox.events.Event; +import org.apache.james.mailbox.events.EventDeadLetters; import org.apache.james.mailbox.events.Group; import org.apache.james.task.Task; import org.apache.james.task.TaskId; @@ -60,7 +61,7 @@ import spark.Service; public class EventDeadLettersRoutes implements Routes { private static final String BASE_PATH = "/events/deadLetter"; private static final String GROUP_PARAM = ":group"; - private static final String EVENT_ID_PARAM = ":eventId"; + private static final String INSERTION_ID_PARAMETER = ":insertionId"; private static final String INTERNAL_SERVER_ERROR = "Internal server error - Something went bad on the server side."; @@ -89,9 +90,9 @@ public class EventDeadLettersRoutes implements Routes { service.get(BASE_PATH + "/groups", this::listGroups, jsonTransformer); service.get(BASE_PATH + "/groups/" + GROUP_PARAM, this::listFailedEvents, jsonTransformer); service.post(BASE_PATH + "/groups/" + GROUP_PARAM, this::performActionOnGroupEvents, jsonTransformer); - service.get(BASE_PATH + "/groups/" + GROUP_PARAM + "/" + EVENT_ID_PARAM, this::getEventDetails); - service.delete(BASE_PATH + "/groups/" + GROUP_PARAM + "/" + EVENT_ID_PARAM, this::deleteEvent); - service.post(BASE_PATH + "/groups/" + GROUP_PARAM + "/" + EVENT_ID_PARAM, this::performActionOnSingleEvent, jsonTransformer); + service.get(BASE_PATH + "/groups/" + GROUP_PARAM + "/" + INSERTION_ID_PARAMETER, this::getEventDetails); + service.delete(BASE_PATH + "/groups/" + GROUP_PARAM + "/" + INSERTION_ID_PARAMETER, this::deleteEvent); + service.post(BASE_PATH + "/groups/" + GROUP_PARAM + "/" + INSERTION_ID_PARAMETER, this::performActionOnSingleEvent, jsonTransformer); } @POST @@ -147,13 +148,13 @@ public class EventDeadLettersRoutes implements Routes { value = "Compulsory. Needs to be a valid group name") }) @ApiResponses(value = { - @ApiResponse(code = HttpStatus.OK_200, message = "OK - list of failed eventIds for a given group", response = List.class), + @ApiResponse(code = HttpStatus.OK_200, message = "OK - list of insertionIds of failed event for a given group", response = List.class), @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name"), @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = INTERNAL_SERVER_ERROR) }) private Iterable<String> listFailedEvents(Request request, Response response) { Group group = parseGroup(request); - return eventDeadLettersService.listGroupsEventIdsAsStrings(group); + return eventDeadLettersService.listGroupsInsertionIdsAsStrings(group); } @POST @@ -194,7 +195,7 @@ public class EventDeadLettersRoutes implements Routes { } @GET - @Path("/groups/" + GROUP_PARAM + "/" + EVENT_ID_PARAM) + @Path("/groups/" + GROUP_PARAM + "/" + INSERTION_ID_PARAMETER) @ApiOperation(value = "Returns an event detail") @ApiImplicitParams({ @ApiImplicitParam( @@ -206,29 +207,29 @@ public class EventDeadLettersRoutes implements Routes { value = "Compulsory. Needs to be a valid group name"), @ApiImplicitParam( required = true, - name = "eventId", + name = "insertionId", paramType = "path parameter", dataType = "String", defaultValue = "none", - value = "Compulsory. Needs to be a valid eventId") + value = "Compulsory. Needs to be a valid insertionId") }) @ApiResponses(value = { @ApiResponse(code = HttpStatus.OK_200, message = "OK - returns an event detail", response = Event.class), - @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name or event id"), - @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "No event with this eventId"), + @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name or insertion id"), + @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "No event with this insertionId"), @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = INTERNAL_SERVER_ERROR) }) private String getEventDetails(Request request, Response response) { Group group = parseGroup(request); - Event.EventId eventId = parseEventId(request); + EventDeadLetters.InsertionId insertionId = parseInsertionId(request); - return eventDeadLettersService.getEvent(group, eventId) + return eventDeadLettersService.getEvent(group, insertionId) .map(eventSerializer::toJson) .block(); } @DELETE - @Path("/groups/" + GROUP_PARAM + "/" + EVENT_ID_PARAM) + @Path("/groups/" + GROUP_PARAM + "/" + INSERTION_ID_PARAMETER) @ApiOperation(value = "Deletes an event") @ApiImplicitParams({ @ApiImplicitParam( @@ -240,28 +241,28 @@ public class EventDeadLettersRoutes implements Routes { value = "Compulsory. Needs to be a valid group name"), @ApiImplicitParam( required = true, - name = "eventId", + name = "insertionId", paramType = "path parameter", dataType = "String", defaultValue = "none", - value = "Compulsory. Needs to be a valid eventId") + value = "Compulsory. Needs to be a valid insertionId") }) @ApiResponses(value = { @ApiResponse(code = HttpStatus.NO_CONTENT_204, message = "OK - Event deleted"), - @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name or event id"), + @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name or insertion id"), @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = INTERNAL_SERVER_ERROR) }) private Response deleteEvent(Request request, Response response) { Group group = parseGroup(request); - Event.EventId eventId = parseEventId(request); + EventDeadLetters.InsertionId insertionId = parseInsertionId(request); - eventDeadLettersService.deleteEvent(group, eventId); + eventDeadLettersService.deleteEvent(group, insertionId); response.status(HttpStatus.NO_CONTENT_204); return response; } @POST - @Path("/groups/" + GROUP_PARAM + "/" + EVENT_ID_PARAM) + @Path("/groups/" + GROUP_PARAM + "/" + INSERTION_ID_PARAMETER) @ApiOperation(value = "Performing action on an event") @ApiImplicitParams({ @ApiImplicitParam( @@ -273,11 +274,11 @@ public class EventDeadLettersRoutes implements Routes { value = "Compulsory. Needs to be a valid group name"), @ApiImplicitParam( required = true, - name = "eventId", + name = "insertionId", paramType = "path parameter", dataType = "String", defaultValue = "none", - value = "Compulsory. Needs to be a valid eventId"), + value = "Compulsory. Needs to be a valid insertionId"), @ApiImplicitParam( required = true, dataType = "String", @@ -292,16 +293,16 @@ public class EventDeadLettersRoutes implements Routes { responseHeaders = { @ResponseHeader(name = "Location", description = "URL of the resource associated with the scheduled task") }), - @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name, event id or action argument"), - @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "No event with this eventId"), + @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid group name, insertion id or action argument"), + @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "No event with this insertionId"), @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = INTERNAL_SERVER_ERROR) }) public TaskIdDto performActionOnSingleEvent(Request request, Response response) { Group group = parseGroup(request); - Event.EventId eventId = parseEventId(request); + EventDeadLetters.InsertionId insertionId = parseInsertionId(request); assertValidActionParameter(request); - Task task = eventDeadLettersService.redeliverSingleEvent(group, eventId); + Task task = eventDeadLettersService.redeliverSingleEvent(group, insertionId); TaskId taskId = taskManager.submit(task); return TaskIdDto.respond(response, taskId); } @@ -329,14 +330,14 @@ public class EventDeadLettersRoutes implements Routes { } } - private Event.EventId parseEventId(Request request) { - String eventIdAsString = request.params(EVENT_ID_PARAM); + private EventDeadLetters.InsertionId parseInsertionId(Request request) { + String insertionIdAsString = request.params(INSERTION_ID_PARAMETER); try { - return Event.EventId.of(eventIdAsString); + return EventDeadLetters.InsertionId.of(insertionIdAsString); } catch (Exception e) { throw ErrorResponder.builder() .statusCode(HttpStatus.BAD_REQUEST_400) - .message("Can not deserialize the supplied eventId: " + eventIdAsString) + .message("Can not deserialize the supplied insertionId: " + insertionIdAsString) .cause(e) .type(ErrorResponder.ErrorType.INVALID_ARGUMENT) .haltError(); diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverService.java index 4ec62c9..56c208f 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverService.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverService.java @@ -44,13 +44,13 @@ public class EventDeadLettersRedeliverService { Flux<Task.Result> redeliverEvents(EventRetriever eventRetriever) { return eventRetriever.retrieveEvents(deadLetters) - .flatMap(entry -> redeliverGroupEvents(entry.getT1(), entry.getT2())); + .flatMap(entry -> redeliverGroupEvents(entry.getT1(), entry.getT2(), entry.getT3())); } - private Mono<Task.Result> redeliverGroupEvents(Group group, Event event) { + private Mono<Task.Result> redeliverGroupEvents(Group group, Event event, EventDeadLetters.InsertionId insertionId) { return eventBus.reDeliver(group, event) .then(Mono.fromCallable(() -> { - deadLetters.remove(group, event.getEventId()); + deadLetters.remove(group, insertionId); return Task.Result.COMPLETED; })) .onErrorResume(e -> { diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java index b863fbf..1defd3e 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java @@ -22,7 +22,7 @@ package org.apache.james.webadmin.service; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; -import org.apache.james.mailbox.events.Event; +import org.apache.james.mailbox.events.EventDeadLetters; import org.apache.james.mailbox.events.Group; import org.apache.james.task.Task; import org.apache.james.task.TaskExecutionDetails; @@ -36,14 +36,14 @@ public class EventDeadLettersRedeliverTask implements Task { private final long successfulRedeliveriesCount; private final long failedRedeliveriesCount; private final Optional<Group> group; - private final Optional<Event.EventId> eventId; + private final Optional<EventDeadLetters.InsertionId> insertionId; AdditionalInformation(long successfulRedeliveriesCount, long failedRedeliveriesCount, - Optional<Group> group, Optional<Event.EventId> eventId) { + Optional<Group> group, Optional<EventDeadLetters.InsertionId> insertionId) { this.successfulRedeliveriesCount = successfulRedeliveriesCount; this.failedRedeliveriesCount = failedRedeliveriesCount; this.group = group; - this.eventId = eventId; + this.insertionId = insertionId; } public long getSuccessfulRedeliveriesCount() { @@ -60,8 +60,8 @@ public class EventDeadLettersRedeliverTask implements Task { } @JsonInclude(JsonInclude.Include.NON_ABSENT) - public Optional<String> getEventId() { - return eventId.map(eventId -> eventId.getId().toString()); + public Optional<String> getInsertionId() { + return insertionId.map(insertionId -> insertionId.getId().toString()); } } diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersService.java index 27bd042..1c73bd2 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersService.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersService.java @@ -50,20 +50,20 @@ public class EventDeadLettersService { .block(); } - public List<String> listGroupsEventIdsAsStrings(Group group) { - return deadLetters.failedEventIds(group) - .map(Event.EventId::getId) + public List<String> listGroupsInsertionIdsAsStrings(Group group) { + return deadLetters.failedIds(group) + .map(EventDeadLetters.InsertionId::getId) .map(UUID::toString) .collect(Guavate.toImmutableList()) .block(); } - public Mono<Event> getEvent(Group group, Event.EventId eventId) { - return deadLetters.failedEvent(group, eventId); + public Mono<Event> getEvent(Group group, EventDeadLetters.InsertionId insertionId) { + return deadLetters.failedEvent(group, insertionId); } - public void deleteEvent(Group group, Event.EventId eventId) { - deadLetters.remove(group, eventId).block(); + public void deleteEvent(Group group, EventDeadLetters.InsertionId insertionId) { + deadLetters.remove(group, insertionId).block(); } public Task redeliverAllEvents() { @@ -74,7 +74,7 @@ public class EventDeadLettersService { return new EventDeadLettersRedeliverTask(redeliverService, EventRetriever.groupEvents(group)); } - public Task redeliverSingleEvent(Group group, Event.EventId eventId) { - return new EventDeadLettersRedeliverTask(redeliverService, EventRetriever.singleEvent(group, eventId)); + public Task redeliverSingleEvent(Group group, EventDeadLetters.InsertionId insertionId) { + return new EventDeadLettersRedeliverTask(redeliverService, EventRetriever.singleEvent(group, insertionId)); } } diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventRetriever.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventRetriever.java index a780e8f..a0b4f8e 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventRetriever.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventRetriever.java @@ -27,7 +27,7 @@ import org.apache.james.mailbox.events.Group; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import reactor.util.function.Tuple2; +import reactor.util.function.Tuple3; public interface EventRetriever { static EventRetriever allEvents() { @@ -38,20 +38,19 @@ public interface EventRetriever { return new GroupEventsRetriever(group); } - static EventRetriever singleEvent(Group group, Event.EventId eventId) { - return new SingleEventRetriever(group, eventId); + static EventRetriever singleEvent(Group group, EventDeadLetters.InsertionId insertionId) { + return new SingleEventRetriever(group, insertionId); } Optional<Group> forGroup(); - Optional<Event.EventId> forEvent(); + Optional<EventDeadLetters.InsertionId> forEvent(); - Flux<Tuple2<Group, Event>> retrieveEvents(EventDeadLetters deadLetters); + Flux<Tuple3<Group, Event, EventDeadLetters.InsertionId>> retrieveEvents(EventDeadLetters deadLetters); - default Flux<Tuple2<Group, Event>> listGroupEvents(EventDeadLetters deadLetters, Group group) { - return deadLetters.failedEventIds(group) - .flatMap(eventId -> deadLetters.failedEvent(group, eventId)) - .flatMap(event -> Flux.zip(Mono.just(group), Mono.just(event))); + default Flux<Tuple3<Group, Event, EventDeadLetters.InsertionId>> listGroupEvents(EventDeadLetters deadLetters, Group group) { + return deadLetters.failedIds(group) + .flatMap(insertionId -> Flux.zip(Mono.just(group), deadLetters.failedEvent(group, insertionId), Mono.just(insertionId))); } class AllEventsRetriever implements EventRetriever { @@ -61,12 +60,12 @@ public interface EventRetriever { } @Override - public Optional<Event.EventId> forEvent() { + public Optional<EventDeadLetters.InsertionId> forEvent() { return Optional.empty(); } @Override - public Flux<Tuple2<Group, Event>> retrieveEvents(EventDeadLetters deadLetters) { + public Flux<Tuple3<Group, Event, EventDeadLetters.InsertionId>> retrieveEvents(EventDeadLetters deadLetters) { return deadLetters.groupsWithFailedEvents() .flatMap(group -> listGroupEvents(deadLetters, group)); } @@ -85,23 +84,23 @@ public interface EventRetriever { } @Override - public Optional<Event.EventId> forEvent() { + public Optional<EventDeadLetters.InsertionId> forEvent() { return Optional.empty(); } @Override - public Flux<Tuple2<Group, Event>> retrieveEvents(EventDeadLetters deadLetters) { + public Flux<Tuple3<Group, Event, EventDeadLetters.InsertionId>> retrieveEvents(EventDeadLetters deadLetters) { return listGroupEvents(deadLetters, group); } } class SingleEventRetriever implements EventRetriever { private final Group group; - private final Event.EventId eventId; + private final EventDeadLetters.InsertionId insertionId; - SingleEventRetriever(Group group, Event.EventId eventId) { + SingleEventRetriever(Group group, EventDeadLetters.InsertionId insertionId) { this.group = group; - this.eventId = eventId; + this.insertionId = insertionId; } @Override @@ -110,13 +109,13 @@ public interface EventRetriever { } @Override - public Optional<Event.EventId> forEvent() { - return Optional.of(eventId); + public Optional<EventDeadLetters.InsertionId> forEvent() { + return Optional.of(insertionId); } @Override - public Flux<Tuple2<Group, Event>> retrieveEvents(EventDeadLetters deadLetters) { - return Flux.just(group).zipWith(deadLetters.failedEvent(group, eventId)); + public Flux<Tuple3<Group, Event, EventDeadLetters.InsertionId>> retrieveEvents(EventDeadLetters deadLetters) { + return Flux.zip(Mono.just(group), deadLetters.failedEvent(group, insertionId), Mono.just(insertionId)); } } } diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java index f6c3a60..b12d308 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java @@ -73,6 +73,12 @@ class EventDeadLettersRoutesTest { private static final String BOB = "[email protected]"; private static final String UUID_1 = "6e0dd59d-660e-4d9b-b22f-0354479f47b4"; private static final String UUID_2 = "6e0dd59d-660e-4d9b-b22f-0354479f47b5"; + private static final String INSERTION_UUID_1 = "6e0dd59d-660e-4d9b-b22f-0354479f47b7"; + private static final String INSERTION_UUID_2 = "6e0dd59d-660e-4d9b-b22f-0354479f47b8"; + private static final String INSERTION_UUID_3 = "6e0dd59d-660e-4d9b-b22f-0354479f47b9"; + private static final EventDeadLetters.InsertionId INSERTION_ID_1 = EventDeadLetters.InsertionId.of(INSERTION_UUID_1); + private static final EventDeadLetters.InsertionId INSERTION_ID_2 = EventDeadLetters.InsertionId.of(INSERTION_UUID_2); + private static final EventDeadLetters.InsertionId INSERTION_ID_3 = EventDeadLetters.InsertionId.of(INSERTION_UUID_3); private static final MailboxListener.MailboxAdded EVENT_1 = EventFactory.mailboxAdded() .eventId(Event.EventId.of(UUID_1)) .user(User.fromUsername(BOB)) @@ -148,7 +154,7 @@ class EventDeadLettersRoutesTest { @Test void getGroupsShouldReturnGroupsOfContainedEvents() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); when() .get("/events/deadLetter/groups") @@ -160,8 +166,8 @@ class EventDeadLettersRoutesTest { @Test void getGroupsShouldReturnGroupsOfContainedEventsWithoutDuplicates() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_2).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_2, INSERTION_ID_2).block(); when() .get("/events/deadLetter/groups") @@ -173,8 +179,8 @@ class EventDeadLettersRoutesTest { @Test void getGroupsShouldReturnGroupsOfAllContainedEvents() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); - deadLetters.store(new EventBusTestFixture.GroupB(), EVENT_2).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(new EventBusTestFixture.GroupB(), EVENT_2, INSERTION_ID_2).block(); when() .get("/events/deadLetter/groups") @@ -211,40 +217,40 @@ class EventDeadLettersRoutesTest { @Test void listEventsShouldReturnContainedEvents() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); when() .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A) .then() .statusCode(HttpStatus.OK_200) .contentType(ContentType.JSON) - .body(".", containsInAnyOrder(UUID_1)); + .body(".", containsInAnyOrder(INSERTION_UUID_1)); } @Test void listEventsShouldNotReturnEventsOfOtherGroups() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); - deadLetters.store(new EventBusTestFixture.GroupB(), EVENT_2).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(new EventBusTestFixture.GroupB(), EVENT_2, INSERTION_ID_2).block(); when() .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A) .then() .statusCode(HttpStatus.OK_200) .contentType(ContentType.JSON) - .body(".", containsInAnyOrder(UUID_1)); + .body(".", containsInAnyOrder(INSERTION_UUID_1)); } @Test void listEventsShouldReturnAllEvents() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_2).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_2, INSERTION_ID_2).block(); when() .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A) .then() .statusCode(HttpStatus.OK_200) .contentType(ContentType.JSON) - .body(".", containsInAnyOrder(UUID_1, UUID_2)); + .body(".", containsInAnyOrder(INSERTION_UUID_1, INSERTION_UUID_2)); } } @@ -252,10 +258,10 @@ class EventDeadLettersRoutesTest { class GetEvent { @Test void getEventShouldReturnEvent() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); String response = when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.OK_200) .contentType(ContentType.JSON) @@ -268,7 +274,7 @@ class EventDeadLettersRoutesTest { @Test void getEventShouldReturn404WhenNotFound() { when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NOT_FOUND_404); } @@ -282,13 +288,13 @@ class EventDeadLettersRoutesTest { .contentType(ContentType.JSON) .body("statusCode", is(400)) .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType())) - .body("message", is("Can not deserialize the supplied eventId: invalid")); + .body("message", is("Can not deserialize the supplied insertionId: invalid")); } @Test void getEventShouldFailWhenInvalidGroup() { when() - .get("/events/deadLetter/groups/invalid/" + UUID_1) + .get("/events/deadLetter/groups/invalid/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.BAD_REQUEST_400) .contentType(ContentType.JSON) @@ -302,10 +308,10 @@ class EventDeadLettersRoutesTest { class Delete { @Test void deleteShouldReturnOk() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); when() - .delete("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .delete("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NO_CONTENT_204); } @@ -331,7 +337,7 @@ class EventDeadLettersRoutesTest { } @Test - void deleteShouldFailWhenInvalidEventId() { + void deleteShouldFailWhenInvalidInsertionId() { when() .delete("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/invalid") .then() @@ -339,18 +345,18 @@ class EventDeadLettersRoutesTest { .contentType(ContentType.JSON) .body("statusCode", is(400)) .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType())) - .body("message", is("Can not deserialize the supplied eventId: invalid")); + .body("message", is("Can not deserialize the supplied insertionId: invalid")); } @Test void deleteShouldRemoveEvent() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); with() - .delete("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1); + .delete("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1); when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NOT_FOUND_404); } @@ -387,7 +393,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverAllEventsShouldHaveSuccessfulCompletedTask() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -405,7 +411,7 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.successfulRedeliveriesCount", is(1)) .body("additionalInformation.failedRedeliveriesCount", is(0)) .body("additionalInformation.group", is(nullValue())) - .body("additionalInformation.eventId", is(nullValue())) + .body("additionalInformation.insertionId", is(nullValue())) .body("type", is(EventDeadLettersRedeliverTask.TYPE)) .body("startedDate", is(notNullValue())) .body("submitDate", is(notNullValue())) @@ -414,7 +420,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverAllEventsShouldRemoveEventFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -432,14 +438,14 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.failedRedeliveriesCount", is(0)); when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NOT_FOUND_404); } @Test void postRedeliverAllEventsShouldRedeliverEventFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -461,9 +467,9 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverAllEventsShouldRemoveAllEventsFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); - deadLetters.store(groupA, EVENT_2).block(); - deadLetters.store(groupB, EVENT_2).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(groupA, EVENT_2, INSERTION_ID_2).block(); + deadLetters.store(groupB, EVENT_2, INSERTION_ID_3).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -490,9 +496,9 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverAllEventsShouldRedeliverAllEventsFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); - deadLetters.store(groupA, EVENT_2).block(); - deadLetters.store(groupB, EVENT_2).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(groupA, EVENT_2, INSERTION_ID_2).block(); + deadLetters.store(groupB, EVENT_2, INSERTION_ID_3).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -515,7 +521,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverAllEventsShouldFailWhenInvalidAction() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); given() .queryParam("action", "invalid-action") @@ -532,7 +538,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverAllEventsShouldFailWhenMissingAction() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); when() .post("/events/deadLetter") @@ -560,7 +566,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldCreateATask() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); given() .queryParam("action", EVENTS_ACTION) @@ -574,7 +580,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldHaveSuccessfulCompletedTask() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -592,7 +598,7 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.successfulRedeliveriesCount", is(1)) .body("additionalInformation.failedRedeliveriesCount", is(0)) .body("additionalInformation.group", is(SERIALIZED_GROUP_A)) - .body("additionalInformation.eventId", is(nullValue())) + .body("additionalInformation.insertionId", is(nullValue())) .body("type", is(EventDeadLettersRedeliverTask.TYPE)) .body("startedDate", is(notNullValue())) .body("submitDate", is(notNullValue())) @@ -601,7 +607,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldRemoveEventFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -620,14 +626,14 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.group", is(SERIALIZED_GROUP_A)); when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NOT_FOUND_404); } @Test void postRedeliverGroupEventsShouldRedeliverEventFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -650,8 +656,8 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldRemoveAllGroupEventsFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); - deadLetters.store(groupA, EVENT_2).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(groupA, EVENT_2, INSERTION_ID_2).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -679,8 +685,8 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldRedeliverAllGroupEventsFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); - deadLetters.store(groupA, EVENT_2).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); + deadLetters.store(groupA, EVENT_2, INSERTION_ID_2).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) @@ -703,7 +709,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldFailWhenInvalidAction() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); given() .queryParam("action", "invalid-action") @@ -720,7 +726,7 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverGroupEventsShouldFailWhenMissingAction() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); when() .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A) @@ -746,6 +752,24 @@ class EventDeadLettersRoutesTest { .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType())) .body("message", is("Can not deserialize the supplied group: invalid")); } + + @Test + void postRedeliverGroupEventsShouldNotRedeliverAllNotMatchedGroupEventsFromDeadLetter() { + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); + + with() + .queryParam("action", EVENTS_ACTION) + .post("/events/deadLetter/groups/" + new EventBusTestFixture.GroupB().asString()) + .jsonPath() + .get("taskId"); + + when() + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A) + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", hasSize(1)); + } } @Nested @@ -762,12 +786,12 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverSingleEventShouldCreateATask() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); given() .queryParam("action", EVENTS_ACTION) .when() - .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.CREATED_201) .header("Location", is(notNullValue())) @@ -776,11 +800,11 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverSingleEventShouldHaveSuccessfulCompletedTask() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) - .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .jsonPath() .get("taskId"); @@ -794,7 +818,7 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.successfulRedeliveriesCount", is(1)) .body("additionalInformation.failedRedeliveriesCount", is(0)) .body("additionalInformation.group", is(SERIALIZED_GROUP_A)) - .body("additionalInformation.eventId", is(UUID_1)) + .body("additionalInformation.insertionId", is(INSERTION_UUID_1)) .body("type", is(EventDeadLettersRedeliverTask.TYPE)) .body("startedDate", is(notNullValue())) .body("submitDate", is(notNullValue())) @@ -803,11 +827,11 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverSingleEventShouldRemoveEventFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) - .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .jsonPath() .get("taskId"); @@ -820,21 +844,21 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.successfulRedeliveriesCount", is(1)) .body("additionalInformation.failedRedeliveriesCount", is(0)) .body("additionalInformation.group", is(SERIALIZED_GROUP_A)) - .body("additionalInformation.eventId", is(UUID_1)); + .body("additionalInformation.insertionId", is(INSERTION_UUID_1)); when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NOT_FOUND_404); } @Test void postRedeliverSingleEventShouldRedeliverEventFromDeadLetters() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); String taskId = with() .queryParam("action", EVENTS_ACTION) - .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .jsonPath() .get("taskId"); @@ -847,7 +871,7 @@ class EventDeadLettersRoutesTest { .body("additionalInformation.successfulRedeliveriesCount", is(1)) .body("additionalInformation.failedRedeliveriesCount", is(0)) .body("additionalInformation.group", is(SERIALIZED_GROUP_A)) - .body("additionalInformation.eventId", is(UUID_1)); + .body("additionalInformation.insertionId", is(INSERTION_UUID_1)); assertThat(eventCollector.getEvents()).hasSize(1); } @@ -857,19 +881,19 @@ class EventDeadLettersRoutesTest { given() .queryParam("action", EVENTS_ACTION) .when() - .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .get("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.NOT_FOUND_404); } @Test void postRedeliverSingleEventShouldFailWhenInvalidAction() { - deadLetters.store(groupA, EVENT_1).block(); + deadLetters.store(groupA, EVENT_1, INSERTION_ID_1).block(); given() .queryParam("action", "invalid-action") .when() - .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.BAD_REQUEST_400) .contentType(ContentType.JSON) @@ -881,10 +905,10 @@ class EventDeadLettersRoutesTest { @Test void postRedeliverSingleEventShouldFailWhenMissingAction() { - deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1).block(); + deadLetters.store(new EventBusTestFixture.GroupA(), EVENT_1, INSERTION_ID_1).block(); when() - .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + UUID_1) + .post("/events/deadLetter/groups/" + SERIALIZED_GROUP_A + "/" + INSERTION_UUID_1) .then() .statusCode(HttpStatus.BAD_REQUEST_400) .contentType(ContentType.JSON) @@ -905,7 +929,7 @@ class EventDeadLettersRoutesTest { .contentType(ContentType.JSON) .body("statusCode", is(400)) .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType())) - .body("message", is("Can not deserialize the supplied eventId: invalid")); + .body("message", is("Can not deserialize the supplied insertionId: invalid")); } @Test diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md index f039c15..f3a65f3 100644 --- a/src/site/markdown/server/manage-webadmin.md +++ b/src/site/markdown/server/manage-webadmin.md @@ -2459,7 +2459,7 @@ This endpoint allows listing failed events for a given group: curl -XGET http://ip:port/events/deadLetter/groups/org.apache.james.mailbox.events.EventBusTestFixture$GroupA ``` -Will return a list of event ids: +Will return a list of insertionIds: ``` ["6e0dd59d-660e-4d9b-b22f-0354479f47b4", "58a8f59d-660e-4d9b-b22f-0354486322a2"] @@ -2467,7 +2467,7 @@ Will return a list of event ids: Response codes: - - 200: Success. A list of event ids is returned. + - 200: Success. A list of insertion ids is returned. - 400: Invalid group name ### Getting event details @@ -2481,7 +2481,7 @@ Will return the full JSON associated with this event. Response codes: - 200: Success. A JSON representing this event is returned. - - 400: Invalid group name or eventId + - 400: Invalid group name or insertionId ### Deleting an event @@ -2494,7 +2494,7 @@ Will delete this event. Response codes: - 204: Success - - 400: Invalid group name or eventId + - 400: Invalid group name or insertionId ### Redeliver all events @@ -2536,8 +2536,8 @@ If successful, redelivered event will then be removed from "Dead Letter". Response codes: - 201: the taskId of the created task - - 400: Invalid group name, event id or action argument - - 404: No event with this eventId + - 400: Invalid group name, insertion id or action argument + - 404: No event with this insertionId ### Rescheduling group execution --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
