package com.limegroup.gnutella.simpp; import java.io.IOException; import java.io.StringReader; import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import com.limegroup.gnutella.xml.LimeXMLUtils; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; public class SimppParser { private static final Log LOG = LogFactory.getLog(SimppParser.class); private static DOMParser parser = new DOMParser(); private static final String VERSION = "version"; private static final String PROPS = "props"; private int _version; private String _propsData; //Format of dataBytes: //<xml for version related info with one tag containing all the props data> //TODO1: Change the way this is parsed as per the format described above. public SimppParser(byte[] dataBytes) throws SAXException, IOException { parseInfo(new String(dataBytes, "UTF-8")); } public int getVersion() { return _version; } public String getPropsData() { return _propsData; } ///////////////////////////private helpers//////////////////////// private void parseInfo(String xmlStr) throws SAXException, IOException { if(xmlStr == null || xmlStr.equals("")) throw new SAXException("null xml for version info"); InputSource inputSource = new InputSource(new StringReader(xmlStr)); Document d = null; synchronized(SimppParser.parser) { parser.parse(inputSource); d = parser.getDocument(); } if(d == null) throw new SAXException("parsed documemt is null"); Element docElement = d.getDocumentElement(); NodeList children = docElement.getChildNodes(); int len = children.getLength(); for(int i= 0; i< len; i++) { Node node = children.item(i); String nodeName = node.getNodeName().toLowerCase().trim(); String value = LimeXMLUtils.getText(node.getChildNodes()); if(nodeName.equals(VERSION)) { String ver = value; try { _version = Integer.parseInt(ver); } catch(NumberFormatException nfx) { LOG.error("Unable to parse version number: " + nfx); _version = -1; } } else if(nodeName.equals(PROPS)) { _propsData = value; } }//end of for -- done all child nodes } }