Skip to content

Commit 9c1743f

Browse files
author
Yufei Cai
committed
Merge branch 'master' into feature/search-protocol
Signed-off-by: Yufei Cai <yufei.cai@bosch-si.com>
2 parents dd172a2 + 21efb53 commit 9c1743f

File tree

10 files changed

+163
-49
lines changed

10 files changed

+163
-49
lines changed

.github/workflows/maven.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
java: [ '1.8' ]
2424

2525
steps:
26-
- uses: actions/checkout@v1
26+
- uses: actions/checkout@v2
2727
- name: set up JDK ${{ matrix.java }}
2828
uses: actions/setup-java@v1
2929
with:

.github/workflows/nodejs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
node-version: [10.x, 12.x]
2525

2626
steps:
27-
- uses: actions/checkout@v1
27+
- uses: actions/checkout@v2
2828
- name: Use Node.js ${{ matrix.node-version }}
2929
uses: actions/setup-node@v1
3030
with:

java/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ AuthenticationProvider authenticationProvider =
7171
```java
7272
MessagingProvider messagingProvider = MessagingProviders.webSocket(WebSocketMessagingConfiguration.newBuilder()
7373
.endpoint("wss://ditto.eclipse.org")
74-
.jsonSchemaVersion(JsonSchemaVersion.V_1)
74+
.jsonSchemaVersion(JsonSchemaVersion.V_2)
7575
.proxyConfiguration(proxyConfig) // optionally configure a proxy server
7676
// optionally configure a truststore containing the trusted CAs for SSL connection establishment
7777
.trustStoreConfiguration(TrustStoreConfiguration.newBuilder()

java/pom.xml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@
246246
<ditto.thirdPartyLicences.excludedGroups>
247247
(org\.eclipse\.ditto.*)
248248
</ditto.thirdPartyLicences.excludedGroups>
249+
250+
<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
249251
</properties>
250252

251253
<build>
@@ -382,7 +384,7 @@
382384
<plugin>
383385
<groupId>org.jacoco</groupId>
384386
<artifactId>jacoco-maven-plugin</artifactId>
385-
<version>0.8.3</version>
387+
<version>0.8.5</version>
386388
</plugin>
387389
<plugin>
388390
<groupId>com.github.siom79.japicmp</groupId>
@@ -714,15 +716,15 @@
714716
<artifactId>jacoco-maven-plugin</artifactId>
715717
<executions>
716718
<execution>
717-
<id>prepare</id>
719+
<id>prepare-agent</id>
718720
<goals>
719721
<goal>prepare-agent</goal>
720722
</goals>
721723
</execution>
722724
<execution>
723725
<id>report</id>
724726
<goals>
725-
<goal>report-aggregate</goal>
727+
<goal>report</goal>
726728
</goals>
727729
</execution>
728730
</executions>
@@ -1210,6 +1212,12 @@
12101212
<goals>
12111213
<goal>sign</goal>
12121214
</goals>
1215+
<configuration>
1216+
<gpgArguments>
1217+
<arg>--pinentry-mode</arg>
1218+
<arg>loopback</arg>
1219+
</gpgArguments>
1220+
</configuration>
12131221
</execution>
12141222
</executions>
12151223
</plugin>

java/src/main/java/org/eclipse/ditto/client/configuration/WebSocketMessagingConfiguration.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Arrays;
2222
import java.util.List;
2323
import java.util.Optional;
24+
import java.util.regex.Matcher;
25+
import java.util.regex.Pattern;
2426

2527
import javax.annotation.Nullable;
2628

@@ -90,6 +92,7 @@ private static final class WebSocketMessagingConfigurationBuilder implements Mes
9092

9193
private static final List<String> ALLOWED_URI_SCHEME = Arrays.asList("wss", "ws");
9294
private static final String WS_PATH = "/ws/";
95+
private static final String WS_PATH_REGEX = "/ws/([12])/?";
9396

9497
private Duration timeout = Duration.ofSeconds(60L);
9598
private JsonSchemaVersion jsonSchemaVersion = JsonSchemaVersion.LATEST;
@@ -144,15 +147,42 @@ public MessagingConfiguration.Builder trustStoreConfiguration(
144147

145148
@Override
146149
public MessagingConfiguration build() {
147-
final URI wsEndpointUri = appendWsPath(this.endpointUri, jsonSchemaVersion);
150+
final URI wsEndpointUri = appendWsPathIfNecessary(this.endpointUri, jsonSchemaVersion);
148151
return new WebSocketMessagingConfiguration(timeout, jsonSchemaVersion, wsEndpointUri, reconnectEnabled,
149152
proxyConfiguration, trustStoreConfiguration);
150153
}
151154

152-
private static URI appendWsPath(final URI baseUri, final JsonSchemaVersion schemaVersion) {
153-
final String pathWithoutTrailingSlashes = baseUri.getPath().replaceFirst("/+$", "");
154-
final String newPath = pathWithoutTrailingSlashes + WS_PATH + schemaVersion.toString();
155-
return baseUri.resolve(newPath);
155+
private static URI appendWsPathIfNecessary(final URI baseUri, final JsonSchemaVersion schemaVersion) {
156+
if (needToAppendWsPath(baseUri)) {
157+
final String pathWithoutTrailingSlashes = removeTrailingSlashFromPath(baseUri.getPath());
158+
final String newPath = pathWithoutTrailingSlashes + WS_PATH + schemaVersion.toString();
159+
return baseUri.resolve(newPath);
160+
} else {
161+
checkIfBaseUriAndSchemaVersionMatch(baseUri, schemaVersion);
162+
return baseUri;
163+
}
164+
}
165+
166+
private static boolean needToAppendWsPath(final URI baseUri) {
167+
final Pattern pattern = Pattern.compile(WS_PATH_REGEX);
168+
final Matcher matcher = pattern.matcher(baseUri.toString());
169+
return !matcher.find();
170+
}
171+
172+
private static void checkIfBaseUriAndSchemaVersionMatch(final URI baseUri,
173+
final JsonSchemaVersion schemaVersion) {
174+
final String path = removeTrailingSlashFromPath(baseUri.getPath());
175+
final String apiVersion = path.substring(path.length() - 1);
176+
if (!schemaVersion.toString().equals(apiVersion)) {
177+
throw new IllegalArgumentException(
178+
"The jsonSchemaVersion and apiVersion of the endpoint do not match. " +
179+
"Either remove the ws path from the endpoint or " +
180+
"use the same jsonSchemaVersion as in the ws path of the endpoint.");
181+
}
182+
}
183+
184+
private static String removeTrailingSlashFromPath(final String path) {
185+
return path.replaceFirst("/+$", "");
156186
}
157187

158188
}

java/src/main/java/org/eclipse/ditto/client/internal/CommonManagementImpl.java

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ public abstract class CommonManagementImpl<T extends ThingHandle<F>, F extends F
8989
extends AbstractHandle
9090
implements CommonManagement<T, F> {
9191

92+
private static final String ARGUMENT_THING_ID = "thingId";
93+
private static final String ARGUMENT_THING = "thing";
94+
private static final String ARGUMENT_INITIAL_POLICY = "initialPolicy";
9295
private static final Logger LOGGER = LoggerFactory.getLogger(CommonManagementImpl.class);
9396

9497
protected final OutgoingMessageFactory outgoingMessageFactory;
@@ -280,20 +283,21 @@ public CompletableFuture<Thing> create(final JsonObject jsonObject, final Option
280283
}
281284

282285
@Override
283-
public CompletableFuture<Thing> create(final Policy policy, final Option<?>... options) {
286+
public CompletableFuture<Thing> create(final Policy initialPolicy, final Option<?>... options) {
287+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
284288
// as the backend adds the default namespace, we can here simply use the empty namespace.
285289
final Thing thing = ThingsModelFactory.newThingBuilder()
286290
.setId(ThingId.generateRandom())
287291
.build();
288-
return processCreate(thing, policy.toJson(), options);
292+
return processCreate(thing, initialPolicy.toJson(), options);
289293
}
290294

291295
@Override
292296
public CompletableFuture<Thing> create(final ThingId thingId, final JsonObject initialPolicy,
293297
final Option<?>... options) {
294-
argumentNotNull(thingId);
298+
argumentNotNull(thingId, ARGUMENT_THING_ID);
295299
argumentNotEmpty(thingId);
296-
argumentNotNull(initialPolicy);
300+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
297301

298302
final Thing thing = ThingsModelFactory.newThingBuilder()
299303
.setId(ThingId.of(thingId))
@@ -305,9 +309,9 @@ public CompletableFuture<Thing> create(final ThingId thingId, final JsonObject i
305309
@Override
306310
public CompletableFuture<Thing> create(final ThingId thingId, final Policy initialPolicy,
307311
final Option<?>... options) {
308-
argumentNotNull(thingId);
312+
argumentNotNull(thingId, ARGUMENT_THING_ID);
309313
argumentNotEmpty(thingId);
310-
argumentNotNull(initialPolicy);
314+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
311315

312316
final Thing thing = ThingsModelFactory.newThingBuilder()
313317
.setId(ThingId.of(thingId))
@@ -316,37 +320,40 @@ public CompletableFuture<Thing> create(final ThingId thingId, final Policy initi
316320
}
317321

318322
@Override
319-
public CompletableFuture<Thing> create(final JsonObject jsonObject, final JsonObject initialPolicy,
323+
public CompletableFuture<Thing> create(final JsonObject thing, final JsonObject initialPolicy,
320324
final Option<?>... options) {
321-
argumentNotNull(jsonObject);
322-
argumentNotNull(initialPolicy);
325+
argumentNotNull(thing, ARGUMENT_THING);
326+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
323327

324-
final Thing thing = ThingsModelFactory.newThing(jsonObject);
325-
326-
return processCreate(thing, initialPolicy, options);
328+
return processCreate(ThingsModelFactory.newThing(thing), initialPolicy, options);
327329
}
328330

329331
@Override
330-
public CompletableFuture<Thing> create(final JsonObject jsonObject, final Policy initialPolicy,
332+
public CompletableFuture<Thing> create(final JsonObject thing, final Policy initialPolicy,
331333
final Option<?>... options) {
332-
argumentNotNull(jsonObject);
333-
argumentNotNull(initialPolicy);
334-
335-
final Thing thing = ThingsModelFactory.newThing(jsonObject);
334+
argumentNotNull(thing, ARGUMENT_THING);
335+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
336336

337-
return processCreate(thing, initialPolicy.toJson(), options);
337+
return processCreate(ThingsModelFactory.newThing(thing), initialPolicy.toJson(), options);
338338
}
339339

340340
@Override
341341
public CompletableFuture<Thing> create(final Thing thing, final JsonObject initialPolicy,
342342
final Option<?>... options) {
343+
argumentNotNull(thing, ARGUMENT_THING);
344+
assertThatThingHasId(thing);
345+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
346+
343347
return processCreate(thing, initialPolicy, options);
344348
}
345349

346-
347350
@Override
348351
public CompletableFuture<Thing> create(final Thing thing, final Policy initialPolicy,
349352
final Option<?>... options) {
353+
argumentNotNull(thing, ARGUMENT_THING);
354+
assertThatThingHasId(thing);
355+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
356+
350357
return processCreate(thing, initialPolicy.toJson(), options);
351358
}
352359

@@ -363,6 +370,8 @@ private CompletableFuture<Thing> processCreate(final Thing thing, @Nullable fina
363370

364371
@Override
365372
public CompletableFuture<Optional<Thing>> put(final Thing thing, final Option<?>... options) {
373+
argumentNotNull(thing, ARGUMENT_THING);
374+
assertThatThingHasId(thing);
366375
return processPut(thing, null, options);
367376
}
368377

@@ -377,32 +386,40 @@ public CompletableFuture<Optional<Thing>> put(final JsonObject jsonObject, final
377386
}
378387

379388
@Override
380-
public CompletableFuture<Optional<Thing>> put(final JsonObject jsonObject, final JsonObject initialPolicy,
389+
public CompletableFuture<Optional<Thing>> put(final JsonObject thing, final JsonObject initialPolicy,
381390
final Option<?>... options) {
382-
argumentNotNull(jsonObject);
391+
argumentNotNull(thing, ARGUMENT_THING);
392+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
383393

384-
final Thing thing = ThingsModelFactory.newThing(jsonObject);
385-
return processPut(thing, initialPolicy, options);
394+
return processPut(ThingsModelFactory.newThing(thing), initialPolicy, options);
386395
}
387396

388397
@Override
389-
public CompletableFuture<Optional<Thing>> put(final JsonObject jsonObject, final Policy initialPolicy,
398+
public CompletableFuture<Optional<Thing>> put(final JsonObject thing, final Policy initialPolicy,
390399
final Option<?>... options) {
391-
argumentNotNull(jsonObject);
400+
argumentNotNull(thing, ARGUMENT_THING);
401+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
392402

393-
final Thing thing = ThingsModelFactory.newThing(jsonObject);
394-
return processPut(thing, initialPolicy.toJson(), options);
403+
return processPut(ThingsModelFactory.newThing(thing), initialPolicy.toJson(), options);
395404
}
396405

397406
@Override
398407
public CompletableFuture<Optional<Thing>> put(final Thing thing, final JsonObject initialPolicy,
399408
final Option<?>... options) {
409+
argumentNotNull(thing, ARGUMENT_THING);
410+
assertThatThingHasId(thing);
411+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
412+
400413
return processPut(thing, initialPolicy, options);
401414
}
402415

403416
@Override
404417
public CompletableFuture<Optional<Thing>> put(final Thing thing, final Policy initialPolicy,
405418
final Option<?>... options) {
419+
argumentNotNull(thing, ARGUMENT_THING);
420+
assertThatThingHasId(thing);
421+
argumentNotNull(initialPolicy, ARGUMENT_INITIAL_POLICY);
422+
406423
return processPut(thing, initialPolicy.toJson(), options);
407424
}
408425

0 commit comments

Comments
 (0)