package com.netifera.platform.net.dns.service.nameresolver;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.xbill.DNS.AAAARecord;
import org.xbill.DNS.ARecord;
import org.xbill.DNS.DClass;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.NSRecord;
import org.xbill.DNS.Name;
import org.xbill.DNS.PTRRecord;
import org.xbill.DNS.Record;
import org.xbill.DNS.ReverseMap;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Type;
import com.netifera.platform.net.dns.service.client.ExtendedResolver;
import com.netifera.platform.util.addresses.inet.InternetAddress;
public class NameResolver implements INameResolver {
protected ExtendedResolver resolver;
protected NameResolver() {}
public NameResolver(ExtendedResolver resolver) {
this.resolver = resolver;
}
public InternetAddress getAddressByName(String name) throws UnknownHostException {
Lookup lookup;
try {
lookup = new Lookup(name);
} catch (TextParseException e) {
throw new UnknownHostException("Malformed host name: "+ name);
}
lookup.setResolver(resolver);
lookup.setSearchPath((Name[])null);
Record[] records = lookup.run();
InternetAddress answer = null;
if(records != null)
for (Record record: records)
if (record instanceof ARecord)
return InternetAddress.fromInetAddress(((ARecord)record).getAddress());
else if (record instanceof AAAARecord)
answer = InternetAddress.fromInetAddress(((AAAARecord)record).getAddress());
if (answer != null) return answer;
throw new UnknownHostException(name);
}
public List<InternetAddress> getAddressesByName(String name) throws TextParseException, UnknownHostException {
List<InternetAddress> answer = new ArrayList<InternetAddress>();
getAddressesByName(answer, Type.A, name);
getAddressesByName(answer, Type.AAAA, name);
if (answer.isEmpty()) {
throw new UnknownHostException(name);
}
return answer;
}
private void getAddressesByName(List<InternetAddress> list, int type, String name) throws TextParseException {
Lookup lookup = new Lookup(name, type, DClass.IN);
lookup.setResolver(resolver);
lookup.setSearchPath((Name[])null);
Record[] records = lookup.run();
if (records != null) {
for (Record record: records) {
if (record instanceof ARecord)
list.add(InternetAddress.fromInetAddress(((ARecord)record).getAddress()));
else if (record instanceof AAAARecord)
list.add(InternetAddress.fromInetAddress(((AAAARecord)record).getAddress()));
}
}
}
public String getNameByAddress(InternetAddress address) throws UnknownHostException {
Name name = ReverseMap.fromAddress(address.toString());
Lookup lookup = new Lookup(name, Type.PTR, DClass.IN);
lookup.setResolver(resolver);
lookup.setSearchPath((Name[])null);
Record[] records = lookup.run();
if(records != null)
for (Record record: records)
if (record instanceof PTRRecord)
return ((PTRRecord)record).getName().toString();
throw new UnknownHostException(address.toString());
}
public List<String> getNamesByAddress(InternetAddress address) throws UnknownHostException {
Name name = ReverseMap.fromAddress(address.toString());
Lookup lookup = new Lookup(name, Type.PTR, DClass.IN);
lookup.setResolver(resolver);
lookup.setSearchPath((Name[])null);
Record [] records = lookup.run();
if (records == null)
return Collections.emptyList();
List<String> answer = new ArrayList<String>();
for (Record record: records)
if (record instanceof PTRRecord)
answer.add(((PTRRecord)record).getName().toString());
return answer;
}
public List<String> getNameServersForDomain(String domain) throws TextParseException {
Lookup lookup = new Lookup(Name.fromString(domain), Type.NS);
lookup.setResolver(resolver);
lookup.setSearchPath((Name[])null);
Record [] records = lookup.run();
List<String> answer = new ArrayList<String>();
if (records != null)
for (Record record: records)
if (record instanceof NSRecord)
answer.add(((NSRecord)record).getTarget().toString());
return answer;
}
public ExtendedResolver getExtendedResolver() {
return resolver;
}
public void shutdown() throws IOException {
resolver.shutdown();
}
}