Index: java/src/com/yahoo/zookeeper/server/quorum/QuorumPeerConfig.java =================================================================== --- java/src/com/yahoo/zookeeper/server/quorum/QuorumPeerConfig.java (revision 176) +++ java/src/com/yahoo/zookeeper/server/quorum/QuorumPeerConfig.java (working copy) @@ -16,16 +16,24 @@ package com.yahoo.zookeeper.server.quorum; +import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; +import java.io.InputStream; import java.net.InetSocketAddress; import java.util.ArrayList; -import java.util.Properties; -import java.util.Map.Entry; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; import com.yahoo.zookeeper.server.ServerConfig; import com.yahoo.zookeeper.server.quorum.QuorumPeer.QuorumServer; @@ -46,119 +54,155 @@ } public static void parse(String[] args) { - if(instance!=null) - return; + if (instance != null) + return; - try { - if (args.length != 1) { - System.err.println("USAGE: configFile"); - System.exit(2); - } - File zooCfgFile = new File(args[0]); - if (!zooCfgFile.exists()) { - LOG.error(zooCfgFile.toString() + " file is missing"); - System.exit(2); - } - Properties cfg = new Properties(); - cfg.load(new FileInputStream(zooCfgFile)); - ArrayList servers = new ArrayList(); - String dataDir = null; - String dataLogDir = null; - int clientPort = 0; - int tickTime = 0; - int initLimit = 0; - int syncLimit = 0; - int electionAlg = 0; - int electionPort = 0; - for (Entry entry : cfg.entrySet()) { - String key = entry.getKey().toString(); - String value = entry.getValue().toString(); - if (key.equals("dataDir")) { - dataDir = value; - } else if (key.equals("dataLogDir")) { - dataLogDir = value; - } else if (key.equals("clientPort")) { - clientPort = Integer.parseInt(value); - } else if (key.equals("tickTime")) { - tickTime = Integer.parseInt(value); - } else if (key.equals("initLimit")) { - initLimit = Integer.parseInt(value); - } else if (key.equals("syncLimit")) { - syncLimit = Integer.parseInt(value); - } else if (key.equals("electionAlg")) { - electionAlg = Integer.parseInt(value); - } else if (key.equals("electionPort")) { - electionPort = Integer.parseInt(value); - } else if (key.startsWith("server.")) { - int dot = key.indexOf('.'); - long sid = Long.parseLong(key.substring(dot + 1)); - String parts[] = value.split(":"); - if (parts.length != 2) { - LOG.error(value - + " does not have the form host:port"); - } - InetSocketAddress addr = new InetSocketAddress(parts[0], - Integer.parseInt(parts[1])); - servers.add(new QuorumServer(sid, addr)); - } else { - System.setProperty("zookeeper." + key, value); - } - } - if (dataDir == null) { - LOG.error("dataDir is not set"); - System.exit(2); - } - if (dataLogDir == null) { - dataLogDir = dataDir; - } else { - if (!new File(dataLogDir).isDirectory()) { - LOG.error("dataLogDir " + dataLogDir+ " is missing."); - System.exit(2); - } - } - if (clientPort == 0) { - LOG.error("clientPort is not set"); - System.exit(2); - } - if (tickTime == 0) { - LOG.error("tickTime is not set"); - System.exit(2); - } - if (servers.size() > 1 && initLimit == 0) { - LOG.error("initLimit is not set"); - System.exit(2); - } - if (servers.size() > 1 && syncLimit == 0) { - LOG.error("syncLimit is not set"); - System.exit(2); - } - QuorumPeerConfig conf = new QuorumPeerConfig(clientPort, dataDir, - dataLogDir); - conf.tickTime = tickTime; - conf.initLimit = initLimit; - conf.syncLimit = syncLimit; - conf.electionAlg = electionAlg; - conf.electionPort = electionPort; - conf.servers = servers; - if (servers.size() > 1) { - File myIdFile = new File(dataDir, "myid"); - if (!myIdFile.exists()) { - LOG.error(myIdFile.toString() + " file is missing"); - System.exit(2); - } - BufferedReader br = new BufferedReader(new FileReader(myIdFile)); - String myIdString = br.readLine(); - try { - conf.serverId = Long.parseLong(myIdString); - } catch (NumberFormatException e) { - LOG.error(myIdString + " is not a number"); - System.exit(2); - } - } - instance=conf; - } catch (Exception e) { - LOG.error("FIXMSG",e); - System.exit(2); + try { + if (args.length != 1) { + System.err.println("USAGE: configFile"); + System.exit(2); + } + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory + .newInstance(); + // ignore all comments inside the xml file + docBuilderFactory.setIgnoringComments(true); + DocumentBuilder builder = docBuilderFactory.newDocumentBuilder(); + Document doc = null; + File zooCfgFile = new File(args[0]); + if (!zooCfgFile.exists()) { + LOG.error(zooCfgFile.toString() + " file is missing"); + System.exit(2); + } + InputStream in = new BufferedInputStream(new FileInputStream( + zooCfgFile)); + try { + doc = builder.parse(in); + } finally { + in.close(); + } + ArrayList servers = new ArrayList(); + String dataDir = null; + String dataLogDir = null; + int clientPort = 0; + int tickTime = 0; + int initLimit = 0; + int syncLimit = 0; + int electionAlg = 0; + int electionPort = 0; + Element root = doc.getDocumentElement(); + if (!"configuration".equals(root.getTagName())) + LOG + .fatal("bad conf file: top-level element not "); + NodeList props = root.getChildNodes(); + for (int i = 0; i < props.getLength(); i++) { + Node propNode = props.item(i); + if (!(propNode instanceof Element)) + continue; + Element prop = (Element) propNode; + if (!"property".equals(prop.getTagName())) + LOG.warn("bad conf file: element not "); + NodeList fields = prop.getChildNodes(); + String key = null; + String value = null; + for (int j = 0; j < fields.getLength(); j++) { + Node fieldNode = fields.item(j); + if (!(fieldNode instanceof Element)) + continue; + Element field = (Element) fieldNode; + if ("name".equals(field.getTagName()) + && field.hasChildNodes()) + key = ((Text) field.getFirstChild()).getData(); + if ("value".equals(field.getTagName()) + && field.hasChildNodes()) + value = ((Text) field.getFirstChild()).getData(); + } + if (key.equals("dataDir")) { + dataDir = value; + } else if (key.equals("dataLogDir")) { + dataLogDir = value; + } else if (key.equals("clientPort")) { + clientPort = Integer.parseInt(value); + } else if (key.equals("tickTime")) { + tickTime = Integer.parseInt(value); + } else if (key.equals("initLimit")) { + initLimit = Integer.parseInt(value); + } else if (key.equals("syncLimit")) { + syncLimit = Integer.parseInt(value); + } else if (key.equals("electionAlg")) { + electionAlg = Integer.parseInt(value); + } else if (key.equals("electionPort")) { + electionPort = Integer.parseInt(value); + } else if (key.startsWith("server.")) { + int dot = key.indexOf('.'); + long sid = Long.parseLong(key.substring(dot + 1)); + String parts[] = value.split(":"); + if (parts.length != 2) { + LOG.error(value + " does not have the form host:port"); + } + InetSocketAddress addr = new InetSocketAddress(parts[0], + Integer.parseInt(parts[1])); + servers.add(new QuorumServer(sid, addr)); + } else { + System.setProperty("zookeeper." + key, value); + } + + } + if (dataDir == null) { + LOG.error("dataDir is not set"); + System.exit(2); + } + if (dataLogDir == null) { + dataLogDir = dataDir; + } else { + if (!new File(dataLogDir).isDirectory()) { + LOG.error("dataLogDir " + dataLogDir + " is missing."); + System.exit(2); + } + } + if (clientPort == 0) { + LOG.error("clientPort is not set"); + System.exit(2); + } + if (tickTime == 0) { + LOG.error("tickTime is not set"); + System.exit(2); + } + if (servers.size() > 1 && initLimit == 0) { + LOG.error("initLimit is not set"); + System.exit(2); + } + if (servers.size() > 1 && syncLimit == 0) { + LOG.error("syncLimit is not set"); + System.exit(2); + } + QuorumPeerConfig conf = new QuorumPeerConfig(clientPort, dataDir, + dataLogDir); + conf.tickTime = tickTime; + conf.initLimit = initLimit; + conf.syncLimit = syncLimit; + conf.electionAlg = electionAlg; + conf.electionPort = electionPort; + conf.servers = servers; + if (servers.size() > 1) { + File myIdFile = new File(dataDir, "myid"); + if (!myIdFile.exists()) { + LOG.error(myIdFile.toString() + " file is missing"); + System.exit(2); + } + BufferedReader br = new BufferedReader(new FileReader(myIdFile)); + String myIdString = br.readLine(); + try { + conf.serverId = Long.parseLong(myIdString); + } catch (NumberFormatException e) { + LOG.error(myIdString + " is not a number"); + System.exit(2); + } + } + instance = conf; + } catch (Exception e) { + e.printStackTrace(); + LOG.error("FIXMSG", e); + System.exit(2); } }