mirror of https://github.com/apache/lucene.git
SOLR-78 - replaced usage of Node.getTextContent with new helper method which allows Solr to work with DOM Level 2 parsers instead of requiring DOM Level 3
git-svn-id: https://svn.apache.org/repos/asf/incubator/solr/trunk@487438 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e03b4e564d
commit
dc2d6485ff
|
@ -217,5 +217,8 @@ Other Changes
|
||||||
13. Added Solr/Lucene versions to "Info" page (hossman)
|
13. Added Solr/Lucene versions to "Info" page (hossman)
|
||||||
14. Explicitly set mime-type of .xsl files in web.xml to
|
14. Explicitly set mime-type of .xsl files in web.xml to
|
||||||
application/xslt+xml (hossman)
|
application/xslt+xml (hossman)
|
||||||
|
15. Config parsing should now work useing DOM Level 2 parsers -- Solr
|
||||||
|
previously relied on getTextContent which is a DOM Level 3 addition
|
||||||
|
(Alexander Saar via hossman, SOLR-78)
|
||||||
|
|
||||||
2006/01/17 Solr open sourced, moves to Apache Incubator
|
2006/01/17 Solr open sourced, moves to Apache Incubator
|
||||||
|
|
|
@ -22,6 +22,7 @@ import org.w3c.dom.Node;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import org.apache.solr.core.SolrCore;
|
import org.apache.solr.core.SolrCore;
|
||||||
import org.apache.solr.core.SolrException;
|
import org.apache.solr.core.SolrException;
|
||||||
|
import org.apache.solr.util.DOMUtil;
|
||||||
|
|
||||||
import javax.xml.parsers.*;
|
import javax.xml.parsers.*;
|
||||||
import javax.xml.xpath.XPath;
|
import javax.xml.xpath.XPath;
|
||||||
|
@ -122,10 +123,8 @@ public class Config {
|
||||||
Node nd = getNode(path,errIfMissing);
|
Node nd = getNode(path,errIfMissing);
|
||||||
if (nd==null) return null;
|
if (nd==null) return null;
|
||||||
|
|
||||||
// should do the right thing for both attributes and elements.
|
String txt = DOMUtil.getText(nd);
|
||||||
// Oops, when running in Resin, I get an unsupported operation
|
|
||||||
// exception... need to use Sun default (apache)
|
|
||||||
String txt = nd.getTextContent();
|
|
||||||
log.fine(name + ' '+path+'='+txt);
|
log.fine(name + ' '+path+'='+txt);
|
||||||
return txt;
|
return txt;
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.apache.solr.util;
|
package org.apache.solr.util;
|
||||||
|
|
||||||
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.NamedNodeMap;
|
import org.w3c.dom.NamedNodeMap;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
|
@ -129,17 +130,17 @@ public class DOMUtil {
|
||||||
Object val=null;
|
Object val=null;
|
||||||
|
|
||||||
if ("str".equals(type)) {
|
if ("str".equals(type)) {
|
||||||
val = nd.getTextContent();
|
val = getText(nd);
|
||||||
} else if ("int".equals(type)) {
|
} else if ("int".equals(type)) {
|
||||||
val = Integer.valueOf(nd.getTextContent());
|
val = Integer.valueOf(getText(nd));
|
||||||
} else if ("long".equals(type)) {
|
} else if ("long".equals(type)) {
|
||||||
val = Long.valueOf(nd.getTextContent());
|
val = Long.valueOf(getText(nd));
|
||||||
} else if ("float".equals(type)) {
|
} else if ("float".equals(type)) {
|
||||||
val = Float.valueOf(nd.getTextContent());
|
val = Float.valueOf(getText(nd));
|
||||||
} else if ("double".equals(type)) {
|
} else if ("double".equals(type)) {
|
||||||
val = Double.valueOf(nd.getTextContent());
|
val = Double.valueOf(getText(nd));
|
||||||
} else if ("bool".equals(type)) {
|
} else if ("bool".equals(type)) {
|
||||||
val = Boolean.valueOf(nd.getTextContent());
|
val = Boolean.valueOf(getText(nd));
|
||||||
} else if ("lst".equals(type)) {
|
} else if ("lst".equals(type)) {
|
||||||
val = childNodesToNamedList(nd);
|
val = childNodesToNamedList(nd);
|
||||||
} else if ("arr".equals(type)) {
|
} else if ("arr".equals(type)) {
|
||||||
|
@ -150,4 +151,72 @@ public class DOMUtil {
|
||||||
if (arr != null) arr.add(val);
|
if (arr != null) arr.add(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop in replacement for Node.getTextContent().
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This method is provided to support the same functionality as
|
||||||
|
* Node.getTextContent() but in a way that is DOM Level 2 compatible.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @see <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent">DOM Object Model Core</a>
|
||||||
|
*/
|
||||||
|
public static String getText(Node nd) {
|
||||||
|
|
||||||
|
short type = nd.getNodeType();
|
||||||
|
|
||||||
|
// for most node types, we can defer to the recursive helper method,
|
||||||
|
// but when asked for the text of these types, we must return null
|
||||||
|
// (Not the empty string)
|
||||||
|
switch (type) {
|
||||||
|
|
||||||
|
case Node.DOCUMENT_NODE: /* fall through */
|
||||||
|
case Node.DOCUMENT_TYPE_NODE: /* fall through */
|
||||||
|
case Node.NOTATION_NODE: /* fall through */
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
getText(nd, sb);
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @see #getText(Node) */
|
||||||
|
private static void getText(Node nd, StringBuilder buf) {
|
||||||
|
|
||||||
|
short type = nd.getNodeType();
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
|
||||||
|
case Node.ELEMENT_NODE: /* fall through */
|
||||||
|
case Node.ATTRIBUTE_NODE: /* fall through */
|
||||||
|
case Node.ENTITY_NODE: /* fall through */
|
||||||
|
case Node.ENTITY_REFERENCE_NODE: /* fall through */
|
||||||
|
case Node.DOCUMENT_FRAGMENT_NODE:
|
||||||
|
NodeList childs = nd.getChildNodes();
|
||||||
|
for (int i = 0; i < childs.getLength(); i++) {
|
||||||
|
Node child = childs.item(i);
|
||||||
|
short childType = child.getNodeType();
|
||||||
|
if (childType != Node.COMMENT_NODE &&
|
||||||
|
childType != Node.PROCESSING_INSTRUCTION_NODE) {
|
||||||
|
getText(child, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Node.TEXT_NODE: /* fall through */
|
||||||
|
case Node.CDATA_SECTION_NODE: /* fall through */
|
||||||
|
case Node.COMMENT_NODE: /* fall through */
|
||||||
|
case Node.PROCESSING_INSTRUCTION_NODE: /* fall through */
|
||||||
|
buf.append(nd.getNodeValue());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Node.DOCUMENT_NODE: /* fall through */
|
||||||
|
case Node.DOCUMENT_TYPE_NODE: /* fall through */
|
||||||
|
case Node.NOTATION_NODE: /* fall through */
|
||||||
|
default:
|
||||||
|
/* :NOOP: */
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue