use of org.apache.xml.dtm.DTMIterator in project robovm by robovm.
the class WalkerFactory method newDTMIterator.
/**
* Create a new LocPathIterator iterator. The exact type of iterator
* returned is based on an analysis of the XPath operations.
*
* @param compiler non-null reference to compiler object that has processed
* the XPath operations into an opcode map.
* @param opPos The position of the operation code for this itterator.
*
* @return non-null reference to a LocPathIterator or derivative.
*
* @throws javax.xml.transform.TransformerException
*/
public static DTMIterator newDTMIterator(Compiler compiler, int opPos, boolean isTopLevel) throws javax.xml.transform.TransformerException {
int firstStepPos = OpMap.getFirstChildPos(opPos);
int analysis = analyze(compiler, firstStepPos, 0);
boolean isOneStep = isOneStep(analysis);
DTMIterator iter;
// Is the iteration a one-step attribute pattern (i.e. select="@foo")?
if (isOneStep && walksSelfOnly(analysis) && isWild(analysis) && !hasPredicate(analysis)) {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("SelfIteratorNoPredicate", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new SelfIteratorNoPredicate(compiler, opPos, analysis);
} else // Is the iteration exactly one child step?
if (walksChildrenOnly(analysis) && isOneStep) {
// Does the pattern specify *any* child with no predicate? (i.e. select="child::node()".
if (isWild(analysis) && !hasPredicate(analysis)) {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("ChildIterator", analysis, compiler);
// Use simple child iteration without any test.
iter = new ChildIterator(compiler, opPos, analysis);
} else {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("ChildTestIterator", analysis, compiler);
// Else use simple node test iteration with predicate test.
iter = new ChildTestIterator(compiler, opPos, analysis);
}
} else // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
if (isOneStep && walksAttributes(analysis)) {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("AttributeIterator", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new AttributeIterator(compiler, opPos, analysis);
} else if (isOneStep && !walksFilteredList(analysis)) {
if (!walksNamespaces(analysis) && (walksInDocOrder(analysis) || isSet(analysis, BIT_PARENT))) {
if (false || DEBUG_ITERATOR_CREATION)
diagnoseIterator("OneStepIteratorForward", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new OneStepIteratorForward(compiler, opPos, analysis);
} else {
if (false || DEBUG_ITERATOR_CREATION)
diagnoseIterator("OneStepIterator", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new OneStepIterator(compiler, opPos, analysis);
}
} else // to work right.
if (isOptimizableForDescendantIterator(compiler, firstStepPos, 0)) // && getStepCount(analysis) <= 3
// && walksDescendants(analysis)
// && walksSubtreeOnlyFromRootOrContext(analysis)
{
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("DescendantIterator", analysis, compiler);
iter = new DescendantIterator(compiler, opPos, analysis);
} else {
if (isNaturalDocOrder(compiler, firstStepPos, 0, analysis)) {
if (false || DEBUG_ITERATOR_CREATION) {
diagnoseIterator("WalkingIterator", analysis, compiler);
}
iter = new WalkingIterator(compiler, opPos, analysis, true);
} else {
// return new MatchPatternIterator(compiler, opPos, analysis);
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("WalkingIteratorSorted", analysis, compiler);
iter = new WalkingIteratorSorted(compiler, opPos, analysis, true);
}
}
if (iter instanceof LocPathIterator)
((LocPathIterator) iter).setIsTopLevel(isTopLevel);
return iter;
}
use of org.apache.xml.dtm.DTMIterator in project robovm by robovm.
the class FunctionPattern method execute.
/**
* Test a node to see if it matches the given node test.
*
* @param xctxt XPath runtime context.
*
* @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
* {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
* {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
* {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
* {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
*
* @throws javax.xml.transform.TransformerException
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException {
int context = xctxt.getCurrentNode();
DTMIterator nl = m_functionExpr.asIterator(xctxt, context);
XNumber score = SCORE_NONE;
if (null != nl) {
int n;
while (DTM.NULL != (n = nl.nextNode())) {
score = (n == context) ? SCORE_OTHER : SCORE_NONE;
if (score == SCORE_OTHER) {
context = n;
break;
}
}
nl.detach();
}
return score;
}
use of org.apache.xml.dtm.DTMIterator in project robovm by robovm.
the class NotEqualComparator method compare.
/**
* Tell if one object is less than the other.
*
* @param obj2 Object to compare this nodeset to
* @param comparator Comparator to use
*
* @return See the comments below for each object type comparison
*
* @throws javax.xml.transform.TransformerException
*/
public boolean compare(XObject obj2, Comparator comparator) throws javax.xml.transform.TransformerException {
boolean result = false;
int type = obj2.getType();
if (XObject.CLASS_NODESET == type) {
// %OPT% This should be XMLString based instead of string based...
// From http://www.w3.org/TR/xpath:
// If both objects to be compared are node-sets, then the comparison
// will be true if and only if there is a node in the first node-set
// and a node in the second node-set such that the result of performing
// the comparison on the string-values of the two nodes is true.
// Note this little gem from the draft:
// NOTE: If $x is bound to a node-set, then $x="foo"
// does not mean the same as not($x!="foo"): the former
// is true if and only if some node in $x has the string-value
// foo; the latter is true if and only if all nodes in $x have
// the string-value foo.
DTMIterator list1 = iterRaw();
DTMIterator list2 = ((XNodeSet) obj2).iterRaw();
int node1;
java.util.Vector node2Strings = null;
while (DTM.NULL != (node1 = list1.nextNode())) {
XMLString s1 = getStringFromNode(node1);
if (null == node2Strings) {
int node2;
while (DTM.NULL != (node2 = list2.nextNode())) {
XMLString s2 = getStringFromNode(node2);
if (comparator.compareStrings(s1, s2)) {
result = true;
break;
}
if (null == node2Strings)
node2Strings = new java.util.Vector();
node2Strings.addElement(s2);
}
} else {
int n = node2Strings.size();
for (int i = 0; i < n; i++) {
if (comparator.compareStrings(s1, (XMLString) node2Strings.elementAt(i))) {
result = true;
break;
}
}
}
}
list1.reset();
list2.reset();
} else if (XObject.CLASS_BOOLEAN == type) {
// From http://www.w3.org/TR/xpath:
// If one object to be compared is a node-set and the other is a boolean,
// then the comparison will be true if and only if the result of
// performing the comparison on the boolean and on the result of
// converting the node-set to a boolean using the boolean function
// is true.
double num1 = bool() ? 1.0 : 0.0;
double num2 = obj2.num();
result = comparator.compareNumbers(num1, num2);
} else if (XObject.CLASS_NUMBER == type) {
// From http://www.w3.org/TR/xpath:
// If one object to be compared is a node-set and the other is a number,
// then the comparison will be true if and only if there is a
// node in the node-set such that the result of performing the
// comparison on the number to be compared and on the result of
// converting the string-value of that node to a number using
// the number function is true.
DTMIterator list1 = iterRaw();
double num2 = obj2.num();
int node;
while (DTM.NULL != (node = list1.nextNode())) {
double num1 = getNumberFromNode(node);
if (comparator.compareNumbers(num1, num2)) {
result = true;
break;
}
}
list1.reset();
} else if (XObject.CLASS_RTREEFRAG == type) {
XMLString s2 = obj2.xstr();
DTMIterator list1 = iterRaw();
int node;
while (DTM.NULL != (node = list1.nextNode())) {
XMLString s1 = getStringFromNode(node);
if (comparator.compareStrings(s1, s2)) {
result = true;
break;
}
}
list1.reset();
} else if (XObject.CLASS_STRING == type) {
// From http://www.w3.org/TR/xpath:
// If one object to be compared is a node-set and the other is a
// string, then the comparison will be true if and only if there
// is a node in the node-set such that the result of performing
// the comparison on the string-value of the node and the other
// string is true.
XMLString s2 = obj2.xstr();
DTMIterator list1 = iterRaw();
int node;
while (DTM.NULL != (node = list1.nextNode())) {
XMLString s1 = getStringFromNode(node);
if (comparator.compareStrings(s1, s2)) {
result = true;
break;
}
}
list1.reset();
} else {
result = comparator.compareNumbers(this.num(), obj2.num());
}
return result;
}
use of org.apache.xml.dtm.DTMIterator in project j2objc by google.
the class UnionPathIterator method setRoot.
/**
* Initialize the context values for this expression
* after it is cloned.
*
* @param context The XPath runtime context for this
* transformation.
*/
public void setRoot(int context, Object environment) {
super.setRoot(context, environment);
try {
if (null != m_exprs) {
int n = m_exprs.length;
DTMIterator[] newIters = new DTMIterator[n];
for (int i = 0; i < n; i++) {
DTMIterator iter = m_exprs[i].asIterator(m_execContext, context);
newIters[i] = iter;
iter.nextNode();
}
m_iterators = newIters;
}
} catch (Exception e) {
throw new org.apache.xml.utils.WrappedRuntimeException(e);
}
}
use of org.apache.xml.dtm.DTMIterator in project j2objc by google.
the class WalkerFactory method newDTMIterator.
/**
* Create a new LocPathIterator iterator. The exact type of iterator
* returned is based on an analysis of the XPath operations.
*
* @param compiler non-null reference to compiler object that has processed
* the XPath operations into an opcode map.
* @param opPos The position of the operation code for this itterator.
*
* @return non-null reference to a LocPathIterator or derivative.
*
* @throws javax.xml.transform.TransformerException
*/
public static DTMIterator newDTMIterator(Compiler compiler, int opPos, boolean isTopLevel) throws javax.xml.transform.TransformerException {
int firstStepPos = OpMap.getFirstChildPos(opPos);
int analysis = analyze(compiler, firstStepPos, 0);
boolean isOneStep = isOneStep(analysis);
DTMIterator iter;
// Is the iteration a one-step attribute pattern (i.e. select="@foo")?
if (isOneStep && walksSelfOnly(analysis) && isWild(analysis) && !hasPredicate(analysis)) {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("SelfIteratorNoPredicate", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new SelfIteratorNoPredicate(compiler, opPos, analysis);
} else // Is the iteration exactly one child step?
if (walksChildrenOnly(analysis) && isOneStep) {
// Does the pattern specify *any* child with no predicate? (i.e. select="child::node()".
if (isWild(analysis) && !hasPredicate(analysis)) {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("ChildIterator", analysis, compiler);
// Use simple child iteration without any test.
iter = new ChildIterator(compiler, opPos, analysis);
} else {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("ChildTestIterator", analysis, compiler);
// Else use simple node test iteration with predicate test.
iter = new ChildTestIterator(compiler, opPos, analysis);
}
} else // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
if (isOneStep && walksAttributes(analysis)) {
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("AttributeIterator", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new AttributeIterator(compiler, opPos, analysis);
} else if (isOneStep && !walksFilteredList(analysis)) {
if (!walksNamespaces(analysis) && (walksInDocOrder(analysis) || isSet(analysis, BIT_PARENT))) {
if (false || DEBUG_ITERATOR_CREATION)
diagnoseIterator("OneStepIteratorForward", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new OneStepIteratorForward(compiler, opPos, analysis);
} else {
if (false || DEBUG_ITERATOR_CREATION)
diagnoseIterator("OneStepIterator", analysis, compiler);
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
iter = new OneStepIterator(compiler, opPos, analysis);
}
} else // to work right.
if (isOptimizableForDescendantIterator(compiler, firstStepPos, 0)) // && getStepCount(analysis) <= 3
// && walksDescendants(analysis)
// && walksSubtreeOnlyFromRootOrContext(analysis)
{
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("DescendantIterator", analysis, compiler);
iter = new DescendantIterator(compiler, opPos, analysis);
} else {
if (isNaturalDocOrder(compiler, firstStepPos, 0, analysis)) {
if (false || DEBUG_ITERATOR_CREATION) {
diagnoseIterator("WalkingIterator", analysis, compiler);
}
iter = new WalkingIterator(compiler, opPos, analysis, true);
} else {
// return new MatchPatternIterator(compiler, opPos, analysis);
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("WalkingIteratorSorted", analysis, compiler);
iter = new WalkingIteratorSorted(compiler, opPos, analysis, true);
}
}
if (iter instanceof LocPathIterator)
((LocPathIterator) iter).setIsTopLevel(isTopLevel);
return iter;
}
Aggregations