package com.limegroup.gnutella.xml; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Properties; import java.util.StringTokenizer; /** This class provides IP addresses for specialized gnutella content deliverers. */ public class XMLHostCache { // important literals..... //----------------------------- private final String XML_HOSTS_DIR = "xml" + File.separator + "misc"+ File.separator; private final String XML_HOSTS_FILE = "server.props"; private final String HOSTS_DELIM = ","; //----------------------------- /** allows access to XML_HOSTS_FILE.... */ private Properties _props; /** file that stuff is saved in.... */ private String _dbFile; /** *@exception java.lang.Exception Thrown if could not access underlying DB. */ public XMLHostCache() throws Exception { // setup file to load props from..... String limeHome = LimeXMLProperties.instance().getPath(); _dbFile = limeHome + File.separator + XML_HOSTS_DIR + File.separator + XML_HOSTS_FILE; InputStream toLoadProps = new FileInputStream(_dbFile); // load the props.... _props = new Properties(); _props.load(toLoadProps); debug(""+_props); } private String getHostsForSchema(String schemaURI) { String retString = null; // use sumeet's stuff to get the key.... String displayString = LimeXMLSchema.getDisplayString(schemaURI); if (displayString != null) // get the values and make a string[] out of them.... retString = _props.getProperty(displayString); return retString; } /** @return A array of Strings which are addresses of category specific * gnutella servents (the assumed port is 6346). May return null. */ public String[] getCachedHostsForURI(String schemaURI) { String[] retHosts = null; // get the hosts for the appropriate schema.... String hosts = getHostsForSchema(schemaURI); if (hosts != null) { // need to make them presentable.... StringTokenizer st = new StringTokenizer(hosts, HOSTS_DELIM); // use an arraylist cuz a nslookup may fail.... ArrayList ipAddresses = new ArrayList(); while (st.hasMoreTokens()) { String currHost = st.nextToken(); try { InetAddress currIA = InetAddress.getByName(currHost); ipAddresses.add(currIA.getHostAddress()); } catch (UnknownHostException ignored) {} } // aggregate all successful ones into a string array.... retHosts = new String[ipAddresses.size()]; for (int i = 0; i < retHosts.length; i++) retHosts[i] = (String) ipAddresses.get(i); } return retHosts; } public static void main(String argv[]) throws Exception { XMLHostCache xmlhc = new XMLHostCache(); LimeXMLSchemaRepository rep = LimeXMLSchemaRepository.instance(); if (rep != null) { String[] uris = rep.getAvailableSchemaURIs(); for (int i = 0; i < uris.length; i++) { debug("curr uri = " + uris[i]); String[] hosts = xmlhc.getCachedHostsForURI(uris[i]); for (int j = 0; (hosts != null) && (j < hosts.length); j++) debug(hosts[j]); debug("--------------------"); } } } private final static boolean debugOn = false; public final static void debug(String out) { if (debugOn) System.out.println(out); } }