package denominator;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import static denominator.common.Preconditions.checkArgument;
import static java.util.Arrays.asList;
/**
* base implementation of {@link Provider}, which sets defaults and properly implements {@code
* equals} and {@code hashCode}.
*/
public abstract class BasicProvider implements Provider {
/**
* if we choose to support numbers, this will need to be updated
*/
private static Pattern lowerCamel = Pattern.compile("^[a-z0-9]+([A-Z][a-z]+)*$");
// protected to ensure subclassed
protected BasicProvider() {
checkLowerCamel(credentialTypeToParameterNames());
}
private void checkLowerCamel(Map<String, Collection<String>> credentialTypeToParameterNames) {
for (String credentialType : credentialTypeToParameterNames.keySet()) {
for (String credentialParam : credentialTypeToParameterNames.get(credentialType)) {
checkArgument(lowerCamel.matcher(credentialType).matches(),
"please correct credential type %s to lowerCamel case", credentialType);
checkArgument(lowerCamel.matcher(credentialParam).matches(),
"please correct %s credential parameter %s to lowerCamel case",
credentialType, credentialParam);
}
}
}
@Override
public String name() {
return getClass().getSimpleName().toLowerCase().replace("provider", "");
}
@Override
public String url() {
return "mem:" + name();
}
@Override
public Set<String> basicRecordTypes() {
Set<String> result = new LinkedHashSet<String>();
result.addAll(asList("A", "AAAA", "CERT", "CNAME", "MX", "NAPTR", "NS", "PTR", "SOA", "SPF",
"SRV", "SSHFP", "TXT"));
return result;
}
@Override
public Map<String, Collection<String>> profileToRecordTypes() {
Map<String, Collection<String>> result = new LinkedHashMap<String, Collection<String>>();
List<String> roundRobin = asList("A", "AAAA", "MX", "NS", "PTR", "SPF", "SRV", "SSHFP", "TXT");
result.put("roundRobin", roundRobin);
return result;
}
@Override
public boolean supportsDuplicateZoneNames() {
return false;
}
@Override
public Map<String, Collection<String>> credentialTypeToParameterNames() {
return new LinkedHashMap<String, Collection<String>>();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Provider) {
Provider other = (Provider) obj;
return name().equals(other.name())
&& url().equals(other.url());
}
return false;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name().hashCode();
result = 31 * result + url().hashCode();
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Provider [");
builder.append("name=").append(name());
builder.append("url=").append(url());
builder.append("]");
return builder.toString();
}
}