CachedXPathFuncHereAPIpublic class CachedXPathFuncHereAPI extends Object
Fields Summary |
---|
static Logger | log | com.sun.org.apache.xml.internal.security.transforms.implementations.FuncHereContext | _funcHereContextXPathContext, and thus DTMManager and DTMs, persists through multiple
calls to this object. | DTMManager | _dtmManagerField _dtmManager | XPathContext | _context | String | xpathStr | XPath | xpath | static FunctionTable | _funcTable |
Constructors Summary |
---|
private CachedXPathFuncHereAPI()Constructor CachedXPathFuncHereAPI
| public CachedXPathFuncHereAPI(XPathContext existingXPathContext)Constructor CachedXPathFuncHereAPI
this._dtmManager = existingXPathContext.getDTMManager();
this._context=existingXPathContext;
| public CachedXPathFuncHereAPI(CachedXPathAPI previouslyUsed)Constructor CachedXPathFuncHereAPI
this._dtmManager = previouslyUsed.getXPathContext().getDTMManager();
this._context=previouslyUsed.getXPathContext();
|
Methods Summary |
---|
private com.sun.org.apache.xpath.internal.XPath | createXPath(java.lang.String str, com.sun.org.apache.xml.internal.utils.PrefixResolver prefixResolver)
XPath xpath = null;
Class[] classes = new Class[]{String.class, SourceLocator.class, PrefixResolver.class, int.class,
ErrorListener.class, FunctionTable.class};
Object[] objects = new Object[]{str, null, prefixResolver, new Integer(XPath.SELECT), null, _funcTable};
try {
Constructor constructor = XPath.class.getConstructor(classes);
xpath = (XPath) constructor.newInstance(objects);
} catch (Throwable t) {
}
if (xpath == null) {
xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null);
}
return xpath;
| public com.sun.org.apache.xpath.internal.objects.XObject | eval(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode)Evaluate XPath string to an XObject. Using this method,
XPath namespace prefixes will be resolved from the namespaceNode.
return eval(contextNode, xpathnode, getStrFromNode(xpathnode),contextNode);
| public com.sun.org.apache.xpath.internal.objects.XObject | eval(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode, java.lang.String str, org.w3c.dom.Node namespaceNode)Evaluate XPath string to an XObject.
XPath namespace prefixes are resolved from the namespaceNode.
The implementation of this is a little slow, since it creates
a number of objects each time it is called. This could be optimized
to keep the same objects around, but then thread-safety issues would arise.
// Create the XPath object.
//String str = CachedXPathFuncHereAPI.getStrFromNode(xpathnode);
// Since we don't have a XML Parser involved here, install some default support
// for things like namespaces, etc.
// (Changed from: XPathContext xpathSupport = new XPathContext();
// because XPathContext is weak in a number of areas... perhaps
// XPathContext should be done away with.)
if (this._funcHereContext == null) {
this._funcHereContext = new FuncHereContext(xpathnode,
this._dtmManager);
}
// Create an object to resolve namespace prefixes.
// XPath namespaces are resolved from the input context node's document element
// if it is a root node, or else the current context node (for lack of a better
// resolution space, given the simplicity of this sample code).
PrefixResolverDefault prefixResolver =
new PrefixResolverDefault((namespaceNode.getNodeType()
== Node.DOCUMENT_NODE)
? ((Document) namespaceNode)
.getDocumentElement()
: namespaceNode);
if (str!=xpathStr) {
if (str.indexOf("here()")>0) {
_context.reset();
_dtmManager=_context.getDTMManager();
}
xpath = createXPath(str, prefixResolver);
xpathStr=str;
}
// Execute the XPath, and have it return the result
// return xpath.execute(xpathSupport, contextNode, prefixResolver);
int ctxtNode = this._funcHereContext.getDTMHandleFromNode(contextNode);
return xpath.execute(this._funcHereContext, ctxtNode, prefixResolver);
| public com.sun.org.apache.xpath.internal.objects.XObject | eval(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode, java.lang.String str, com.sun.org.apache.xml.internal.utils.PrefixResolver prefixResolver)Evaluate XPath string to an XObject.
XPath namespace prefixes are resolved from the namespaceNode.
The implementation of this is a little slow, since it creates
a number of objects each time it is called. This could be optimized
to keep the same objects around, but then thread-safety issues would arise.
// Since we don't have a XML Parser involved here, install some default support
// for things like namespaces, etc.
// (Changed from: XPathContext xpathSupport = new XPathContext();
// because XPathContext is weak in a number of areas... perhaps
// XPathContext should be done away with.)
// Create the XPath object.
//String str = CachedXPathFuncHereAPI.getStrFromNode(xpathnode);
if (str!=xpathStr) {
if (str.indexOf("here()")>0) {
_context.reset();
_dtmManager=_context.getDTMManager();
}
try {
xpath = createXPath(str, prefixResolver);
} catch (TransformerException ex) {
//Try to see if it is a problem with the classloader.
Throwable th= ex.getCause();
if (th instanceof ClassNotFoundException) {
if (th.getMessage().indexOf("FuncHere")>0) {
throw new RuntimeException(I18n.translate("endorsed.jdk1.4.0")/*,*/+ex);
}
}
throw ex;
}
xpathStr=str;
}
// Execute the XPath, and have it return the result
if (this._funcHereContext == null) {
this._funcHereContext = new FuncHereContext(xpathnode,
this._dtmManager);
}
int ctxtNode = this._funcHereContext.getDTMHandleFromNode(contextNode);
return xpath.execute(this._funcHereContext, ctxtNode, prefixResolver);
| private static void | fixupFunctionTable()
boolean installed = false;
if (log.isLoggable(java.util.logging.Level.INFO)) log.log(java.util.logging.Level.INFO, "Registering Here function");
/**
* Try to register our here() implementation as internal function.
*/
try {
Class []args = {String.class, Expression.class};
Method installFunction = FunctionTable.class.getMethod("installFunction", args);
if ((installFunction.getModifiers() & Modifier.STATIC) != 0) {
Object []params = {"here", new FuncHere()};
installFunction.invoke(null, params);
installed = true;
}
} catch (Throwable t) {
if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Error installing function using the static installFunction method", t);
}
if(!installed) {
try {
_funcTable = new FunctionTable();
Class []args = {String.class, Class.class};
Method installFunction = FunctionTable.class.getMethod("installFunction", args);
Object []params = {"here", FuncHere.class};
installFunction.invoke(_funcTable, params);
installed = true;
} catch (Throwable t) {
if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Error installing function using the static installFunction method", t);
}
}
if (true) {
if (installed) {
if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Registered class " + FuncHere.class.getName()
+ " for XPath function 'here()' function in internal table");
} else {
if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Unable to register class " + FuncHere.class.getName()
+ " for XPath function 'here()' function in internal table");
}
}
| public com.sun.org.apache.xml.internal.security.transforms.implementations.FuncHereContext | getFuncHereContext()Method getFuncHereContext
fixupFunctionTable();
return this._funcHereContext;
| public static java.lang.String | getStrFromNode(org.w3c.dom.Node xpathnode)Method getStrFromNode
if (xpathnode.getNodeType() == Node.TEXT_NODE) {
// we iterate over all siblings of the context node because eventually,
// the text is "polluted" with pi's or comments
StringBuffer sb = new StringBuffer();
for (Node currentSibling = xpathnode.getParentNode().getFirstChild();
currentSibling != null;
currentSibling = currentSibling.getNextSibling()) {
if (currentSibling.getNodeType() == Node.TEXT_NODE) {
sb.append(((Text) currentSibling).getData());
}
}
return sb.toString();
} else if (xpathnode.getNodeType() == Node.ATTRIBUTE_NODE) {
return ((Attr) xpathnode).getNodeValue();
} else if (xpathnode.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {
return ((ProcessingInstruction) xpathnode).getNodeValue();
}
return null;
| public org.w3c.dom.traversal.NodeIterator | selectNodeIterator(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode)Use an XPath string to select a nodelist.
XPath namespace prefixes are resolved from the contextNode.
return selectNodeIterator(contextNode, xpathnode, contextNode);
| public org.w3c.dom.traversal.NodeIterator | selectNodeIterator(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode, org.w3c.dom.Node namespaceNode)Use an XPath string to select a nodelist.
XPath namespace prefixes are resolved from the namespaceNode.
// Execute the XPath, and have it return the result
XObject list = eval(contextNode, xpathnode, getStrFromNode(xpathnode), namespaceNode);
// Have the XObject return its result as a NodeSetDTM.
return list.nodeset();
| public org.w3c.dom.NodeList | selectNodeList(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode, java.lang.String str, org.w3c.dom.Node namespaceNode)Use an XPath string to select a nodelist.
XPath namespace prefixes are resolved from the namespaceNode.
// Execute the XPath, and have it return the result
XObject list = eval(contextNode, xpathnode, str, namespaceNode);
// Return a NodeList.
return list.nodelist();
| public org.w3c.dom.NodeList | selectNodeList(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode)Use an XPath string to select a nodelist.
XPath namespace prefixes are resolved from the contextNode.
return selectNodeList(contextNode, xpathnode, getStrFromNode(xpathnode), contextNode);
| public org.w3c.dom.Node | selectSingleNode(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode)Use an XPath string to select a single node. XPath namespace
prefixes are resolved from the context node, which may not
be what you want (see the next method).
return selectSingleNode(contextNode, xpathnode, contextNode);
| public org.w3c.dom.Node | selectSingleNode(org.w3c.dom.Node contextNode, org.w3c.dom.Node xpathnode, org.w3c.dom.Node namespaceNode)Use an XPath string to select a single node.
XPath namespace prefixes are resolved from the namespaceNode.
// Have the XObject return its result as a NodeSetDTM.
NodeIterator nl = selectNodeIterator(contextNode, xpathnode,
namespaceNode);
// Return the first node, or null
return nl.nextNode();
|
|