package net.jangaroo.jooc.mxml; import net.jangaroo.jooc.util.PreserveLineNumberHandler; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.io.InputStream; public class CatalogComponentsParser { private MxmlComponentRegistry mxmlComponentRegistry; public CatalogComponentsParser(MxmlComponentRegistry mxmlComponentRegistry) { this.mxmlComponentRegistry = mxmlComponentRegistry; } public void parse(InputStream catalogInputStream) { try { Document document = buildDom(catalogInputStream); NodeList componentNodes = document.getElementsByTagName("component"); for (int i = 0; i < componentNodes.getLength(); i++) { Node componentNode = componentNodes.item(i); if (componentNode.getNodeType() == Node.ELEMENT_NODE) { Element componentElement = (Element) componentNode; String componentClass = componentElement.getAttribute("className"); mxmlComponentRegistry.registerElement(componentElement.getAttribute("uri"), componentElement.getAttribute("name"), componentClass.replace(':', '.')); } } } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private Document buildDom(InputStream inputStream) throws SAXException, IOException { SAXParser parser; final Document doc; try { final SAXParserFactory saxFactory = SAXParserFactory.newInstance(); saxFactory.setNamespaceAware(true); parser = saxFactory.newSAXParser(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); doc = factory.newDocumentBuilder().newDocument(); } catch (ParserConfigurationException e) { throw new IllegalStateException("a default dom builder should be provided", e); } PreserveLineNumberHandler handler = new PreserveLineNumberHandler(doc); parser.parse(inputStream, handler); return doc; } }