public class IP
{
	static public void main(String[] args) throws Exception
	{
		System.out.println("java.net.InetAddress\n");

		try
		{
			System.out.println("Java finds " + "dylan.dk" + " is at " + java.net.InetAddress.getByName("dylan.dk"));
			System.out.println("Java finds Host Name " + java.net.InetAddress.getByName("dylan.dk").getHostName());
		}
		catch (java.net.UnknownHostException uhe)
		{
			System.err.println("Cannot resolve address for " + "dylan.dk" + ": " + uhe.getMessage());
		}

		String[] nsServers = org.xbill.DNS.FindServer.servers();

		System.out.println("\n\ndnsjava -- default resolver using { " + toString(nsServers) + " } \n");

		try
		{
			System.out.println("dnsjava finds " + "dylan.dk" + " is at " + org.xbill.DNS.Address.getByName("dylan.dk"));
			System.out.println("dnsjava finds Host Name " + org.xbill.DNS.Address.getByName("dylan.dk").getHostName());
		}
		catch (java.net.UnknownHostException uhe)
		{
			System.err.println("Cannot resolve address for " + "dylan.dk" + ": " + uhe.getMessage());
		}

		try
		{
			org.xbill.DNS.Record[] records = new org.xbill.DNS.Lookup("dylan.dk", org.xbill.DNS.Type.MX).run();
			org.xbill.DNS.MXRecord mx = (org.xbill.DNS.MXRecord) records[0];
			System.out.println("MX = " + mx.getTarget ().toString ());
			System.out.println("dnsjava says A(MX) = " + org.xbill.DNS.Address.getByName(mx.getTarget ().toString ()));
			System.out.println("Java says A(MX) = " + java.net.InetAddress.getByName(mx.getTarget ().toString ()));
		}
		catch (Exception e)
		{
			System.err.println(e.getMessage());
		}

		nsServers = new String[] { "ns3.inet.tele.dk" , "ns3.tele.dk" };

		try
		{
			org.xbill.DNS.Lookup.setDefaultResolver(new org.xbill.DNS.ExtendedResolver(nsServers));
			
		}
		catch (Exception e)
		{
			System.err.println(e.getMessage());
		}

		System.out.println("\n\ndnsjava -- extended resolver using { " + toString(nsServers) + " } \n");

		try
		{
			System.out.println("dnsjava finds " + "dylan.dk" + " is at " + org.xbill.DNS.Address.getByName("dylan.dk"));
			System.out.println("dnsjava finds Host Name " + org.xbill.DNS.Address.getByName("dylan.dk").getHostName());
		}
		catch (java.net.UnknownHostException uhe)
		{
			System.err.println("Cannot resolve address for " + "dylan.dk" + ": " + uhe.getMessage());
		}

		try
		{
			org.xbill.DNS.Record[] records = new org.xbill.DNS.Lookup("dylan.dk", org.xbill.DNS.Type.MX).run();
			org.xbill.DNS.MXRecord mx = (org.xbill.DNS.MXRecord) records[0];
			System.out.println("MX = " + mx.getTarget ().toString ());
			System.out.println("dnsjava says A(MX) = " + org.xbill.DNS.Address.getByName(mx.getTarget ().toString ()));
			System.out.println("Java says A(MX) = " + java.net.InetAddress.getByName(mx.getTarget ().toString ()));
		}
		catch (Exception e)
		{
			System.err.println(e.getMessage());
		}

		nsServers = new String[] { "antenna.nl" , "sun.inform.dk" };

		try
		{
			org.xbill.DNS.Lookup.setDefaultResolver(new org.xbill.DNS.ExtendedResolver(nsServers));

		}
		catch (Exception e)
		{
			System.err.println(e.getMessage());
		}

		System.out.println("\n\ndnsjava -- extended resolver using { " + toString(nsServers) + " } \n");

		try
		{
			System.out.println("dnsjava finds " + "dylan.dk" + " is at " + org.xbill.DNS.Address.getByName("dylan.dk"));
			System.out.println("dnsjava finds Host Name " + org.xbill.DNS.Address.getByName("dylan.dk").getHostName());
		}
		catch (java.net.UnknownHostException uhe)
		{
			System.err.println("Cannot resolve address for " + "dylan.dk" + ": " + uhe.getMessage());
		}

		try
		{
			org.xbill.DNS.Record[] records = new org.xbill.DNS.Lookup("dylan.dk", org.xbill.DNS.Type.MX).run();
			org.xbill.DNS.MXRecord mx = (org.xbill.DNS.MXRecord) records[0];
			System.out.println("MX = " + mx.getTarget ().toString ());
			System.out.println("dnsjava says A(MX) = " + org.xbill.DNS.Address.getByName(mx.getTarget ().toString ()));
			System.out.println("Java says A(MX) = " + java.net.InetAddress.getByName(mx.getTarget ().toString ()));
		}
		catch (Exception e)
		{
			System.err.println(e.getMessage());
		}

		System.out.println("\n\nJNDI -- Sun DNS name service\n");

		try
		{
			javax.naming.directory.DirContext ictx = new javax.naming.directory.InitialDirContext();
			javax.naming.directory.Attributes attrs = ictx.getAttributes("dns://antenna.nl/dylan.dk");
			System.out.println("\nantenna.nl reports:");
			printAttrs(attrs);
			attrs = ictx.getAttributes("dns://sun.inform.dk/dylan.dk");
			System.out.println("\nsun.inform.dk reports:");
			printAttrs(attrs);
			attrs = ictx.getAttributes("dns://ns3.inet.tele.dk/dylan.dk");
			System.out.println("\nns3.inet.tele.dk reports:");
			printAttrs(attrs);
			attrs = ictx.getAttributes("dns://ns3.tele.dk/dylan.dk");
			System.out.println("\nns3.tele.dk reports:");
			printAttrs(attrs);
			ictx.close();
		}
		catch (javax.naming.NamingException e)
		{
			System.err.println("Problem looking up dylan.dk: " + e);
		}
	}

	private static String toString(String[] a)
	{
		try
		{
			StringBuffer sb = new StringBuffer(a[0]);
			for (int i = 1 ; i < a.length; i++) sb.append(", " + a[i]);
			return sb.toString();
		}
		catch(Exception e)
		{
			System.err.println(e);
			return " -- ";
		}
	}

	private static void printAttrs(javax.naming.directory.Attributes attrs) throws javax.naming.NamingException
	{
		for (javax.naming.NamingEnumeration attributes = attrs.getAll(); attributes.hasMore(); )
		{
			javax.naming.directory.Attribute attribute = (javax.naming.directory.Attribute) attributes.next();
			System.out.println("Attribute: " + attribute.getID());
			for (javax.naming.NamingEnumeration values = attribute.getAll(); values.hasMore(); )
			{
				Object value = (Object) values.next();
				System.out.println("	Value: " + (value != null ? value.toString(): "null"));
			}
		}
	}
}