Methods Summary |
---|
public void | allowDetachToRelease(boolean allowRelease)Specify if it's OK for detach to release the iterator for reuse.
m_allowRelease = allowRelease;
|
public void | appendToFsb(com.sun.org.apache.xml.internal.utils.FastStringBuffer fsb)Cast result object to a string.
XString xstring = (XString)xstr();
xstring.appendToFsb(fsb);
|
public com.sun.org.apache.xml.internal.dtm.DTMIterator | asNodeIterator()Cast result object to a DTMIterator.
dml - modified to return an RTFIterator for
benefit of EXSLT object-type function in
{@link com.sun.org.apache.xalan.internal.lib.ExsltCommon}.
return new RTFIterator(m_dtmRoot, m_xctxt.getDTMManager());
|
public boolean | bool()Cast result object to a boolean. This always returns true for a RTreeFrag
because it is treated like a node-set with a single root node.
return true;
|
public org.w3c.dom.NodeList | convertToNodeset()Cast result object to a nodelist. (special function).
if (m_obj instanceof NodeList)
return (NodeList) m_obj;
else
return new com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList(asNodeIterator());
|
public void | destruct()Forces the object to release it's resources. This is more harsh than
detach(). You can call destruct as many times as you want.
if(null != m_dtm)
{
// For this next check, see http://nagoya.apache.org/bugzilla/show_bug.cgi?id=7622.
// What happens if you don't do this this check:
// 1) Transform#1 creates an XRTreeFrag. This has a reference to a DTM, that in turn
// is registered with a DTMManager. The DTM will need to be deleted from the
// DTMManager when the XRTreeFrag is deleted. The XRTreeFrag also contains a
// reference to the XPathContext.
// 2) Transform#1 completes. The XPathContext is reset... namely the a bunch
// of structures are reset or rebuilt, including DTMManagerDefault#m_dtms.
// BUT, the XRTreeFrags are still hanging around, waiting to unregister themselves.
// 3) Transform#2 starts humming along. It builds a XRTreeFrag and installs that
// RTF DTM into DTMManagerDefault#m_dtms[2].
// 4) The finalizer thread wakes and decides to delete some of those old XRTreeFrags
// from Transform#1.
// 5) The XRTreeFrag#finalize() method references through the XPathContext, and
// deletes what it thinks is it's DTM from DTMManagerDefault#m_dtms[2] (via
// getDTMIdentity(dtm)).
// 6) Transform#2 tries to reference DTMManagerDefault#m_dtms[2], finds it is
// null, and chaos results.
int ident = m_xctxt.getDTMIdentity(m_dtm);
DTM foundDTM = m_xctxt.getDTM(ident);
if(foundDTM == m_dtm)
{
m_xctxt.release(m_dtm, true);
m_dtm = null;
m_xctxt = null;
}
}
m_obj = null;
|
public void | detach()Detaches the DTMIterator from the set which it iterated
over, releasing any computational resources and placing the iterator
in the INVALID state. After detach has been invoked,
calls to nextNode or previousNode will
raise a runtime exception.
In general, detach should only be called once on the object.
if(m_allowRelease)
{
// %REVIEW% Do we actually _need_ detach, now that DTM RTF
// storage is managed as a stack?
// See #destruct() for a comment about this next check.
int ident = m_xctxt.getDTMIdentity(m_dtm);
DTM foundDTM = m_xctxt.getDTM(ident);
if(foundDTM == m_dtm)
{
m_xctxt.release(m_dtm, true);
m_dtm = null;
m_xctxt = null;
}
m_obj = null;
}
|
public boolean | equals(com.sun.org.apache.xpath.internal.objects.XObject obj2)Tell if two objects are functionally equal.
try
{
if (XObject.CLASS_NODESET == obj2.getType())
{
// In order to handle the 'all' semantics of
// nodeset comparisons, we always call the
// nodeset function.
return obj2.equals(this);
}
else if (XObject.CLASS_BOOLEAN == obj2.getType())
{
return bool() == obj2.bool();
}
else if (XObject.CLASS_NUMBER == obj2.getType())
{
return num() == obj2.num();
}
else if (XObject.CLASS_NODESET == obj2.getType())
{
return xstr().equals(obj2.xstr());
}
else if (XObject.CLASS_STRING == obj2.getType())
{
return xstr().equals(obj2.xstr());
}
else if (XObject.CLASS_RTREEFRAG == obj2.getType())
{
// Probably not so good. Think about this.
return xstr().equals(obj2.xstr());
}
else
{
return super.equals(obj2);
}
}
catch(javax.xml.transform.TransformerException te)
{
throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(te);
}
|
protected void | finalize()Release any resources this object may have by calling destruct().
%ISSUE% This release will occur asynchronously. Resources it manipulates
MUST be thread-safe!
try
{
destruct();
}
finally
{
super.finalize(); // Always use this.
}
|
public int | getType()Tell what kind of class this is.
return CLASS_RTREEFRAG;
|
public java.lang.String | getTypeString()Given a request type, return the equivalent string.
For diagnostic purposes.
return "#RTREEFRAG";
|
public double | num()Cast result object to a number.
XMLString s = xstr();
return s.toDouble();
|
public java.lang.Object | object()Return a java object that's closest to the representation
that should be handed to an extension.
if (m_xctxt != null)
return new com.sun.org.apache.xml.internal.dtm.ref.DTMNodeIterator((DTMIterator)(new com.sun.org.apache.xpath.internal.NodeSetDTM(m_dtmRoot, m_xctxt.getDTMManager())));
else
return super.object();
|
public int | rtf()Cast result object to a result tree fragment.
return m_dtmRoot;
|
public java.lang.String | str()Cast result object to a string.
String str = m_dtm.getStringValue(m_dtmRoot).toString();
return (null == str) ? "" : str;
|
public com.sun.org.apache.xml.internal.utils.XMLString | xstr()Cast result object to an XMLString.
if(null == m_xmlStr)
m_xmlStr = m_dtm.getStringValue(m_dtmRoot);
return m_xmlStr;
|