Search in sources :

Example 1 with Node

use of org.cybergarage.xml.Node in project i2p.i2p by i2p.

the class XMLParser method output.

/**
 *  A replacement for Node.output(), which does not recognize #text.
 *  Also, we use the empty entity, so <br /> does not turn into <br></br>.
 */
private static void output(StringBuilder buf, Node node, int indentLevel) {
    String name = node.getName();
    String value = XML.escapeXMLChars(node.getValue());
    if (name.equals(TEXT_NAME)) {
        buf.append(value);
        return;
    }
    buf.append('<').append(name);
    int nAttributes = node.getNAttributes();
    for (int n = 0; n < nAttributes; n++) {
        Attribute attr = node.getAttribute(n);
        buf.append(' ').append(attr.getName()).append("=\"").append(XML.escapeXMLChars(attr.getValue())).append('"');
    }
    // If mixed values and nodes, the values must be text nodes. See parser above.
    if (node.hasNodes()) {
        buf.append('>');
        int nChildNodes = node.getNNodes();
        for (int n = 0; n < nChildNodes; n++) {
            Node cnode = node.getNode(n);
            output(buf, cnode, indentLevel + 1);
        }
        buf.append("</").append(name).append('>');
    } else {
        if (value == null || value.length() == 0) {
            // space for <br />
            buf.append(" />");
        } else {
            buf.append('>').append(value).append("</").append(name).append('>');
        }
    }
}
Also used : Attribute(org.cybergarage.xml.Attribute) Node(org.cybergarage.xml.Node)

Example 2 with Node

use of org.cybergarage.xml.Node in project i2p.i2p by i2p.

the class XMLParser method parse.

/**
 *  Modified from UPnP JaxpParser
 *
 *  @param parentNode null if at top
 *  @param rank parse level, only for debug
 *  @return the parsed node, or the parent node, unused except at top level
 */
@Override
public org.cybergarage.xml.Node parse(Node parentNode, org.w3c.dom.Node domNode, int rank) {
    int domNodeType = domNode.getNodeType();
    String domNodeName = domNode.getNodeName();
    String domNodeValue = domNode.getNodeValue();
    NamedNodeMap attrs = domNode.getAttributes();
    int arrrsLen = (attrs != null) ? attrs.getLength() : 0;
    if (_log.shouldLog(Log.DEBUG)) {
        String val = domNodeValue != null ? " = \"" + domNodeValue.replace("\n", "\\n").replace("\r", "\\r") + '"' : "";
        _log.debug("[" + rank + "] ELEM : \"" + domNodeName + '"' + val + " type = " + domNodeType + " with " + arrrsLen + " attrs");
    }
    // Otherwise, add it as a node.
    if (domNodeType == org.w3c.dom.Node.TEXT_NODE) {
        if (domNodeValue.replaceAll("[ \t\r\n]", "").length() == 0) {
            return parentNode;
        }
        if (!parentNode.hasNodes()) {
            parentNode.addValue(domNodeValue);
            return parentNode;
        }
    // else we will add it as a node below
    } else if (domNodeType != org.w3c.dom.Node.ELEMENT_NODE) {
        return parentNode;
    }
    Node node = new Node();
    node.setName(domNodeName);
    node.setValue(domNodeValue);
    if (parentNode != null) {
        // I2P - take the value and convert it to a text node, if it's not just whitespace
        String oldValue = parentNode.getValue();
        if (oldValue != null && oldValue.length() > 0) {
            parentNode.setValue("");
            Node text = new Node();
            text.setName(TEXT_NAME);
            text.setValue(oldValue);
            parentNode.addNode(text);
            if (_log.shouldLog(Log.DEBUG))
                _log.debug("Converted value to node");
        }
        parentNode.addNode(node);
    }
    if (domNodeType == org.w3c.dom.Node.TEXT_NODE)
        return parentNode;
    if (attrs != null) {
        for (int n = 0; n < arrrsLen; n++) {
            org.w3c.dom.Node attr = attrs.item(n);
            String attrName = attr.getNodeName();
            String attrValue = attr.getNodeValue();
            node.setAttribute(attrName, attrValue);
        }
    }
    org.w3c.dom.Node child = domNode.getFirstChild();
    if (child == null) {
        node.setValue("");
        return node;
    }
    do {
        parse(node, child, rank + 1);
        child = child.getNextSibling();
    } while (child != null);
    return node;
}
Also used : NamedNodeMap(org.w3c.dom.NamedNodeMap) Node(org.cybergarage.xml.Node)

Example 3 with Node

use of org.cybergarage.xml.Node in project i2p.i2p by i2p.

the class NewsXMLParser method extractCRLEntries.

/**
 *  This does not check for any missing values.
 *  Any field in any CRLEntry may be null.
 *
 *  @return null if none
 *  @since 0.9.26
 */
private static List<CRLEntry> extractCRLEntries(Node feed) throws I2PParserException {
    Node rev = feed.getNode("i2p:revocations");
    if (rev == null)
        return null;
    List<Node> entries = getNodes(rev, "i2p:crl");
    if (entries.isEmpty())
        return null;
    List<CRLEntry> rv = new ArrayList<CRLEntry>(entries.size());
    for (Node entry : entries) {
        CRLEntry e = new CRLEntry();
        String a = entry.getAttributeValue("id");
        if (a.length() > 0)
            e.id = a;
        a = entry.getAttributeValue("updated");
        if (a.length() > 0) {
            long time = RFC3339Date.parse3339Date(a.trim());
            if (time > 0)
                e.updated = time;
        }
        a = entry.getValue();
        if (a != null)
            e.data = a.trim();
        rv.add(e);
    }
    return rv;
}
Also used : Node(org.cybergarage.xml.Node) ArrayList(java.util.ArrayList)

Example 4 with Node

use of org.cybergarage.xml.Node in project i2p.i2p by i2p.

the class NewsXMLParser method extractBlocklistEntries.

/**
 *  This does not check for any missing values.
 *  Any field in a BlocklistEntry may be null.
 *  Signature is verified here.
 *
 *  @return null if none
 *  @since 0.9.28
 */
private BlocklistEntries extractBlocklistEntries(Node feed) throws I2PParserException {
    Node bl = feed.getNode("i2p:blocklist");
    if (bl == null)
        return null;
    List<Node> entries = getNodes(bl, "i2p:block");
    BlocklistEntries rv = new BlocklistEntries(entries.size());
    String a = bl.getAttributeValue("signer");
    if (a.length() > 0)
        rv.signer = a;
    a = bl.getAttributeValue("sig");
    if (a.length() > 0) {
        rv.sig = a;
    }
    Node n = bl.getNode("updated");
    if (n == null)
        return null;
    a = n.getValue();
    if (a != null) {
        rv.supdated = a;
        long time = RFC3339Date.parse3339Date(a.trim());
        if (time > 0)
            rv.updated = time;
    }
    for (Node entry : entries) {
        a = entry.getValue();
        if (a != null) {
            rv.entries.add(a.trim());
        }
    }
    List<Node> rentries = getNodes(bl, "i2p:unblock");
    if (entries.isEmpty() && rentries.isEmpty())
        return null;
    for (Node entry : rentries) {
        a = entry.getValue();
        if (a != null) {
            rv.removes.add(a.trim());
        }
    }
    rv.verify(_context);
    return rv;
}
Also used : Node(org.cybergarage.xml.Node)

Example 5 with Node

use of org.cybergarage.xml.Node in project i2p.i2p by i2p.

the class NewsXMLParser method extractNewsMetadata.

private static NewsMetadata extractNewsMetadata(Node feed) throws I2PParserException {
    NewsMetadata rv = new NewsMetadata();
    Node n = feed.getNode("title");
    if (n != null) {
        rv.feedTitle = n.getValue();
        if (rv.feedTitle != null)
            rv.feedTitle = rv.feedTitle.trim();
    }
    n = feed.getNode("subtitle");
    if (n != null) {
        rv.feedSubtitle = n.getValue();
        if (rv.feedSubtitle != null)
            rv.feedSubtitle = rv.feedTitle.trim();
    }
    n = feed.getNode("id");
    if (n != null) {
        rv.feedID = n.getValue();
        if (rv.feedTitle != null)
            rv.feedTitle = rv.feedTitle.trim();
    }
    n = feed.getNode("updated");
    if (n != null) {
        String v = n.getValue();
        if (v != null) {
            long time = RFC3339Date.parse3339Date(v.trim());
            if (time > 0)
                rv.feedUpdated = time;
        }
    }
    List<NewsMetadata.Release> releases = new ArrayList<NewsMetadata.Release>();
    List<Node> releaseNodes = getNodes(feed, "i2p:release");
    if (releaseNodes.size() == 0)
        throw new I2PParserException("no release data in XML");
    for (Node r : releaseNodes) {
        NewsMetadata.Release release = new NewsMetadata.Release();
        // release attributes
        String a = r.getAttributeValue("date");
        if (a.length() > 0) {
            long time = RFC3339Date.parse3339Date(a.trim());
            if (time > 0)
                release.date = time;
        }
        a = r.getAttributeValue("minVersion");
        if (a.length() > 0)
            release.minVersion = a.trim();
        a = r.getAttributeValue("minJavaVersion");
        if (a.length() > 0)
            release.minJavaVersion = a.trim();
        // release nodes
        n = r.getNode("i2p:version");
        if (n != null) {
            release.i2pVersion = n.getValue();
            if (release.i2pVersion != null)
                release.i2pVersion = release.i2pVersion.trim();
        }
        List<NewsMetadata.Update> updates = new ArrayList<NewsMetadata.Update>();
        List<Node> updateNodes = getNodes(r, "i2p:update");
        if (updateNodes.size() == 0)
            throw new I2PParserException("no updates in release");
        Set<String> types = new HashSet<String>();
        for (Node u : updateNodes) {
            // returns "" for none
            String type = u.getAttributeValue("type");
            if (type.isEmpty())
                throw new I2PParserException("update with no type");
            if (types.contains(type))
                throw new I2PParserException("update with duplicate type");
            NewsMetadata.Update update = new NewsMetadata.Update();
            update.type = type.trim();
            types.add(type);
            int totalSources = 0;
            Node t = u.getNode("i2p:torrent");
            if (t != null) {
                // returns "" for none
                String href = t.getAttributeValue("href");
                if (href.length() > 0) {
                    update.torrent = href.trim();
                    totalSources += 1;
                }
            }
            if (totalSources == 0)
                throw new I2PParserException("no sources for update type " + type);
            updates.add(update);
        }
        Collections.sort(updates);
        release.updates = updates;
        releases.add(release);
    }
    Collections.sort(releases);
    rv.releases = releases;
    return rv;
}
Also used : Node(org.cybergarage.xml.Node) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet)

Aggregations

Node (org.cybergarage.xml.Node)58 ParserException (org.cybergarage.xml.ParserException)7 ArrayList (java.util.ArrayList)5 ServiceData (org.cybergarage.upnp.xml.ServiceData)5 Parser (org.cybergarage.xml.Parser)5 IOException (java.io.IOException)4 File (java.io.File)3 Device (org.cybergarage.upnp.Device)3 DeviceData (org.cybergarage.upnp.xml.DeviceData)3 UPnPDevice (org.osgi.service.upnp.UPnPDevice)3 URL (java.net.URL)2 Log (net.i2p.util.Log)2 InvalidDescriptionException (org.cybergarage.upnp.device.InvalidDescriptionException)2 NamedNodeMap (org.w3c.dom.NamedNodeMap)2 BufferedInputStream (java.io.BufferedInputStream)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 FileInputStream (java.io.FileInputStream)1 InputStream (java.io.InputStream)1 OutputStreamWriter (java.io.OutputStreamWriter)1 Writer (java.io.Writer)1