import java.util.Arrays;
import java.util.Collections;
import java.util.Hashtable;
import java.util.stream.Collectors;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class Test {
    public static void main(String args[]) {
        DirContext ctx = null;
        Hashtable<String, Object> env = new Hashtable<>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
        env.put(Context.PROVIDER_URL, String.format("dns://%s", args[0]));
        String[] ipv4Types = { "A" };
        String[] ipv6Types = { "AAAA" };
        String[] allTypes = { "A", "AAAA" };

        try {
            ctx = new InitialDirContext(env);
            printDnsRecords(ctx, args[1], ipv4Types);
            printDnsRecords(ctx, args[1], ipv6Types);
            printDnsRecords(ctx, args[1], allTypes);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (Exception exx) {
                    exx.printStackTrace();
                }
            }
        }
    }

    public static void printDnsRecords(DirContext ctx, String fqdn, String[] recordTypes) throws NamingException {
        System.out.println(String.format("Querying record types: %s", Arrays.asList(recordTypes)));
        Attributes result = ctx.getAttributes(fqdn, recordTypes);
        if (result != null) {
            for (String recordType : recordTypes) {
                Attribute records = result.get(recordType);
                if (records != null) {
                    System.out.println(String.format("Received addresses: %s",
                            Collections.list(records.getAll()).stream().map(Object::toString).collect(Collectors.joining(" "))));
                } else {
                    System.out.println(String.format("No %s records received", recordType));
                }
            }
        } else {
            System.out.println("Null received from context");
        }
    }
}
