public static <TParams, TEvent> Operation<Object, TParams, TEvent> constructorOf( final ParameterizedConstructorHandler<TParams, TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TEvent> Operation<Object, Object, TEvent> constructorOf( final ConstructorHandler<TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TEvent> Operation<Object, Object, TEvent> constructorOf( final ConstructorHandlerSingle<TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TParams, TEvent> Operation<Object, TParams, TEvent> constructorOf( final ParameterizedConstructorHandlerSingle<TParams, TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TParams, TEvent> Operation<Object, TParams, TEvent> constructorOf( final ParameterizedConstructorHandlerSingle<TParams, TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TEvent> Operation<Object, Object, TEvent> constructorOf( final ConstructorHandler<TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TEvent> Operation<Object, Object, TEvent> constructorOf( final ConstructorHandlerSingle<TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
public static <TParams, TEvent> Operation<Object, TParams, TEvent> constructorOf( final ParameterizedConstructorHandler<TParams, TEvent> handler) { return new OperationHandlerOperation<>(handler, false, false, ExpectedVersion.notCreated()); }
@Test public void mergeNotCreatedAndNotCreated() { assertMerge(notCreated(), notCreated(), notCreated()); }
@Test public void mergeNotCreatedAndNull() { assertMerge(notCreated(), null, notCreated()); }
@Test public void mergeAnyAndNotCreated() { assertMerge(any(), notCreated(), notCreated()); }
@Test public void mergeExactlyAndNotCreated() { assertMergeFail(exactly(3), notCreated()); }
updateExpectedVersion = ExpectedVersion.exactly(aggregate.sourceVersion()); } else { updateExpectedVersion = ExpectedVersion.notCreated(); updateExpectedVersion = ExpectedVersion.notCreated(); } else { updateExpectedVersion = ExpectedVersion.any();
updateExpectedVersion = ExpectedVersion.exactly(aggregate.sourceVersion()); } else { updateExpectedVersion = ExpectedVersion.notCreated(); updateExpectedVersion = ExpectedVersion.notCreated(); } else { updateExpectedVersion = ExpectedVersion.any();
@Test public void mergeAnyExistingAndNotCreated() { assertMergeFail(anyExisting(), notCreated()); }
@Override public ImmutableAggregate<TState, TEvent> save( @NotNull final Aggregate<TState, TEvent> aggregate, final boolean atomic, final Map<String, String> metadata) { Preconditions.checkNotNull(aggregate); ExpectedVersion expectedVersion; if (atomic) { if (aggregate.sourceVersion() == Aggregate.VERSION_NOT_CREATED) { expectedVersion = ExpectedVersion.notCreated(); } else { expectedVersion = ExpectedVersion.exactly(aggregate.sourceVersion()); } } else { expectedVersion = ExpectedVersion.any(); } int newVersion = append( aggregate.id(), aggregate.events(), expectedVersion, metadata); return DefaultImmutableAggregate.fromExisting( projection, aggregate.id(), newVersion, aggregate.state()); }
@Override public ImmutableAggregate<TState, TEvent> save( @NotNull final Aggregate<TState, TEvent> aggregate, final boolean atomic, final Map<String, String> metadata) { Preconditions.checkNotNull(aggregate); ExpectedVersion expectedVersion; if (atomic) { if (aggregate.sourceVersion() == Aggregate.VERSION_NOT_CREATED) { expectedVersion = ExpectedVersion.notCreated(); } else { expectedVersion = ExpectedVersion.exactly(aggregate.sourceVersion()); } } else { expectedVersion = ExpectedVersion.any(); } int newVersion = append( aggregate.id(), aggregate.events(), expectedVersion, metadata); return DefaultImmutableAggregate.fromExisting( projection, aggregate.id(), newVersion, aggregate.state()); }
@Test @SuppressWarnings("unchecked") public void idempotentCreateWorksIfConflictOnSave() { Operation operation = new OperationHandlerOperation( (x, y) -> ImmutableList.of("hello"), false, false, ExpectedVersion.notCreated()); when(repository.load(any())) .thenReturn(DefaultImmutableAggregate.fromExisting( mock(AggregateProjection.class), AGGREGATE_ID, 42, new TestState("test"))); DefaultCommand command = new DefaultCommand(repository, operation); command.setAggregateId(AGGREGATE_ID); command.setIdempotentCreate(true); command.setAtomic(false); when(repository.append(any(), any(), any(), any())) .thenThrow(new UnexpectedVersionException(42, ExpectedVersion.notCreated())); CommandResult commandResult = command.run(); Assert.assertTrue(commandResult.getEvents().isEmpty()); }
@Test @SuppressWarnings("unchecked") public void idempotentCreateMeansNoOpIfExisting() { Operation operation = new OperationHandlerOperation( (x, y) -> ImmutableList.of(new TestEvent("xxx")), false, false, ExpectedVersion.notCreated()); when(repository.load(any())) .thenReturn(DefaultImmutableAggregate.fromExisting( mock(AggregateProjection.class), AGGREGATE_ID, 42, new TestState("test"))); DefaultCommand command = new DefaultCommand(repository, operation); command.setAggregateId(AGGREGATE_ID); command.setIdempotentCreate(true); CommandResult commandResult = command.run(); Assert.assertTrue(commandResult.getEvents().isEmpty()); }