Skip to content

Commit

Permalink
updated Ditto java client examples to use Ditto client 3.0.0
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Jaeckle <[email protected]>
  • Loading branch information
thjaeckle committed Oct 6, 2022
1 parent 4f5b3bf commit a7d8ef7
Show file tree
Hide file tree
Showing 36 changed files with 509 additions and 473 deletions.
8 changes: 4 additions & 4 deletions java-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,24 @@
<dependency>
<groupId>org.eclipse.ditto</groupId>
<artifactId>ditto-client</artifactId>
<version>1.5.1</version>
<version>3.0.0</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<version>1.2.11</version>
</dependency>
<!-- jackson is used to demonstrate custom serialization of message payloads -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.6.1</version>
<version>2.13.3</version>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,28 @@
*/
package org.eclipse.ditto.examples.changes;

import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.eclipse.ditto.base.model.auth.AuthorizationSubject;
import org.eclipse.ditto.client.DittoClient;
import org.eclipse.ditto.client.changes.ChangeAction;
import org.eclipse.ditto.client.management.ThingHandle;
import org.eclipse.ditto.examples.common.ExamplesBase;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.model.base.auth.AuthorizationSubject;
import org.eclipse.ditto.model.things.Thing;
import org.eclipse.ditto.model.things.ThingId;
import org.eclipse.ditto.things.model.Thing;
import org.eclipse.ditto.things.model.ThingId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
* This example shows the various possibilities that the {@link org.eclipse.ditto.client.DittoClient} offers for
* registering handlers to be informed about {@link org.eclipse.ditto.client.changes.Change}s of your
* {@link org.eclipse.ditto.model.things.Thing}s.
* {@link Thing}s.
* <p>
* NOTE: Make sure to invoke {@code twin().startConsumption()} once after all handlers are registered to start
* receiving events.
Expand Down Expand Up @@ -119,7 +119,8 @@ private void createThing(final DittoClient client, final AuthorizationSubject...
.setAttribute(JsonPointer.of("foo"), JsonValue.of("bar"))
.build();
return client.twin().update(updatedThing);
}).get(10, TimeUnit.SECONDS);
}).toCompletableFuture()
.get(10, TimeUnit.SECONDS);
} catch (final InterruptedException | ExecutionException | TimeoutException e) {
throw new IllegalStateException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,24 @@
*/
package org.eclipse.ditto.examples.claiming;

import static org.eclipse.ditto.model.things.AccessControlListModelFactory.allPermissions;

import java.time.OffsetDateTime;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.eclipse.ditto.base.model.common.HttpStatus;
import org.eclipse.ditto.client.live.LiveThingHandle;
import org.eclipse.ditto.client.live.messages.RepliableMessage;
import org.eclipse.ditto.examples.common.ExamplesBase;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.model.base.common.HttpStatusCode;
import org.eclipse.ditto.model.things.AccessControlListModelFactory;
import org.eclipse.ditto.model.things.AclEntry;
import org.eclipse.ditto.model.things.Thing;
import org.eclipse.ditto.model.things.ThingId;
import org.eclipse.ditto.policies.model.*;
import org.eclipse.ditto.things.model.ThingId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.OffsetDateTime;
import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
* This example shows how to register for- and reply to claim messages with the {@link org.eclipse.ditto.client.DittoClient}.
*/
Expand Down Expand Up @@ -65,62 +62,69 @@ public static void main(final String... args) {
/**
* Registers for claim messages sent to all things.
* To claim the prepared Thing, you can use our swagger documentation provided at
* https://ditto.eclipse.org/apidoc/ or any other REST client.
* https://ditto.eclipseprojects.io/apidoc/ or any other REST client.
*/
private void registerForClaimMessagesToAllThings() {
prepareClaimableThing()
.thenAccept(thingHandle -> {
client1.live().registerForClaimMessage(registrationIdAllClaimMessages, this::handleMessage);
LOGGER.info("Thing '{}' ready to be claimed", thingHandle.getThingEntityId());
LOGGER.info("Thing '{}' ready to be claimed", thingHandle.getEntityId());
});
}

/**
* Registers for claim messages sent to a single Thing.
* To claim the prepared Thing, you can use our swagger documentation provided at
* https://ditto.eclipse.org/apidoc/ or any other REST client.
* https://ditto.eclipseprojects.io/apidoc/ or any other REST client.
*/
private void registerForClaimMessagesToSingleThing()
throws InterruptedException, ExecutionException, TimeoutException {
client1.live().startConsumption().get(10, TimeUnit.SECONDS);
client1.live().startConsumption().toCompletableFuture().get(10, TimeUnit.SECONDS);
prepareClaimableThing()
.thenAccept(thingHandle -> {
thingHandle.registerForClaimMessage(registrationIdClaimMessagesForThing, this::handleMessage);
LOGGER.info("Thing '{}' ready to be claimed!", thingHandle.getThingEntityId());
LOGGER.info("Thing '{}' ready to be claimed!", thingHandle.getEntityId());
});
}

private CompletableFuture<LiveThingHandle> prepareClaimableThing() {
private CompletionStage<LiveThingHandle> prepareClaimableThing() {
final ThingId thingId = randomThingId();
return client1.twin().create(thingId)
.thenCompose(created -> {
final Thing updated = created.toBuilder()
.setPermissions(authorizationSubject, allPermissions())
.build();
return client1.twin().update(updated);
final PolicyId policyId = created.getPolicyId().get();
return client1.policies().retrieve(policyId)
.thenApply(policy -> policy.toBuilder()
.forLabel("NEW")
.setSubject(authorizationSubject.getId(), SubjectType.UNKNOWN)
.setResource(Resource.newInstance(
PoliciesResourceType.thingResource("/"),
EffectedPermissions.newInstance(Arrays.asList("READ", "WRITE"), null)
))
.build()
).thenCompose(updatedPolicy -> client1.policies().update(updatedPolicy));
})
.thenApply(created -> client1.live().forId(thingId));
.thenApply(updatedPolicyVoid -> client1.live().forId(thingId));
}

private void handleMessage(final RepliableMessage<?, Object> message) {

final ThingId thingId = message.getThingEntityId();
final ThingId thingId = message.getEntityId();

client1.twin().forId(thingId)
.retrieve()
.thenCompose(thing -> client1.twin().update(thing.setAttribute("myAttribute","testValue")))
.whenComplete((aVoid, throwable) -> {
if (null != throwable) {
message.reply()
.statusCode(HttpStatusCode.BAD_GATEWAY)
.httpStatus(HttpStatus.SERVICE_UNAVAILABLE)
.timestamp(OffsetDateTime.now())
.payload("Error: Claiming failed. Please try again later.")
.contentType("text/plain")
.send();
LOGGER.info("Update failed: '{}'", throwable.getMessage());
} else {
message.reply()
.statusCode(HttpStatusCode.OK)
.httpStatus(HttpStatus.OK)
.timestamp(OffsetDateTime.now())
.payload(JsonFactory.newObjectBuilder().set("success", true).build())
.contentType("application/json")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,15 @@
*/
package org.eclipse.ditto.examples.common;

import java.nio.ByteBuffer;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.neovisionaries.ws.client.WebSocket;
import org.eclipse.ditto.base.model.auth.AuthorizationSubject;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.client.DisconnectedDittoClient;
import org.eclipse.ditto.client.DittoClient;
import org.eclipse.ditto.client.DittoClients;
import org.eclipse.ditto.client.configuration.BasicAuthenticationConfiguration;
import org.eclipse.ditto.client.configuration.ClientCredentialsAuthenticationConfiguration;
import org.eclipse.ditto.client.configuration.MessagingConfiguration;
import org.eclipse.ditto.client.configuration.ProxyConfiguration;
import org.eclipse.ditto.client.configuration.WebSocketMessagingConfiguration;
import org.eclipse.ditto.client.configuration.*;
import org.eclipse.ditto.client.live.internal.MessageSerializerFactory;
import org.eclipse.ditto.client.live.messages.MessageSerializerRegistry;
import org.eclipse.ditto.client.live.messages.MessageSerializers;
Expand All @@ -34,13 +29,14 @@
import org.eclipse.ditto.client.messaging.MessagingProvider;
import org.eclipse.ditto.client.messaging.MessagingProviders;
import org.eclipse.ditto.examples.common.model.ExampleUser;
import org.eclipse.ditto.model.base.auth.AuthorizationSubject;
import org.eclipse.ditto.model.base.json.JsonSchemaVersion;
import org.eclipse.ditto.model.things.ThingId;
import org.eclipse.ditto.things.model.ThingId;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.neovisionaries.ws.client.WebSocket;
import java.nio.ByteBuffer;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
* Reads configuration properties and instantiates {@link org.eclipse.ditto.client.DittoClient}s.
Expand All @@ -53,8 +49,12 @@ public abstract class ExamplesBase {
protected AuthorizationSubject authorizationSubject;

protected ExamplesBase() {
client1 = buildClient();
client2 = buildClient();
try {
client1 = buildClient().connect().toCompletableFuture().get(10, TimeUnit.SECONDS);
client2 = buildClient().connect().toCompletableFuture().get(10, TimeUnit.SECONDS);
} catch (final InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}

protected ThingId randomThingId() {
Expand All @@ -63,14 +63,14 @@ protected ThingId randomThingId() {

protected void startConsumeChanges(final DittoClient client) {
try {
client.twin().startConsumption().get(10, TimeUnit.SECONDS);
client.twin().startConsumption().toCompletableFuture().get(10, TimeUnit.SECONDS);
} catch (final InterruptedException | ExecutionException | TimeoutException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("Error subscribing to change events.", e);
}
}

private DittoClient buildClient() {
private DisconnectedDittoClient buildClient() {
final AuthenticationProvider<WebSocket> authenticationProvider = buildAuthenticationProvider();

final MessagingConfiguration.Builder messagingConfigurationBuilder =
Expand All @@ -84,7 +84,7 @@ private DittoClient buildClient() {
final MessagingProvider messagingProvider =
MessagingProviders.webSocket(messagingConfigurationBuilder.build(), authenticationProvider);

return DittoClients.newInstance(messagingProvider, messagingProvider, buildMessageSerializerRegistry());
return DittoClients.newInstance(messagingProvider, messagingProvider, messagingProvider, buildMessageSerializerRegistry());
}

private AuthenticationProvider<WebSocket> buildAuthenticationProvider() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@
*/
package org.eclipse.ditto.examples.live;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.eclipse.ditto.base.model.entity.id.EntityId;
import org.eclipse.ditto.examples.common.ExamplesBase;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.model.base.entity.id.EntityId;
import org.eclipse.ditto.model.things.Thing;
import org.eclipse.ditto.model.things.ThingId;
import org.eclipse.ditto.things.model.Thing;
import org.eclipse.ditto.things.model.ThingId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
* This example shows how the {@link org.eclipse.ditto.client.DittoClient} client can be used to register for and
* emit {@link org.eclipse.ditto.client.live.Live} changes.
Expand Down Expand Up @@ -65,7 +65,7 @@ private void registerForAndEmitLiveEvents() throws InterruptedException, Timeout
created.toBuilder()
.build();
return client1.twin().update(updated);
}).get(2, TimeUnit.SECONDS);
}).toCompletableFuture().get(2, TimeUnit.SECONDS);

LOGGER.info("[AT BACKEND] register for LIVE attribute changes of attribute 'location'..");
client1.live()
Expand All @@ -86,7 +86,7 @@ private void registerForAndEmitLiveEvents() throws InterruptedException, Timeout
});

try {
client1.live().startConsumption().get(10, TimeUnit.SECONDS);
client1.live().startConsumption().toCompletableFuture().get(10, TimeUnit.SECONDS);
} catch (final InterruptedException | ExecutionException | TimeoutException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("Error creating Things Client.", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@
*/
package org.eclipse.ditto.examples.live;

import org.eclipse.ditto.client.live.commands.modify.ModifyFeaturePropertyLiveCommandAnswerBuilder;
import org.eclipse.ditto.examples.common.ExamplesBase;
import org.eclipse.ditto.things.model.Thing;
import org.eclipse.ditto.things.model.ThingId;
import org.eclipse.ditto.things.model.ThingsModelFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.eclipse.ditto.examples.common.ExamplesBase;
import org.eclipse.ditto.model.things.Thing;
import org.eclipse.ditto.model.things.ThingId;
import org.eclipse.ditto.model.things.ThingsModelFactory;
import org.eclipse.ditto.signals.commands.live.modify.ModifyFeaturePropertyLiveCommandAnswerBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* This example shows how the {@link org.eclipse.ditto.client.DittoClient} can be used to register for, send and
* respond to live commands.
Expand Down Expand Up @@ -64,7 +64,7 @@ private void registerForAndSendLiveCommands() throws InterruptedException, Timeo
.setFeature(ThingsModelFactory.newFeature(FEATURE_ID))
.build();
return client1.twin().update(updated);
}).get(2, TimeUnit.SECONDS);
}).toCompletableFuture().get(2, TimeUnit.SECONDS);

LOGGER.info("[AT DEVICE] register handler for 'ModifyFeatureProperty' LIVE commands..");
client2.live()
Expand All @@ -82,8 +82,8 @@ private void registerForAndSendLiveCommands() throws InterruptedException, Timeo
});

try {
client2.live().startConsumption().get(10, TimeUnit.SECONDS);
client1.live().startConsumption().get(10, TimeUnit.SECONDS);
client2.live().startConsumption().toCompletableFuture().get(10, TimeUnit.SECONDS);
client1.live().startConsumption().toCompletableFuture().get(10, TimeUnit.SECONDS);
} catch (final InterruptedException | ExecutionException | TimeoutException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("Error creating Things Client.", e);
Expand All @@ -100,7 +100,7 @@ private void registerForAndSendLiveCommands() throws InterruptedException, Timeo
LOGGER.info("[AT BACKEND] Putting the property succeeded");
}
latch.countDown();
}).get(10, TimeUnit.SECONDS);
}).toCompletableFuture().get(10, TimeUnit.SECONDS);

if (latch.await(10, TimeUnit.SECONDS)) {
LOGGER.info("Received all expected events!");
Expand Down
Loading

0 comments on commit a7d8ef7

Please sign in to comment.