public static ResponseType lookup(SetResponse sr) { if (sr.isCNAME()) { return CNAME; } else if (sr.isDelegation()) { return DELEGATION; } else if (sr.isDNAME()) { return DNAME; } else if (sr.isNXDOMAIN()) { return NXDOMAIN; } else if (sr.isNXRRSET()) { return NXRRSET; } else if (sr.isSuccessful()) { return SUCCESSFUL; } else { return UNKNOWN; } }
@Override public DnsResponse lookupRecords(final Record query) { final Name name = query.getName(); final int type = query.getType(); final Cache cache = new Cache(); Lookup aLookup = new Lookup(name, type); aLookup.setCache(cache); Record[] found = aLookup.run(); List<Record> queriedrrs = Arrays.asList(found != null ? found : new Record[] {}); List<Name> cnames = (List<Name>) (aLookup.getAliases().length > 0 ? Arrays.asList(aLookup.getAliases()) : Lists.newArrayList()); List<Record> answer = Lists.newArrayList(); List<Record> authority = Lists.newArrayList(); List<Record> additional = Lists.newArrayList(); for (Name cnameRec : cnames) { SetResponse sr = cache.lookupRecords(cnameRec, Type.CNAME, Credibility.ANY); if (sr != null && sr.isSuccessful() && sr.answers() != null) { for (RRset result : sr.answers()) { Iterator rrs = result.rrs(false); if (rrs != null) { for (Object record : ImmutableSet.copyOf(rrs)) { answer.add((Record) record); } } } } } for (Record queriedRec : queriedrrs) { SetResponse sr = cache.lookupRecords(queriedRec.getName(), queriedRec.getType(), Credibility.ANY); if (sr != null && sr.isSuccessful() && sr.answers() != null) { for (RRset result : sr.answers()) { Iterator rrs = result.rrs(false); if (rrs != null) { for (Object record : ImmutableSet.copyOf(rrs)) { answer.add((Record) record); } } } } } for (Record aRec : queriedrrs) { List<Record> nsRecs = lookupNSRecords(aRec.getName(), cache); for (Record nsRec : nsRecs) { authority.add(nsRec); Lookup nsLookup = new Lookup(((NSRecord) nsRec).getTarget(), Type.A); nsLookup.setCache(cache); Record[] nsAnswers = nsLookup.run(); if (nsAnswers != null) { additional.addAll(Arrays.asList(nsAnswers)); } } } return DnsResponse.forName(query.getName()) .recursive() .withAuthority(authority) .withAdditional(additional) .answer(answer); }