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('>');
}
}
}
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;
}
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;
}
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;
}
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;
}
Aggregations