You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/03/20 02:01:44 UTC
[james-project] 04/09: MAILBOX-373 Refactor EventDeadLettersRoutes
with new dead letter APIs
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 <dp...@linagora.com>
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 = "bob@apache.org";
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org