diff --git a/src/main/java/io/nats/client/api/Placement.java b/src/main/java/io/nats/client/api/Placement.java index e90bc6291..16eb68dc7 100644 --- a/src/main/java/io/nats/client/api/Placement.java +++ b/src/main/java/io/nats/client/api/Placement.java @@ -15,7 +15,6 @@ import io.nats.client.support.JsonSerializable; import io.nats.client.support.JsonValue; -import io.nats.client.support.Validator; import java.util.Arrays; import java.util.List; @@ -24,7 +23,7 @@ import static io.nats.client.support.ApiConstants.TAGS; import static io.nats.client.support.JsonUtils.*; import static io.nats.client.support.JsonValueUtils.readOptionalStringList; -import static io.nats.client.support.JsonValueUtils.readString; +import static io.nats.client.support.JsonValueUtils.readStringEmptyAsNull; /** * Placement directives to consider when placing replicas of a stream @@ -38,7 +37,7 @@ static Placement optionalInstance(JsonValue vPlacement) { } Placement(JsonValue vPlacement) { - this.cluster = readString(vPlacement, CLUSTER); + this.cluster = readStringEmptyAsNull(vPlacement, CLUSTER); this.tags = readOptionalStringList(vPlacement, TAGS); } @@ -48,8 +47,12 @@ static Placement optionalInstance(JsonValue vPlacement) { * @param tags the list of tags, may be null */ public Placement(String cluster, List tags) { - this.cluster = cluster; - this.tags = tags == null || tags.size() == 0 ? null : tags; + this.cluster = cluster == null || cluster.isEmpty() ? null : cluster; + this.tags = tags == null || tags.isEmpty() ? null : tags; + } + + public boolean hasData() { + return cluster != null || tags != null; } /** @@ -133,7 +136,6 @@ public Builder tags(List tags) { * @return the Placement */ public Placement build() { - Validator.required(cluster, "Cluster"); return new Placement(cluster, tags); } } diff --git a/src/main/java/io/nats/client/api/StreamConfiguration.java b/src/main/java/io/nats/client/api/StreamConfiguration.java index 20ee6b175..52cbae0d3 100644 --- a/src/main/java/io/nats/client/api/StreamConfiguration.java +++ b/src/main/java/io/nats/client/api/StreamConfiguration.java @@ -179,7 +179,9 @@ public String toJson() { addField(sb, TEMPLATE_OWNER, templateOwner); addField(sb, DISCARD, discardPolicy.toString()); addFieldAsNanos(sb, DUPLICATE_WINDOW, duplicateWindow); - addField(sb, PLACEMENT, placement); + if (placement != null && placement.hasData()) { + addField(sb, PLACEMENT, placement); + } addField(sb, REPUBLISH, republish); addField(sb, SUBJECT_TRANSFORM, subjectTransform); addField(sb, CONSUMER_LIMITS, consumerLimits); diff --git a/src/main/java/io/nats/client/support/JsonValueUtils.java b/src/main/java/io/nats/client/support/JsonValueUtils.java index 262d55be2..b98ad733c 100644 --- a/src/main/java/io/nats/client/support/JsonValueUtils.java +++ b/src/main/java/io/nats/client/support/JsonValueUtils.java @@ -71,6 +71,10 @@ public static String readString(JsonValue jsonValue, String key) { return read(jsonValue, key, v -> v == null ? null : v.string); } + public static String readStringEmptyAsNull(JsonValue jsonValue, String key) { + return read(jsonValue, key, v -> v == null ? null : (v.string.isEmpty() ? null : v.string)); + } + public static String readString(JsonValue jsonValue, String key, String dflt) { return read(jsonValue, key, v -> v == null ? dflt : v.string); } diff --git a/src/test/java/io/nats/client/api/StreamConfigurationTests.java b/src/test/java/io/nats/client/api/StreamConfigurationTests.java index 0c1bc4117..9501250b1 100644 --- a/src/test/java/io/nats/client/api/StreamConfigurationTests.java +++ b/src/test/java/io/nats/client/api/StreamConfigurationTests.java @@ -579,19 +579,25 @@ public static void validateSubjectTransforms(List subjectTrans @Test public void testPlacement() { - assertThrows(IllegalArgumentException.class, () -> Placement.builder().build()); + assertFalse(Placement.builder().build().hasData()); + assertFalse(Placement.builder().cluster(null).build().hasData()); + assertFalse(Placement.builder().cluster("").build().hasData()); + assertFalse(Placement.builder().tags((List)null).build().hasData()); Placement p = Placement.builder().cluster("cluster").build(); assertEquals("cluster", p.getCluster()); assertNull(p.getTags()); + assertTrue(p.hasData()); p = Placement.builder().cluster("cluster").tags("a", "b").build(); assertEquals("cluster", p.getCluster()); assertEquals(2, p.getTags().size()); + assertTrue(p.hasData()); p = Placement.builder().cluster("cluster").tags(Arrays.asList("a", "b")).build(); assertEquals("cluster", p.getCluster()); assertEquals(2, p.getTags().size()); + assertTrue(p.hasData()); } @Test