use of software.amazon.awssdk.aws.greengrass.model.SubscriptionResponseMessage in project aws-greengrass-nucleus by aws-greengrass.
the class PubSubIPCEventStreamAgent method handlePublishToTopicRequest.
@SuppressWarnings("PMD.PreserveStackTrace")
private PublishToTopicResponse handlePublishToTopicRequest(String topic, String serviceName, Optional<Map<String, Object>> jsonMessage, Optional<byte[]> binaryMessage) {
if (topic == null) {
throw new InvalidArgumentsError("Publish topic must not be null");
}
if (topic.contains(MQTT_SINGLELEVEL_WILDCARD) || topic.contains(MQTT_MULTILEVEL_WILDCARD) || topic.contains(GLOB_WILDCARD)) {
throw new InvalidArgumentsError("Publish topic must not contain a wildcard.");
}
Set<Object> contexts = listeners.get(topic);
if (contexts == null || contexts.isEmpty()) {
log.atDebug().kv(COMPONENT_NAME, serviceName).log("No one subscribed to topic {}. Returning.", topic);
// Still technically successful, just no one was subscribed
return new PublishToTopicResponse();
}
SubscriptionResponseMessage message = new SubscriptionResponseMessage();
PublishEvent publishedEvent = PublishEvent.builder().topic(topic).build();
if (jsonMessage.isPresent()) {
JsonMessage message1 = new JsonMessage();
message1.setMessage(jsonMessage.get());
message1.setEventTopic(topic);
message.setJsonMessage(message1);
try {
publishedEvent.setPayload(SERIALIZER.writeValueAsBytes(jsonMessage.get()));
} catch (JsonProcessingException e) {
log.atError().cause(e).kv(COMPONENT_NAME, serviceName).log("Unable to serialize JSON message.");
throw new InvalidArgumentsError("Unable to serialize payload as JSON");
}
}
if (binaryMessage.isPresent()) {
BinaryMessage binaryMessage1 = new BinaryMessage();
binaryMessage1.setMessage(binaryMessage.get());
binaryMessage1.setEventTopic(topic);
message.setBinaryMessage(binaryMessage1);
publishedEvent.setPayload(binaryMessage.get());
}
contexts.forEach(context -> {
log.atDebug().kv(COMPONENT_NAME, serviceName).log("Sending publish event for topic {}", topic);
if (context instanceof StreamEventPublisher) {
StreamEventPublisher<SubscriptionResponseMessage> publisher = (StreamEventPublisher<SubscriptionResponseMessage>) context;
orderedExecutorService.execute(() -> publisher.sendStreamEvent(message), publisher);
} else if (context instanceof Consumer) {
Consumer<PublishEvent> consumer = (Consumer<PublishEvent>) context;
orderedExecutorService.execute(() -> consumer.accept(publishedEvent), consumer);
}
});
return new PublishToTopicResponse();
}
use of software.amazon.awssdk.aws.greengrass.model.SubscriptionResponseMessage in project aws-greengrass-nucleus by aws-greengrass.
the class PubSubIPCEventStreamAgentTest method GIVEN_subscribed_to_topic_from_all_sources_WHEN_publish_many_binary_message_THEN_publishes_message_inorder.
@Test
void GIVEN_subscribed_to_topic_from_all_sources_WHEN_publish_many_binary_message_THEN_publishes_message_inorder() throws InterruptedException, AuthorizationException {
StreamEventPublisher publisher = mock(StreamEventPublisher.class);
Set<Object> set = new HashSet<>();
set.add(publisher);
pubSubIPCEventStreamAgent.getListeners().add(TEST_TOPIC, set);
when(publisher.sendStreamEvent(subscriptionResponseMessageCaptor.capture())).thenReturn(new CompletableFuture());
List<PublishToTopicRequest> publishToTopicRequests = new ArrayList<>();
for (int i = 0; i < 10; i++) {
PublishToTopicRequest publishToTopicRequest = new PublishToTopicRequest();
publishToTopicRequest.setTopic(TEST_TOPIC);
PublishMessage publishMessage = new PublishMessage();
BinaryMessage binaryMessage = new BinaryMessage();
binaryMessage.setMessage(String.valueOf(i).getBytes());
publishMessage.setBinaryMessage(binaryMessage);
publishToTopicRequest.setPublishMessage(publishMessage);
publishToTopicRequests.add(publishToTopicRequest);
}
try (PubSubIPCEventStreamAgent.PublishToTopicOperationHandler publishToTopicHandler = pubSubIPCEventStreamAgent.getPublishToTopicHandler(mockContext)) {
for (PublishToTopicRequest publishToTopicRequest : publishToTopicRequests) {
PublishToTopicResponse publishToTopicResponse = publishToTopicHandler.handleRequest(publishToTopicRequest);
assertNotNull(publishToTopicResponse);
}
verify(authorizationHandler, times(10)).isAuthorized(eq(PUB_SUB_SERVICE_NAME), permissionArgumentCaptor.capture(), eq(ResourceLookupPolicy.MQTT_STYLE));
Permission capturedPermission = permissionArgumentCaptor.getValue();
assertThat(capturedPermission.getOperation(), is(GreengrassCoreIPCService.PUBLISH_TO_TOPIC));
assertThat(capturedPermission.getPrincipal(), is(TEST_SERVICE));
assertThat(capturedPermission.getResource(), is(TEST_TOPIC));
TimeUnit.SECONDS.sleep(2);
assertNotNull(subscriptionResponseMessageCaptor.getAllValues());
assertEquals(10, subscriptionResponseMessageCaptor.getAllValues().size());
int i = 0;
for (SubscriptionResponseMessage responseMessage : subscriptionResponseMessageCaptor.getAllValues()) {
assertNull(responseMessage.getJsonMessage());
assertNotNull(responseMessage.getBinaryMessage());
assertEquals(String.valueOf(i), new String(responseMessage.getBinaryMessage().getMessage()));
assertEquals(TEST_TOPIC, responseMessage.getBinaryMessage().getEventTopic());
i++;
}
}
}
use of software.amazon.awssdk.aws.greengrass.model.SubscriptionResponseMessage in project aws-iot-device-sdk-java-v2 by aws.
the class GreengrassV2ClientTest method testV2Client.
@Test
public void testV2Client() throws InterruptedException, ExecutionException, TimeoutException {
assertEquals(authenticationRequest.getAuthToken(), "myAuthToken");
CreateLocalDeploymentResponse depResp = client.createLocalDeployment(new CreateLocalDeploymentRequest());
assertEquals("deployment", depResp.getDeploymentId());
CompletableFuture<CreateLocalDeploymentResponse> asyncDepResp = client.createLocalDeploymentAsync(new CreateLocalDeploymentRequest());
assertEquals("deployment", asyncDepResp.get().getDeploymentId());
CompletableFuture<String> receivedMessage = new CompletableFuture<>();
CompletableFuture<String> finalReceivedMessage = receivedMessage;
GreengrassCoreIPCClientV2.StreamingResponse<SubscribeToTopicResponse, SubscribeToTopicResponseHandler> subResp = client.subscribeToTopic(new SubscribeToTopicRequest().withTopic("abc"), (x) -> {
if (!Thread.currentThread().getName().contains("pool")) {
System.out.println(Thread.currentThread().getName());
finalReceivedMessage.completeExceptionally(new RuntimeException("Ran on event loop instead of executor"));
}
finalReceivedMessage.complete(new String(x.getBinaryMessage().getMessage()));
}, Optional.empty(), Optional.empty());
assertEquals("message", receivedMessage.get());
subResp.getHandler().closeStream().get();
subscriptionClosed.get(1, TimeUnit.SECONDS);
subscriptionClosed = new CompletableFuture<>();
receivedMessage = new CompletableFuture<>();
CompletableFuture<String> finalReceivedMessage1 = receivedMessage;
subResp = client.subscribeToTopic(new SubscribeToTopicRequest().withTopic("abc"), new StreamResponseHandler<SubscriptionResponseMessage>() {
@Override
public void onStreamEvent(SubscriptionResponseMessage streamEvent) {
if (!Thread.currentThread().getName().contains("pool")) {
finalReceivedMessage1.completeExceptionally(new RuntimeException("Ran on event loop instead of executor"));
}
finalReceivedMessage1.complete(new String(streamEvent.getBinaryMessage().getMessage()));
}
@Override
public boolean onStreamError(Throwable error) {
return false;
}
@Override
public void onStreamClosed() {
}
});
assertEquals("message", receivedMessage.get());
subResp.getHandler().closeStream().get();
subscriptionClosed.get(1, TimeUnit.SECONDS);
subscriptionClosed = new CompletableFuture<>();
receivedMessage = new CompletableFuture<>();
CompletableFuture<String> finalReceivedMessage2 = receivedMessage;
GreengrassCoreIPCClientV2.StreamingResponse<CompletableFuture<SubscribeToTopicResponse>, SubscribeToTopicResponseHandler> subRespAsync = client.subscribeToTopicAsync(new SubscribeToTopicRequest().withTopic("abc"), new StreamResponseHandler<SubscriptionResponseMessage>() {
@Override
public void onStreamEvent(SubscriptionResponseMessage streamEvent) {
if (!Thread.currentThread().getName().contains("pool")) {
finalReceivedMessage2.completeExceptionally(new RuntimeException("Ran on event loop instead of executor"));
}
finalReceivedMessage2.complete(new String(streamEvent.getBinaryMessage().getMessage()));
}
@Override
public boolean onStreamError(Throwable error) {
return false;
}
@Override
public void onStreamClosed() {
}
});
assertEquals("message", receivedMessage.get());
subRespAsync.getHandler().closeStream().get();
subscriptionClosed.get(1, TimeUnit.SECONDS);
subscriptionClosed = new CompletableFuture<>();
receivedMessage = new CompletableFuture<>();
CompletableFuture<String> finalReceivedMessage3 = receivedMessage;
subRespAsync = client.subscribeToTopicAsync(new SubscribeToTopicRequest().withTopic("abc"), (x) -> {
if (!Thread.currentThread().getName().contains("pool")) {
finalReceivedMessage3.completeExceptionally(new RuntimeException("Ran on event loop instead of executor"));
}
finalReceivedMessage3.complete(new String(x.getBinaryMessage().getMessage()));
}, Optional.empty(), Optional.empty());
assertEquals("message", receivedMessage.get());
subRespAsync.getHandler().closeStream().get();
subscriptionClosed.get(1, TimeUnit.SECONDS);
}
use of software.amazon.awssdk.aws.greengrass.model.SubscriptionResponseMessage in project aws-iot-device-sdk-java-v2 by aws.
the class GreengrassV2ClientTest method before.
@BeforeEach
public void before() throws IOException {
port = randomPort();
try (final EventLoopGroup elGroup = new EventLoopGroup(1);
SocketOptions socketOptions = new SocketOptions()) {
socketOptions.connectTimeoutMs = 3000;
socketOptions.domain = SocketOptions.SocketDomain.IPv4;
socketOptions.type = SocketOptions.SocketType.STREAM;
GreengrassCoreIPCService service = new GreengrassCoreIPCService();
service.setCreateLocalDeploymentHandler((c) -> new GeneratedAbstractCreateLocalDeploymentOperationHandler(c) {
@Override
protected void onStreamClosed() {
}
@Override
public CreateLocalDeploymentResponse handleRequest(CreateLocalDeploymentRequest request) {
return new CreateLocalDeploymentResponse().withDeploymentId("deployment");
}
@Override
public void handleStreamEvent(EventStreamJsonMessage streamRequestEvent) {
}
});
service.setSubscribeToTopicHandler((c) -> new GeneratedAbstractSubscribeToTopicOperationHandler(c) {
@Override
protected void onStreamClosed() {
subscriptionClosed.complete(null);
}
@Override
public SubscribeToTopicResponse handleRequest(SubscribeToTopicRequest request) {
new Thread(() -> {
sendStreamEvent(new SubscriptionResponseMessage().withBinaryMessage(new BinaryMessage().withMessage("message".getBytes(StandardCharsets.UTF_8))));
}).start();
return new SubscribeToTopicResponse().withTopicName(request.getTopic());
}
@Override
public void handleStreamEvent(EventStreamJsonMessage streamRequestEvent) {
}
});
service.setAuthenticationHandler((headers, bytes) -> {
authenticationRequest = new Gson().fromJson(new String(bytes), GreengrassEventStreamConnectMessage.class);
return () -> "connected";
});
service.setAuthorizationHandler(authenticationData -> Authorization.ACCEPT);
ipcServer = new RpcServer(elGroup, socketOptions, null, "127.0.0.1", port, service);
ipcServer.runServer();
client = GreengrassCoreIPCClientV2.builder().withPort(port).withSocketPath("127.0.0.1").withSocketDomain(SocketOptions.SocketDomain.IPv4).withAuthToken("myAuthToken").build();
}
}
use of software.amazon.awssdk.aws.greengrass.model.SubscriptionResponseMessage in project aws-greengrass-nucleus by aws-greengrass.
the class IPCTestUtils method subscribeToTopicOveripcForBinaryMessages.
public static void subscribeToTopicOveripcForBinaryMessages(GreengrassCoreIPCClient ipcClient, String topic, Consumer<byte[]> consumer) throws InterruptedException, ExecutionException, TimeoutException {
SubscribeToTopicRequest request = new SubscribeToTopicRequest();
request.setTopic(topic);
ipcClient.subscribeToTopic(request, Optional.of(new StreamResponseHandler<SubscriptionResponseMessage>() {
@Override
public void onStreamEvent(SubscriptionResponseMessage streamEvent) {
consumer.accept(streamEvent.getBinaryMessage().getMessage());
}
@Override
public boolean onStreamError(Throwable error) {
logger.atError().setCause(error).log("Caught error while subscribing to a topic");
return false;
}
@Override
public void onStreamClosed() {
}
})).getResponse().get(5, TimeUnit.SECONDS);
}
Aggregations