package com.hubspot.baragon.models; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; @JsonIgnoreProperties(ignoreUnknown = true) public class BaragonService { @NotNull @Pattern(regexp = "[^\\s/|]+", message = "cannot contain whitespace, '/', or '|'", flags = Pattern.Flag.MULTILINE) private final String serviceId; @NotNull private final Collection<String> owners; @NotNull private final String serviceBasePath; private final List<String> additionalPaths; @NotNull @Size(min=1) private final Set<String> loadBalancerGroups; private final Map<String, Object> options; private final Optional<String> templateName; private final Set<String> domains; public BaragonService(@JsonProperty("serviceId") String serviceId, @JsonProperty("owners") Collection<String> owners, @JsonProperty("serviceBasePath") String serviceBasePath, @JsonProperty("additionalPaths") List<String> additionalPaths, @JsonProperty("loadBalancerGroups") Set<String> loadBalancerGroups, @JsonProperty("options") Map<String, Object> options, @JsonProperty("templateName") Optional<String> templateName, @JsonProperty("domains") Set<String> domains) { this.serviceId = serviceId; this.owners = owners; this.serviceBasePath = serviceBasePath; this.additionalPaths = MoreObjects.firstNonNull(additionalPaths, Collections.<String> emptyList()); this.loadBalancerGroups = loadBalancerGroups; this.options = options; this.templateName = templateName; this.domains = MoreObjects.firstNonNull(domains, Collections.<String>emptySet()); } public BaragonService(String serviceId, Collection<String> owners, String serviceBasePath, List<String> additionalPaths, Set<String> loadBalancerGroups, Map<String, Object> options, Optional<String> templateName) { this(serviceId, owners, serviceBasePath, additionalPaths, loadBalancerGroups, options, templateName, Collections.<String>emptySet()); } public BaragonService(String serviceId, Collection<String> owners, String serviceBasePath, Set<String> loadBalancerGroups, Map<String, Object> options) { this(serviceId, owners, serviceBasePath, Collections.<String>emptyList(), loadBalancerGroups, options, Optional.<String>absent(), Collections.<String>emptySet()); } public String getServiceId() { return serviceId; } public Collection<String> getOwners() { return owners; } public String getServiceBasePath() { return serviceBasePath; } public List<String> getAdditionalPaths() { return additionalPaths; } public Set<String> getLoadBalancerGroups() { return loadBalancerGroups; } public Map<String, Object> getOptions() { return options; } public Optional<String> getTemplateName() { return templateName; } public Set<String> getDomains() { return domains; } @JsonIgnore public List<String> getAllPaths() { List<String> allPaths = new ArrayList<>(); for (String path : additionalPaths) { if (!domains.isEmpty()) { for (String domain : domains) { allPaths.add(String.format("%s%s", domain, path)); } } else { allPaths.add(path); } } if (!domains.isEmpty()) { for (String domain : domains) { allPaths.add(String.format("%s%s", domain, serviceBasePath)); } } else { allPaths.add(serviceBasePath); } return allPaths; } @Override public String toString() { return "BaragonService [" + "serviceId='" + serviceId + '\'' + ", owners=" + owners + ", serviceBasePath='" + serviceBasePath + '\'' + ", loadBalancerGroups=" + loadBalancerGroups + ", options=" + options + ", templateName=" + templateName + ", domains=" + domains + ']'; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } BaragonService service = (BaragonService) o; if (loadBalancerGroups != null ? !loadBalancerGroups.equals(service.loadBalancerGroups) : service.loadBalancerGroups != null) { return false; } if (options != null ? !options.equals(service.options) : service.options != null) { return false; } if (owners != null ? !owners.equals(service.owners) : service.owners != null) { return false; } if (serviceBasePath != null ? !serviceBasePath.equals(service.serviceBasePath) : service.serviceBasePath != null) { return false; } if (additionalPaths != null ? !additionalPaths.equals(service.additionalPaths) : service.additionalPaths != null) { return false; } if (serviceId != null ? !serviceId.equals(service.serviceId) : service.serviceId != null) { return false; } if (templateName != null ? !templateName.equals(service.templateName) : service.templateName != null) { return false; } if (domains != null ? !domains.equals(service.domains) : service.domains != null) { return false; } return true; } @Override public int hashCode() { int result = serviceId != null ? serviceId.hashCode() : 0; result = 31 * result + (owners != null ? owners.hashCode() : 0); result = 31 * result + (serviceBasePath != null ? serviceBasePath.hashCode() : 0); result = 31 * result + (additionalPaths != null ? additionalPaths.hashCode() : 0); result = 31 * result + (loadBalancerGroups != null ? loadBalancerGroups.hashCode() : 0); result = 31 * result + (options != null ? options.hashCode() : 0); result = 31 * result + (templateName != null ? templateName.hashCode() : 0); result = 31 * result + (domains != null ? domains.hashCode() : 0); return result; } }