Skip to content

Commit 9848cd0

Browse files
authored
added metadata map to service and endpoints (#862)
1 parent 5d48a60 commit 9848cd0

File tree

12 files changed

+199
-37
lines changed

12 files changed

+199
-37
lines changed

src/main/java/io/nats/client/support/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public interface ApiConstants {
117117
String MEMORY_MAX_STREAM_BYTES = "memory_max_stream_bytes";
118118
String MESSAGE = "message";
119119
String MESSAGES = "messages";
120+
String METADATA = "metadata";
120121
String MTIME = "mtime";
121122
String MIRROR = "mirror";
122123
String MSGS = "msgs";

src/main/java/io/nats/client/support/JsonUtils.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static io.nats.client.support.DateTimeUtils.DEFAULT_TIME;
3030
import static io.nats.client.support.Encoding.jsonDecode;
3131
import static io.nats.client.support.Encoding.jsonEncode;
32+
import static io.nats.client.support.JsonValueUtils.instance;
3233
import static io.nats.client.support.NatsConstants.COLON;
3334

3435
/**
@@ -261,6 +262,12 @@ public static void addField(StringBuilder sb, String fname, JsonSerializable val
261262
}
262263
}
263264

265+
public static void addField(StringBuilder sb, String fname, Map<String, String> map) {
266+
if (map != null && map.size() > 0) {
267+
addField(sb, fname, instance(map));
268+
}
269+
}
270+
264271
interface ListAdder<T> {
265272
void append(StringBuilder sb, T t);
266273
}
@@ -927,4 +934,19 @@ public static void readNanos(String json, Pattern pattern, Consumer<Duration> c)
927934
c.accept(Duration.ofNanos(Long.parseLong(m.group(1))));
928935
}
929936
}
937+
938+
public static boolean mapEquals(Map<String, String> map1, Map<String, String> map2) {
939+
if (map1 == null) {
940+
return map2 == null;
941+
}
942+
if (map2 == null || map1.size() != map2.size()) {
943+
return false;
944+
}
945+
for (String key : map1.keySet()) {
946+
if (!Objects.equals(map1.get(key), map2.get(key))) {
947+
return false;
948+
}
949+
}
950+
return true;
951+
}
930952
}

src/main/java/io/nats/client/support/JsonValueUtils.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
import java.util.*;
2222
import java.util.function.Function;
2323

24-
import static io.nats.client.support.JsonValue.EMPTY_ARRAY;
25-
import static io.nats.client.support.JsonValue.EMPTY_MAP;
24+
import static io.nats.client.support.JsonValue.*;
2625

2726
/**
2827
* Internal json value helpers.
@@ -52,6 +51,21 @@ public static List<JsonValue> readArray(JsonValue jsonValue, String key) {
5251
return read(jsonValue, key, v -> v == null ? EMPTY_ARRAY.array : v.array);
5352
}
5453

54+
public static Map<String, String> readStringStringMap(JsonValue jv, String key) {
55+
JsonValue o = readObject(jv, key);
56+
if (o.type == Type.MAP && o.map.size() > 0) {
57+
Map<String, String> temp = new HashMap<>();
58+
for (String k : o.map.keySet()) {
59+
String value = readString(o, k);
60+
if (value != null) {
61+
temp.put(k, value);
62+
}
63+
}
64+
return temp.isEmpty() ? null : temp;
65+
}
66+
return null;
67+
}
68+
5569
public static String readString(JsonValue jsonValue, String key) {
5670
return read(jsonValue, key, v -> v == null ? null : v.string);
5771
}
@@ -220,7 +234,7 @@ public static JsonValue instance(Map map) {
220234

221235
public static JsonValue toJsonValue(Object o) {
222236
if (o == null) {
223-
return JsonValue.NULL;
237+
return NULL;
224238
}
225239
if (o instanceof JsonValue) {
226240
return (JsonValue)o;
@@ -272,7 +286,7 @@ public static class MapBuilder {
272286

273287
public MapBuilder put(String s, Object o) {
274288
JsonValue vv = JsonValueUtils.toJsonValue(o);
275-
if (vv.type != JsonValue.Type.NULL) {
289+
if (vv.type != Type.NULL) {
276290
jv.map.put(s, vv);
277291
}
278292
return this;
@@ -291,7 +305,7 @@ public static class ArrayBuilder {
291305
public JsonValue jv = new JsonValue(new ArrayList<>());
292306
public ArrayBuilder add(Object o) {
293307
JsonValue vv = JsonValueUtils.toJsonValue(o);
294-
if (vv.type != JsonValue.Type.NULL) {
308+
if (vv.type != Type.NULL) {
295309
jv.array.add(JsonValueUtils.toJsonValue(o));
296310
}
297311
return this;

src/main/java/io/nats/service/Endpoint.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
import io.nats.client.support.JsonUtils;
1818
import io.nats.client.support.JsonValue;
1919

20+
import java.util.Map;
2021
import java.util.Objects;
2122

2223
import static io.nats.client.support.ApiConstants.*;
2324
import static io.nats.client.support.JsonUtils.endJson;
24-
import static io.nats.client.support.JsonValueUtils.readString;
25-
import static io.nats.client.support.JsonValueUtils.readValue;
25+
import static io.nats.client.support.JsonValueUtils.*;
2626
import static io.nats.client.support.Validator.validateIsRestrictedTerm;
2727
import static io.nats.client.support.Validator.validateSubject;
2828

@@ -33,25 +33,26 @@ public class Endpoint implements JsonSerializable {
3333
private final String name;
3434
private final String subject;
3535
private final Schema schema;
36+
private final Map<String, String> metadata;
3637

3738
public Endpoint(String name, String subject, Schema schema) {
38-
this(name, subject, schema, true);
39+
this(name, subject, schema, null, true);
3940
}
4041

4142
public Endpoint(String name) {
42-
this(name, null, null, true);
43+
this(name, null, null, null, true);
4344
}
4445

4546
public Endpoint(String name, String subject) {
46-
this(name, subject, null, true);
47+
this(name, subject, null, null, true);
4748
}
4849

4950
public Endpoint(String name, String subject, String schemaRequest, String schemaResponse) {
50-
this(name, subject, Schema.optionalInstance(schemaRequest, schemaResponse), true);
51+
this(name, subject, Schema.optionalInstance(schemaRequest, schemaResponse), null, true);
5152
}
5253

5354
// internal use constructors
54-
Endpoint(String name, String subject, Schema schema, boolean validate) {
55+
Endpoint(String name, String subject, Schema schema, Map<String, String> metadata, boolean validate) {
5556
if (validate) {
5657
this.name = validateIsRestrictedTerm(name, "Endpoint Name", true);
5758
if (subject == null) {
@@ -66,16 +67,18 @@ public Endpoint(String name, String subject, String schemaRequest, String schema
6667
this.subject = subject;
6768
}
6869
this.schema = schema;
70+
this.metadata = metadata == null || metadata.size() == 0 ? null : metadata;
6971
}
7072

7173
Endpoint(JsonValue vEndpoint) {
7274
name = readString(vEndpoint, NAME);
7375
subject = readString(vEndpoint, SUBJECT);
7476
schema = Schema.optionalInstance(readValue(vEndpoint, SCHEMA));
77+
metadata = readStringStringMap(vEndpoint, METADATA);
7578
}
7679

7780
Endpoint(Builder b) {
78-
this(b.name, b.subject, Schema.optionalInstance(b.schemaRequest, b.schemaResponse));
81+
this(b.name, b.subject, Schema.optionalInstance(b.schemaRequest, b.schemaResponse), b.metadata, true);
7982
}
8083

8184
@Override
@@ -84,6 +87,7 @@ public String toJson() {
8487
JsonUtils.addField(sb, NAME, name);
8588
JsonUtils.addField(sb, SUBJECT, subject);
8689
JsonUtils.addField(sb, SCHEMA, schema);
90+
JsonUtils.addField(sb, METADATA, metadata);
8791
return endJson(sb).toString();
8892
}
8993

@@ -104,6 +108,10 @@ public Schema getSchema() {
104108
return schema;
105109
}
106110

111+
public Map<String, String> getMetadata() {
112+
return metadata;
113+
}
114+
107115
public static Builder builder() {
108116
return new Builder();
109117
}
@@ -113,6 +121,7 @@ public static class Builder {
113121
private String subject;
114122
private String schemaRequest;
115123
private String schemaResponse;
124+
private Map<String, String> metadata;
116125

117126
public Builder endpoint(Endpoint endpoint) {
118127
name = endpoint.getName();
@@ -161,6 +170,11 @@ public Builder schema(Schema schema) {
161170
return this;
162171
}
163172

173+
public Builder metadata(Map<String, String> metadata) {
174+
this.metadata = metadata;
175+
return this;
176+
}
177+
164178
public Endpoint build() {
165179
return new Endpoint(this);
166180
}
@@ -171,18 +185,20 @@ public boolean equals(Object o) {
171185
if (this == o) return true;
172186
if (o == null || getClass() != o.getClass()) return false;
173187

174-
Endpoint endpoint = (Endpoint) o;
188+
Endpoint that = (Endpoint) o;
175189

176-
if (!Objects.equals(name, endpoint.name)) return false;
177-
if (!Objects.equals(subject, endpoint.subject)) return false;
178-
return Objects.equals(schema, endpoint.schema);
190+
if (!Objects.equals(name, that.name)) return false;
191+
if (!Objects.equals(subject, that.subject)) return false;
192+
if (!Objects.equals(schema, that.schema)) return false;
193+
return JsonUtils.mapEquals(metadata, that.metadata);
179194
}
180195

181196
@Override
182197
public int hashCode() {
183198
int result = name != null ? name.hashCode() : 0;
184199
result = 31 * result + (subject != null ? subject.hashCode() : 0);
185200
result = 31 * result + (schema != null ? schema.hashCode() : 0);
201+
result = 31 * result + (metadata != null ? metadata.hashCode() : 0);
186202
return result;
187203
}
188204
}

src/main/java/io/nats/service/InfoResponse.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.nats.client.support.JsonValue;
1818

1919
import java.util.List;
20+
import java.util.Map;
2021
import java.util.Objects;
2122

2223
import static io.nats.client.support.ApiConstants.DESCRIPTION;
@@ -33,8 +34,8 @@ public class InfoResponse extends ServiceResponse {
3334
private final String description;
3435
private final List<String> subjects;
3536

36-
public InfoResponse(String id, String name, String version, String description, List<String> subjects) {
37-
super(TYPE, id, name, version);
37+
public InfoResponse(String id, String name, String version, Map<String, String> metadata, String description, List<String> subjects) {
38+
super(TYPE, id, name, version, metadata);
3839
this.description = description;
3940
this.subjects = subjects;
4041
}

src/main/java/io/nats/service/PingResponse.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@
1313

1414
package io.nats.service;
1515

16+
import java.util.Map;
17+
1618
/**
1719
* SERVICE IS AN EXPERIMENTAL API SUBJECT TO CHANGE
1820
*/
1921
public class PingResponse extends ServiceResponse {
2022
public static final String TYPE = "io.nats.micro.v1.ping_response";
2123

22-
public PingResponse(String id, String name, String version) {
23-
super(TYPE, id, name, version);
24+
public PingResponse(String id, String name, String version, Map<String, String> metadata) {
25+
super(TYPE, id, name, version, metadata);
2426
}
2527

2628
public PingResponse(byte[] jsonBytes) {

src/main/java/io/nats/service/SchemaResponse.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.nats.client.support.JsonValue;
1818

1919
import java.util.List;
20+
import java.util.Map;
2021
import java.util.Objects;
2122

2223
import static io.nats.client.support.ApiConstants.API_URL;
@@ -33,8 +34,8 @@ public class SchemaResponse extends ServiceResponse {
3334
private final String apiUrl;
3435
private final List<EndpointResponse> endpoints;
3536

36-
public SchemaResponse(String id, String name, String version, String apiUrl, List<EndpointResponse> endpoints) {
37-
super(TYPE, id, name, version);
37+
public SchemaResponse(String id, String name, String version, Map<String, String> metadata, String apiUrl, List<EndpointResponse> endpoints) {
38+
super(TYPE, id, name, version, metadata);
3839
this.apiUrl = apiUrl;
3940
this.endpoints = endpoints;
4041
}

src/main/java/io/nats/service/Service.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ public class Service {
8686
}
8787

8888
// build static responses
89-
pingResponse = new PingResponse(id, b.name, b.version);
90-
infoResponse = new InfoResponse(id, b.name, b.version, b.description, infoSubjects);
91-
schemaResponse = new SchemaResponse(id, b.name, b.version, b.apiUrl, schemaEndpoints);
89+
pingResponse = new PingResponse(id, b.name, b.version, b.metadata);
90+
infoResponse = new InfoResponse(id, b.name, b.version, b.metadata, b.description, infoSubjects);
91+
schemaResponse = new SchemaResponse(id, b.name, b.version, b.metadata, b.apiUrl, schemaEndpoints);
9292

9393
if (b.pingDispatcher == null || b.infoDispatcher == null || b.schemaDispatcher == null || b.statsDispatcher == null) {
9494
dTemp = conn.createDispatcher();
@@ -132,7 +132,7 @@ private void addStatsContexts(Dispatcher dUser, Dispatcher dInternal) {
132132

133133
private Endpoint internalEndpoint(String discoveryName, String optionalServiceNameSegment, String optionalServiceIdSegment) {
134134
String subject = toDiscoverySubject(discoveryName, optionalServiceNameSegment, optionalServiceIdSegment);
135-
return new Endpoint(subject, subject, null, false);
135+
return new Endpoint(subject, subject, null, null, false);
136136
}
137137

138138
static String toDiscoverySubject(String discoveryName, String optionalServiceNameSegment, String optionalServiceIdSegment) {

src/main/java/io/nats/service/ServiceBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class ServiceBuilder {
1616
String name;
1717
String description;
1818
String version;
19+
Map<String, String> metadata;
1920
String apiUrl;
2021
final Map<String, ServiceEndpoint> serviceEndpoints = new HashMap<>();
2122
Duration drainTimeout = DEFAULT_DRAIN_TIMEOUT;
@@ -44,6 +45,11 @@ public ServiceBuilder version(String version) {
4445
return this;
4546
}
4647

48+
public ServiceBuilder metadata(Map<String, String> metadata) {
49+
this.metadata = metadata;
50+
return this;
51+
}
52+
4753
public ServiceBuilder apiUrl(String apiUrl) {
4854
this.apiUrl = apiUrl;
4955
return this;

0 commit comments

Comments
 (0)