software.amazon.awssdk.services.cleanrooms.endpoints.internal.Value Maven / Gradle / Ivy
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
package software.amazon.awssdk.services.cleanrooms.endpoints.internal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
/**
* Base class for the types of values computable by the {@link RuleEngine}.
*/
@SdkInternalApi
public abstract class Value {
public boolean isNone() {
return false;
}
public String expectString() {
throw new RuntimeException("Expected string but was: " + this);
}
public boolean expectBool() {
throw new RuntimeException("Expected bool but was: " + this);
}
public Record expectRecord() {
throw new RuntimeException("Expected object but was: " + this);
}
public Endpoint expectEndpoint() {
throw new RuntimeException("Expected endpoint, found " + this);
}
public Array expectArray() {
throw new RuntimeException("Expected array, found " + this);
}
public int expectInt() {
throw new RuntimeException("Expected int, found " + this);
}
public static Value fromNode(JsonNode node) {
if (node.isArray()) {
return new Array(node.asArray().stream().map(Value::fromNode).collect(Collectors.toList()));
} else if (node.isBoolean()) {
return fromBool(node.asBoolean());
} else if (node.isNull()) {
throw SdkClientException.create("null cannot be used as a literal");
} else if (node.isNumber()) {
return fromInteger(Integer.parseInt(node.asNumber()));
} else if (node.isObject()) {
HashMap out = new HashMap<>();
node.asObject().forEach((k, v) -> out.put(Identifier.of(k), fromNode(v)));
return fromRecord(out);
} else if (node.isString()) {
return fromStr(node.asString());
}
throw SdkClientException.create("Unable to create Value from " + node);
}
public static Endpoint endpointFromNode(JsonNode source) {
return Endpoint.fromNode(source);
}
/**
* A string value.
*/
public static class Str extends Value {
private final String value;
private Str(String value) {
this.value = value;
}
@Override
public String expectString() {
return value;
}
@Override
public String toString() {
return "Str{" + "value='" + value + '\'' + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Str str = (Str) o;
return value != null ? value.equals(str.value) : str.value == null;
}
@Override
public int hashCode() {
return value != null ? value.hashCode() : 0;
}
}
/**
* An integer value.
*/
public static class Int extends Value {
private final int value;
private Int(int value) {
this.value = value;
}
@Override
public int expectInt() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Int anInt = (Int) o;
return value == anInt.value;
}
@Override
public int hashCode() {
return value;
}
}
/**
* A boolean value.
*/
public static class Bool extends Value {
private final boolean value;
private Bool(boolean value) {
this.value = value;
}
@Override
public boolean expectBool() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Bool bool = (Bool) o;
return value == bool.value;
}
@Override
public int hashCode() {
return value ? 1 : 0;
}
}
/**
* An array value.
*/
public static class Array extends Value {
private List inner;
private Array(List inner) {
this.inner = inner;
}
@Override
public Array expectArray() {
return this;
}
public Value get(int idx) {
if (this.inner.size() > idx) {
return this.inner.get(idx);
} else {
return new Value.None();
}
}
public int size() {
return inner.size();
}
@Override
public String toString() {
return "Array{" + "inner=" + inner + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Array array = (Array) o;
return inner != null ? inner.equals(array.inner) : array.inner == null;
}
@Override
public int hashCode() {
return inner != null ? inner.hashCode() : 0;
}
}
/**
* A record (map) value.
*/
public static class Record extends Value {
private final Map value;
private Record(Map value) {
this.value = value;
}
public Value get(Identifier id) {
return value.get(id);
}
public Map getValue() {
return value;
}
public void forEach(BiConsumer fn) {
value.forEach(fn);
}
@Override
public Record expectRecord() {
return this;
}
@Override
public String toString() {
return "Record{" + "value=" + value + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Record record = (Record) o;
return value != null ? value.equals(record.value) : record.value == null;
}
@Override
public int hashCode() {
return value != null ? value.hashCode() : 0;
}
}
public static class Endpoint extends Value {
private static final String URL = "url";
private static final String PROPERTIES = "properties";
private static final String HEADERS = "headers";
private final String url;
private final Map properties;
private final Map> headers;
private Endpoint(Builder b) {
this.url = b.url;
this.properties = b.properties;
this.headers = b.headers;
}
public String getUrl() {
return url;
}
public Map getProperties() {
return properties;
}
public Map> getHeaders() {
return headers;
}
@Override
public Endpoint expectEndpoint() {
return this;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Endpoint endpoint = (Endpoint) o;
if (url != null ? !url.equals(endpoint.url) : endpoint.url != null) {
return false;
}
if (properties != null ? !properties.equals(endpoint.properties) : endpoint.properties != null) {
return false;
}
return headers != null ? headers.equals(endpoint.headers) : endpoint.headers == null;
}
@Override
public int hashCode() {
int result = url != null ? url.hashCode() : 0;
result = 31 * result + (properties != null ? properties.hashCode() : 0);
result = 31 * result + (headers != null ? headers.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Endpoint{" + "url='" + url + '\'' + ", properties=" + properties + ", headers=" + headers + '}';
}
public static Endpoint fromNode(JsonNode node) {
Builder b = builder();
Map objNode = node.asObject();
b.url(objNode.get(URL).asString());
JsonNode propertiesNode = objNode.get(PROPERTIES);
if (propertiesNode != null) {
propertiesNode.asObject().forEach((k, v) -> {
b.property(k, Value.fromNode(v));
});
}
JsonNode headersNode = objNode.get(HEADERS);
if (headersNode != null) {
headersNode.asObject().forEach((k, v) -> v.asArray().forEach(e -> b.addHeader(k, e.asString())));
}
return b.build();
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private String url;
private final Map properties = new HashMap<>();
private final Map> headers = new HashMap<>();
public Builder url(String url) {
this.url = url;
return this;
}
public Builder properties(Map properties) {
this.properties.clear();
this.properties.putAll(properties);
return this;
}
public Builder property(String name, Value value) {
this.properties.put(name, value);
return this;
}
public Builder addHeader(String name, String value) {
List values = this.headers.computeIfAbsent(name, (k) -> new ArrayList<>());
values.add(value);
return this;
}
public Endpoint build() {
return new Endpoint(this);
}
}
}
public static class None extends Value {
@Override
public boolean isNone() {
return true;
}
}
public static Str fromStr(String value) {
return new Str(value);
}
public static Int fromInteger(int value) {
return new Int(value);
}
public static Bool fromBool(boolean value) {
return new Bool(value);
}
public static Array fromArray(List value) {
return new Array(value);
}
public static Record fromRecord(Map value) {
return new Record(value);
}
public static None none() {
return new None();
}
}