package com.twilio.jwt.taskrouter; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.twilio.http.HttpMethod; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Map; @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class Policy { @JsonProperty("url") private final String url; @JsonProperty("method") private final HttpMethod method; @JsonProperty("query_filter") private final Map<String, FilterRequirement> queryFilter; @JsonProperty("post_filter") private final Map<String, FilterRequirement> postFilter; @JsonProperty("allow") private final boolean allowed; private Policy(Builder b) { this.url = b.url; this.method = b.method; this.queryFilter = b.queryFilter; this.postFilter = b.postFilter; this.allowed = b.allowed; } public String getUrl() { return url; } public HttpMethod getMethod() { return method; } public Map<String, FilterRequirement> getQueryFilter() { return queryFilter; } public Map<String, FilterRequirement> getPostFilter() { return postFilter; } public boolean isAllowed() { return allowed; } /** * Converts a resource to JSON. * * @return JSON representation of the resource * @throws IOException if unable to transform to JSON */ public String toJson() throws IOException { ObjectMapper mapper = new ObjectMapper(); ByteArrayOutputStream out = new ByteArrayOutputStream(); mapper.writeValue(out, this); return out.toString(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Policy policy = (Policy) o; return allowed == policy.allowed && method == policy.method && Objects.equal(url, policy.url) && Objects.equal(queryFilter, policy.queryFilter) && Objects.equal(postFilter, policy.postFilter); } @Override public int hashCode() { return Objects.hashCode(url, method, queryFilter, postFilter, allowed); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("url", url) .add("method", method) .add("queryFilter", queryFilter) .add("postFilter", postFilter) .add("allowed", allowed) .toString(); } public static class Builder { private String url; private HttpMethod method = HttpMethod.GET; private Map<String, FilterRequirement> queryFilter; private Map<String, FilterRequirement> postFilter; private boolean allowed = true; public Builder url(String url) { this.url = url; return this; } public Builder method(HttpMethod method) { this.method = method; return this; } public Builder queryFilter(Map<String, FilterRequirement> queryFilter) { this.queryFilter = queryFilter; return this; } public Builder postFilter(Map<String, FilterRequirement> postFilter) { this.postFilter = postFilter; return this; } public Builder allowed(boolean allowed) { this.allowed = allowed; return this; } public Policy build() { return new Policy(this); } } }