@Override public ImmutableAggregate<TState, TEvent> toImmutable() { return new DefaultImmutableAggregate<>( projection, id, sourceVersion, state, appliedEvents); }
@NotNull @Override public ImmutableAggregate<TState, TEvent> apply( @NotNull final UpdateHandler<TState, TEvent> handler) { return this.apply(handler.execute(this)); }
@NotNull @Override public <TParam> ImmutableAggregate<TState, TEvent> fold( @NotNull final ParameterizedPojoUpdateHandler<TState, TParam, TEvent> handler, @NotNull final Stream<TParam> params) { return foldLeft( params, (ImmutableAggregate<TState, TEvent>) this, (state, param) -> state.apply(handler, param)); }
return DefaultImmutableAggregate.createNew( projection, aggregateId); return DefaultImmutableAggregate.fromExisting( projection, aggregateId,
@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()); }
when(projection.empty()).thenReturn(new TestState(null)); DefaultImmutableAggregate sourceAggregate = DefaultImmutableAggregate.createNew(projection, AGGREGATE_ID); when(repository.load(any())).thenReturn(sourceAggregate); when(repository.append(any(), any(), any(), any())).thenReturn(newVersion);
return DefaultImmutableAggregate.createNew( projection, aggregateId); return DefaultImmutableAggregate.fromExisting( projection, aggregateId,
@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()); }
@NotNull @Override public <TParam> ImmutableAggregate<TState, TEvent> apply( @NotNull final ParameterizedAppendHandler<TParam, TEvent> handler, final TParam params) { return this.apply(handler.execute(params)); }
.thenReturn(DefaultImmutableAggregate.fromExisting( mock(AggregateProjection.class), AGGREGATE_ID,
@Override public ImmutableAggregate<TState, TEvent> toImmutable() { return new DefaultImmutableAggregate<>( projection, id, sourceVersion, state, appliedEvents); }
@NotNull @Override public <TParam> ImmutableAggregate<TState, TEvent> fold( @NotNull final ParameterizedPojoUpdateHandler<TState, TParam, TEvent> handler, @NotNull final Stream<TParam> params) { return foldLeft( params, (ImmutableAggregate<TState, TEvent>) this, (state, param) -> state.apply(handler, param)); }
@NotNull @Override public <TParam> ImmutableAggregate<TState, TEvent> apply( @NotNull final ParameterizedUpdateHandlerSingle<TState, TParam, TEvent> handler, final TParam params) { return this.apply(handler.executeSingle(this, params)); }
.thenReturn(DefaultImmutableAggregate.fromExisting( mock(AggregateProjection.class), AGGREGATE_ID,
@NotNull @Override public ImmutableAggregate<TState, TEvent> rebase(final int version) { return new DefaultImmutableAggregate<>( projection, id, version, state, ImmutableList.of()); }
@NotNull @Override public <TParam> ImmutableAggregate<TState, TEvent> fold( @NotNull final ParameterizedPojoUpdateHandlerSingle<TState, TParam, TEvent> handler, @NotNull final Stream<TParam> params) { return foldLeft( params, (ImmutableAggregate<TState, TEvent>) this, (state, param) -> state.apply(handler, param)); }
@NotNull @Override public ImmutableAggregate<TState, TEvent> apply( @NotNull final PojoUpdateHandler<TState, TEvent> handler) { return this.apply(handler.execute(this.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()); }
@NotNull @Override public ImmutableAggregate<TState, TEvent> rebase(final int version) { return new DefaultImmutableAggregate<>( projection, id, version, state, ImmutableList.of()); }
@NotNull @Override public <TParam> ImmutableAggregate<TState, TEvent> fold( @NotNull final ParameterizedPojoUpdateHandlerSingle<TState, TParam, TEvent> handler, @NotNull final Stream<TParam> params) { return foldLeft( params, (ImmutableAggregate<TState, TEvent>) this, (state, param) -> state.apply(handler, param)); }