use of io.spine.client.Subscription in project core-java by SpineEventEngine.
the class SubscriptionServiceShould method subscribe_to_topic.
/*
* Subscription tests
* ------------------
*/
@Test
public void subscribe_to_topic() {
final BoundedContext boundedContext = setupBoundedContextWithProjectAggregateRepo();
final SubscriptionService subscriptionService = SubscriptionService.newBuilder().add(boundedContext).build();
final String type = boundedContext.getStand().getExposedTypes().iterator().next().value();
final Target target = getProjectQueryTarget();
assertEquals(type, target.getType());
final Topic topic = requestFactory.topic().forTarget(target);
final MemoizeStreamObserver<Subscription> observer = new MemoizeStreamObserver<>();
subscriptionService.subscribe(topic, observer);
assertNotNull(observer.streamFlowValue);
assertTrue(observer.streamFlowValue.isInitialized());
assertEquals(observer.streamFlowValue.getTopic().getTarget().getType(), type);
assertNull(observer.throwable);
assertTrue(observer.isCompleted);
}
use of io.spine.client.Subscription in project core-java by SpineEventEngine.
the class SubscriptionServiceShould method activate_subscription.
@Test
public void activate_subscription() {
final BoundedContext boundedContext = setupBoundedContextWithProjectAggregateRepo();
final SubscriptionService subscriptionService = SubscriptionService.newBuilder().add(boundedContext).build();
final Target target = getProjectQueryTarget();
final Topic topic = requestFactory.topic().forTarget(target);
// Subscribe to the topic
final MemoizeStreamObserver<Subscription> subscriptionObserver = new MemoizeStreamObserver<>();
subscriptionService.subscribe(topic, subscriptionObserver);
subscriptionObserver.verifyState();
// Activate subscription
final MemoizeStreamObserver<SubscriptionUpdate> activationObserver = new MemoizeStreamObserver<>();
subscriptionService.activate(subscriptionObserver.streamFlowValue, activationObserver);
// Post update to Stand directly
final ProjectId projectId = ProjectId.newBuilder().setId("some-id").build();
final Message projectState = Project.newBuilder().setId(projectId).build();
final int version = 1;
final VersionableEntity entity = mockEntity(projectId, projectState, version);
boundedContext.getStand().post(requestFactory.createCommandContext().getActorContext().getTenantId(), entity);
// isCompleted set to false since we don't expect activationObserver::onCompleted to be called.
activationObserver.verifyState(false);
}
use of io.spine.client.Subscription in project core-java by SpineEventEngine.
the class Stand method subscribe.
/**
* Subscribes for all further changes of an entity state, which satisfies the {@link Topic}.
*
* <p>Once this instance of {@code Stand} receives an update of an entity
* with the given {@code TypeUrl}, all such callbacks are executed.
*
* @param topic an instance {@link Topic}, defining the entity and criteria,
* which changes should be propagated to the {@code callback}
*/
public void subscribe(final Topic topic, final StreamObserver<Subscription> responseObserver) {
topicValidator.validate(topic, responseObserver);
final TenantId tenantId = topic.getContext().getTenantId();
final TenantAwareOperation op = new TenantAwareOperation(tenantId) {
@Override
public void run() {
final Subscription subscription = subscriptionRegistry.add(topic);
responseObserver.onNext(subscription);
responseObserver.onCompleted();
}
};
op.execute();
}
use of io.spine.client.Subscription in project core-java by SpineEventEngine.
the class SubscriptionValidator method checkInRegistry.
private boolean checkInRegistry(Subscription request) {
final TenantId tenantId = request.getTopic().getContext().getTenantId();
final Boolean result = new TenantAwareFunction<Subscription, Boolean>(tenantId) {
@Override
public Boolean apply(@Nullable Subscription input) {
checkNotNull(input);
final boolean result = registry.containsId(input.getId());
return result;
}
}.execute(request);
checkNotNull(result);
return result;
}
use of io.spine.client.Subscription in project core-java by SpineEventEngine.
the class StandShould method use_provided_executor_upon_update_of_watched_type.
@Test
public void use_provided_executor_upon_update_of_watched_type() {
final Executor executor = mock(Executor.class);
final BoundedContext boundedContext = BoundedContext.newBuilder().setStand(Stand.newBuilder().setCallbackExecutor(executor)).build();
final Stand stand = boundedContext.getStand();
final StandTestProjectionRepository standTestProjectionRepo = new StandTestProjectionRepository();
stand.registerTypeSupplier(standTestProjectionRepo);
final Topic projectProjections = requestFactory.topic().allOf(Project.class);
final MemoizingObserver<Subscription> observer = memoizingObserver();
stand.subscribe(projectProjections, observer);
final Subscription subscription = observer.firstResponse();
final StreamObserver<Response> noopObserver = noOpObserver();
stand.activate(subscription, emptyUpdateCallback(), noopObserver);
assertNotNull(subscription);
verify(executor, never()).execute(any(Runnable.class));
final ProjectId someId = ProjectId.getDefaultInstance();
final Version stateVersion = GivenVersion.withNumber(1);
stand.update(asEnvelope(someId, Project.getDefaultInstance(), stateVersion));
verify(executor, times(1)).execute(any(Runnable.class));
}
Aggregations