Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/io/nats/client/support/ApiConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ public interface ApiConstants {
String MEMORY_MAX_STREAM_BYTES = "memory_max_stream_bytes";
String MESSAGE = "message";
String MESSAGES = "messages";
String METADATA = "metadata";
String MTIME = "mtime";
String MIRROR = "mirror";
String MSGS = "msgs";
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/io/nats/client/support/JsonUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import static io.nats.client.support.DateTimeUtils.DEFAULT_TIME;
import static io.nats.client.support.Encoding.jsonDecode;
import static io.nats.client.support.Encoding.jsonEncode;
import static io.nats.client.support.JsonValueUtils.instance;
import static io.nats.client.support.NatsConstants.COLON;

/**
Expand Down Expand Up @@ -261,6 +262,12 @@ public static void addField(StringBuilder sb, String fname, JsonSerializable val
}
}

public static void addField(StringBuilder sb, String fname, Map<String, String> map) {
if (map != null && map.size() > 0) {
addField(sb, fname, instance(map));
}
}

interface ListAdder<T> {
void append(StringBuilder sb, T t);
}
Expand Down Expand Up @@ -927,4 +934,19 @@ public static void readNanos(String json, Pattern pattern, Consumer<Duration> c)
c.accept(Duration.ofNanos(Long.parseLong(m.group(1))));
}
}

public static boolean mapEquals(Map<String, String> map1, Map<String, String> map2) {
if (map1 == null) {
return map2 == null;
}
if (map2 == null || map1.size() != map2.size()) {
return false;
}
for (String key : map1.keySet()) {
if (!Objects.equals(map1.get(key), map2.get(key))) {
return false;
}
}
return true;
}
}
24 changes: 19 additions & 5 deletions src/main/java/io/nats/client/support/JsonValueUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
import java.util.*;
import java.util.function.Function;

import static io.nats.client.support.JsonValue.EMPTY_ARRAY;
import static io.nats.client.support.JsonValue.EMPTY_MAP;
import static io.nats.client.support.JsonValue.*;

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

public static Map<String, String> readStringStringMap(JsonValue jv, String key) {
JsonValue o = readObject(jv, key);
if (o.type == Type.MAP && o.map.size() > 0) {
Map<String, String> temp = new HashMap<>();
for (String k : o.map.keySet()) {
String value = readString(o, k);
if (value != null) {
temp.put(k, value);
}
}
return temp.isEmpty() ? null : temp;
}
return null;
}

public static String readString(JsonValue jsonValue, String key) {
return read(jsonValue, key, v -> v == null ? null : v.string);
}
Expand Down Expand Up @@ -220,7 +234,7 @@ public static JsonValue instance(Map map) {

public static JsonValue toJsonValue(Object o) {
if (o == null) {
return JsonValue.NULL;
return NULL;
}
if (o instanceof JsonValue) {
return (JsonValue)o;
Expand Down Expand Up @@ -272,7 +286,7 @@ public static class MapBuilder {

public MapBuilder put(String s, Object o) {
JsonValue vv = JsonValueUtils.toJsonValue(o);
if (vv.type != JsonValue.Type.NULL) {
if (vv.type != Type.NULL) {
jv.map.put(s, vv);
}
return this;
Expand All @@ -291,7 +305,7 @@ public static class ArrayBuilder {
public JsonValue jv = new JsonValue(new ArrayList<>());
public ArrayBuilder add(Object o) {
JsonValue vv = JsonValueUtils.toJsonValue(o);
if (vv.type != JsonValue.Type.NULL) {
if (vv.type != Type.NULL) {
jv.array.add(JsonValueUtils.toJsonValue(o));
}
return this;
Expand Down
40 changes: 28 additions & 12 deletions src/main/java/io/nats/service/Endpoint.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
import io.nats.client.support.JsonUtils;
import io.nats.client.support.JsonValue;

import java.util.Map;
import java.util.Objects;

import static io.nats.client.support.ApiConstants.*;
import static io.nats.client.support.JsonUtils.endJson;
import static io.nats.client.support.JsonValueUtils.readString;
import static io.nats.client.support.JsonValueUtils.readValue;
import static io.nats.client.support.JsonValueUtils.*;
import static io.nats.client.support.Validator.validateIsRestrictedTerm;
import static io.nats.client.support.Validator.validateSubject;

Expand All @@ -33,25 +33,26 @@ public class Endpoint implements JsonSerializable {
private final String name;
private final String subject;
private final Schema schema;
private final Map<String, String> metadata;

public Endpoint(String name, String subject, Schema schema) {
this(name, subject, schema, true);
this(name, subject, schema, null, true);
}

public Endpoint(String name) {
this(name, null, null, true);
this(name, null, null, null, true);
}

public Endpoint(String name, String subject) {
this(name, subject, null, true);
this(name, subject, null, null, true);
}

public Endpoint(String name, String subject, String schemaRequest, String schemaResponse) {
this(name, subject, Schema.optionalInstance(schemaRequest, schemaResponse), true);
this(name, subject, Schema.optionalInstance(schemaRequest, schemaResponse), null, true);
}

// internal use constructors
Endpoint(String name, String subject, Schema schema, boolean validate) {
Endpoint(String name, String subject, Schema schema, Map<String, String> metadata, boolean validate) {
if (validate) {
this.name = validateIsRestrictedTerm(name, "Endpoint Name", true);
if (subject == null) {
Expand All @@ -66,16 +67,18 @@ public Endpoint(String name, String subject, String schemaRequest, String schema
this.subject = subject;
}
this.schema = schema;
this.metadata = metadata == null || metadata.size() == 0 ? null : metadata;
}

Endpoint(JsonValue vEndpoint) {
name = readString(vEndpoint, NAME);
subject = readString(vEndpoint, SUBJECT);
schema = Schema.optionalInstance(readValue(vEndpoint, SCHEMA));
metadata = readStringStringMap(vEndpoint, METADATA);
}

Endpoint(Builder b) {
this(b.name, b.subject, Schema.optionalInstance(b.schemaRequest, b.schemaResponse));
this(b.name, b.subject, Schema.optionalInstance(b.schemaRequest, b.schemaResponse), b.metadata, true);
}

@Override
Expand All @@ -84,6 +87,7 @@ public String toJson() {
JsonUtils.addField(sb, NAME, name);
JsonUtils.addField(sb, SUBJECT, subject);
JsonUtils.addField(sb, SCHEMA, schema);
JsonUtils.addField(sb, METADATA, metadata);
return endJson(sb).toString();
}

Expand All @@ -104,6 +108,10 @@ public Schema getSchema() {
return schema;
}

public Map<String, String> getMetadata() {
return metadata;
}

public static Builder builder() {
return new Builder();
}
Expand All @@ -113,6 +121,7 @@ public static class Builder {
private String subject;
private String schemaRequest;
private String schemaResponse;
private Map<String, String> metadata;

public Builder endpoint(Endpoint endpoint) {
name = endpoint.getName();
Expand Down Expand Up @@ -161,6 +170,11 @@ public Builder schema(Schema schema) {
return this;
}

public Builder metadata(Map<String, String> metadata) {
this.metadata = metadata;
return this;
}

public Endpoint build() {
return new Endpoint(this);
}
Expand All @@ -171,18 +185,20 @@ public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Endpoint endpoint = (Endpoint) o;
Endpoint that = (Endpoint) o;

if (!Objects.equals(name, endpoint.name)) return false;
if (!Objects.equals(subject, endpoint.subject)) return false;
return Objects.equals(schema, endpoint.schema);
if (!Objects.equals(name, that.name)) return false;
if (!Objects.equals(subject, that.subject)) return false;
if (!Objects.equals(schema, that.schema)) return false;
return JsonUtils.mapEquals(metadata, that.metadata);
}

@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (subject != null ? subject.hashCode() : 0);
result = 31 * result + (schema != null ? schema.hashCode() : 0);
result = 31 * result + (metadata != null ? metadata.hashCode() : 0);
return result;
}
}
5 changes: 3 additions & 2 deletions src/main/java/io/nats/service/InfoResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.nats.client.support.JsonValue;

import java.util.List;
import java.util.Map;
import java.util.Objects;

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

public InfoResponse(String id, String name, String version, String description, List<String> subjects) {
super(TYPE, id, name, version);
public InfoResponse(String id, String name, String version, Map<String, String> metadata, String description, List<String> subjects) {
super(TYPE, id, name, version, metadata);
this.description = description;
this.subjects = subjects;
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/io/nats/service/PingResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@

package io.nats.service;

import java.util.Map;

/**
* SERVICE IS AN EXPERIMENTAL API SUBJECT TO CHANGE
*/
public class PingResponse extends ServiceResponse {
public static final String TYPE = "io.nats.micro.v1.ping_response";

public PingResponse(String id, String name, String version) {
super(TYPE, id, name, version);
public PingResponse(String id, String name, String version, Map<String, String> metadata) {
super(TYPE, id, name, version, metadata);
}

public PingResponse(byte[] jsonBytes) {
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/io/nats/service/SchemaResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.nats.client.support.JsonValue;

import java.util.List;
import java.util.Map;
import java.util.Objects;

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

public SchemaResponse(String id, String name, String version, String apiUrl, List<EndpointResponse> endpoints) {
super(TYPE, id, name, version);
public SchemaResponse(String id, String name, String version, Map<String, String> metadata, String apiUrl, List<EndpointResponse> endpoints) {
super(TYPE, id, name, version, metadata);
this.apiUrl = apiUrl;
this.endpoints = endpoints;
}
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/io/nats/service/Service.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ public class Service {
}

// build static responses
pingResponse = new PingResponse(id, b.name, b.version);
infoResponse = new InfoResponse(id, b.name, b.version, b.description, infoSubjects);
schemaResponse = new SchemaResponse(id, b.name, b.version, b.apiUrl, schemaEndpoints);
pingResponse = new PingResponse(id, b.name, b.version, b.metadata);
infoResponse = new InfoResponse(id, b.name, b.version, b.metadata, b.description, infoSubjects);
schemaResponse = new SchemaResponse(id, b.name, b.version, b.metadata, b.apiUrl, schemaEndpoints);

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

private Endpoint internalEndpoint(String discoveryName, String optionalServiceNameSegment, String optionalServiceIdSegment) {
String subject = toDiscoverySubject(discoveryName, optionalServiceNameSegment, optionalServiceIdSegment);
return new Endpoint(subject, subject, null, false);
return new Endpoint(subject, subject, null, null, false);
}

static String toDiscoverySubject(String discoveryName, String optionalServiceNameSegment, String optionalServiceIdSegment) {
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/io/nats/service/ServiceBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class ServiceBuilder {
String name;
String description;
String version;
Map<String, String> metadata;
String apiUrl;
final Map<String, ServiceEndpoint> serviceEndpoints = new HashMap<>();
Duration drainTimeout = DEFAULT_DRAIN_TIMEOUT;
Expand Down Expand Up @@ -44,6 +45,11 @@ public ServiceBuilder version(String version) {
return this;
}

public ServiceBuilder metadata(Map<String, String> metadata) {
this.metadata = metadata;
return this;
}

public ServiceBuilder apiUrl(String apiUrl) {
this.apiUrl = apiUrl;
return this;
Expand Down
Loading