package denominator.dynect; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import denominator.dynect.DynECT.Record; import denominator.model.rdata.AAAAData; import denominator.model.rdata.AData; import denominator.model.rdata.CERTData; import denominator.model.rdata.CNAMEData; import denominator.model.rdata.MXData; import denominator.model.rdata.NSData; import denominator.model.rdata.PTRData; import denominator.model.rdata.SOAData; import denominator.model.rdata.SPFData; import denominator.model.rdata.SRVData; import denominator.model.rdata.TXTData; enum ToRecord { INSTANCE; static Map<String, Object> toRData(String type, JsonObject rdata) { if ("A".equals(type)) { return AData.create(rdata.get("address").getAsString()); } else if ("AAAA".equals(type)) { return AAAAData.create(rdata.get("address").getAsString()); } else if ("CNAME".equals(type)) { return CNAMEData.create(rdata.get("cname").getAsString()); } else if ("MX".equals(type)) { int preference = rdata.get("preference").getAsInt(); String exchange = rdata.get("exchange").getAsString(); return MXData.create(preference, exchange); } else if ("NS".equals(type)) { return NSData.create(rdata.get("nsdname").getAsString()); } else if ("PTR".equals(type)) { return PTRData.create(rdata.get("ptrdname").getAsString()); } else if ("SOA".equals(type)) { return SOAData.builder() .rname(rdata.get("rname").getAsString()) .retry(rdata.get("retry").getAsInt()) .mname(rdata.get("mname").getAsString()) .minimum(rdata.get("minimum").getAsInt()) .refresh(rdata.get("refresh").getAsInt()) .expire(rdata.get("expire").getAsInt()) .serial(rdata.get("serial").getAsInt()) .build(); } else if ("SPF".equals(type)) { return SPFData.create(rdata.get("txtdata").getAsString()); } else if ("SRV".equals(type)) { return SRVData.builder() .priority(rdata.get("priority").getAsInt()) .weight(rdata.get("weight").getAsInt()) .port(rdata.get("port").getAsInt()) .target(rdata.get("target").getAsString()) .build(); } else if ("TXT".equals(type)) { return TXTData.create(rdata.get("txtdata").getAsString()); } else if ("CERT".equals(type)) { return CERTData.builder() .format(rdata.get("format").getAsInt()) .tag(rdata.get("tag").getAsInt()) .algorithm(rdata.get("algorithm").getAsInt()) .certificate(rdata.get("certificate").getAsString()).build(); } else { Map<String, Object> builder = new LinkedHashMap<String, Object>(); for (Entry<String, JsonElement> entry : rdata.entrySet()) { // values are never nested JsonPrimitive value = entry.getValue().getAsJsonPrimitive(); if (value.isNumber()) { builder.put(entry.getKey(), value.getAsInt()); } else { builder.put(entry.getKey(), value.getAsString()); } } return builder; } } public Record apply(JsonElement element) { JsonObject current = element.getAsJsonObject(); Record record = new Record(); record.id = current.get("record_id").getAsLong(); record.serviceClass = current.has("service_class") ? current.get("service_class").getAsString() : null; record.name = current.get("fqdn").getAsString(); record.type = current.get("record_type").getAsString(); record.ttl = current.get("ttl").getAsInt(); record.rdata = toRData(record.type, current.get("rdata").getAsJsonObject()); return record; } }