/** * Set an argument expression for a function. This method is called by the XPath compiler. * * @param arg non-null expression that represents the argument. * @param argNum The argument number index. * @throws WrongNumberArgsException If the argNum parameter is greater than 0. */ public void setArg(Expression arg, int argNum) throws WrongNumberArgsException { if (0 == argNum) { m_arg0 = arg; arg.exprSetParent(this); } else reportWrongNumberArgs(); }
/** @see Expression#deepEquals(Expression) */ public boolean deepEquals(Expression expr) { if (!super.deepEquals(expr)) return false; FilterExprWalker walker = (FilterExprWalker) expr; if (!m_expr.deepEquals(walker.m_expr)) return false; return true; }
/** @see Expression#deepEquals(Expression) */ public boolean deepEquals(Expression expr) { if (!super.deepEquals(expr)) return false; if (null != m_arg0) { if (null == ((FunctionOneArg) expr).m_arg0) return false; if (!m_arg0.deepEquals(((FunctionOneArg) expr).m_arg0)) return false; } else if (null != ((FunctionOneArg) expr).m_arg0) return false; return true; }
/** * Call the children visitors. * * @param visitor The visitor whose appropriate method will be called. */ public void callChildVisitors(XSLTVisitor visitor, boolean callAttributes) { if (callAttributes && (null != m_selectExpression)) m_selectExpression.callVisitors(this, visitor); int length = getSortElemCount(); for (int i = 0; i < length; i++) { getSortElem(i).callVisitors(visitor); } super.callChildVisitors(visitor, callAttributes); }
/** * This function is called after everything else has been recomposed, and allows the template to * set remaining values that may be based on some other property that depends on recomposition. * * <p>NEEDSDOC @param sroot * * @throws TransformerException */ public void compose(StylesheetRoot sroot) throws TransformerException { super.compose(sroot); int length = getSortElemCount(); for (int i = 0; i < length; i++) { getSortElem(i).compose(sroot); } java.util.Vector vnames = sroot.getComposeState().getVariableNames(); if (null != m_selectExpression) m_selectExpression.fixupVariables(vnames, sroot.getComposeState().getGlobalsSize()); else { m_selectExpression = getStylesheetRoot().m_selectDefault.getExpression(); } }
/** * This will traverse the heararchy, calling the visitor for each member. If the called visitor * method returns false, the subtree should not be called. * * @param visitor The visitor whose appropriate method will be called. */ public void callPredicateVisitors(XPathVisitor visitor) { m_expr.callVisitors(new filterExprOwner(), visitor); super.callPredicateVisitors(visitor); }
/** @see ExpressionOwner#setExpression(Expression) */ public void setExpression(Expression exp) { exp.exprSetParent(FilterExprWalker.this); m_expr = exp; }
/** Set the inner contained expression of this filter. */ public void setInnerExpression(Expression expr) { expr.exprSetParent(this); m_expr = expr; }
/** * This function is used to fixup variables from QNames to stack frame indexes at stylesheet build * time. * * @param vars List of QNames that correspond to variables. This list should be searched backwards * for the first qualified name that corresponds to the variable reference qname. The position * of the QName in the vector from the start of the vector will be its position in the stack * frame (but variables above the globalsTop value will need to be offset to the current stack * frame). */ public void fixupVariables(java.util.Vector vars, int globalsSize) { super.fixupVariables(vars, globalsSize); m_expr.fixupVariables(vars, globalsSize); }
/** @see ExpressionOwner#setExpression(Expression) */ public void setExpression(Expression exp) { exp.exprSetParent(this); m_selectExpression = exp; }
/** * This function is used to fixup variables from QNames to stack frame indexes at stylesheet build * time. * * @param vars List of QNames that correspond to variables. This list should be searched backwards * for the first qualified name that corresponds to the variable reference qname. The position * of the QName in the vector from the start of the vector will be its position in the stack * frame (but variables above the globalsTop value will need to be offset to the current stack * frame). */ public void fixupVariables(java.util.Vector vars, int globalsSize) { if (null != m_arg0) m_arg0.fixupVariables(vars, globalsSize); }
/** * Tell if this expression or it's subexpressions can traverse outside the current subtree. * * @return true if traversal outside the context node's subtree can occur. */ public boolean canTraverseOutsideSubtree() { return m_arg0.canTraverseOutsideSubtree(); }
/** @see ExpressionOwner#setExpression(Expression) */ public void setExpression(Expression exp) { exp.exprSetParent(this); m_arg0 = exp; }
/** @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor) */ public void callArgVisitors(XPathVisitor visitor) { if (null != m_arg0) m_arg0.callVisitors(this, visitor); }
/** * Perform a query if needed, and call transformNode for each child. * * @param transformer non-null reference to the the current transform-time state. * @throws TransformerException Thrown in a variety of circumstances. * @xsl.usage advanced */ public void transformSelectedNodes(TransformerImpl transformer) throws TransformerException { final XPathContext xctxt = transformer.getXPathContext(); final int sourceNode = xctxt.getCurrentNode(); DTMIterator sourceNodes = m_selectExpression.asIterator(xctxt, sourceNode); try { final Vector keys = (m_sortElems == null) ? null : transformer.processSortKeys(this, sourceNode); // Sort if we need to. if (null != keys) sourceNodes = sortNodes(xctxt, keys, sourceNodes); if (transformer.getDebug()) { // The original code, which is broken for bug#16889, // which fails to get the original select expression in the select event. /* transformer.getTraceManager().fireSelectedEvent( * sourceNode, * this, * "select", * new XPath(m_selectExpression), * new org.apache.xpath.objects.XNodeSet(sourceNodes)); */ // The following code fixes bug#16889 // Solution: Store away XPath in setSelect(Xath), and use it here. // Pass m_xath, which the current node is associated with, onto the TraceManager. Expression expr = m_xpath.getExpression(); org.apache.xpath.objects.XObject xObject = expr.execute(xctxt); int current = xctxt.getCurrentNode(); transformer.getTraceManager().fireSelectedEvent(current, this, "select", m_xpath, xObject); } xctxt.pushCurrentNode(DTM.NULL); IntStack currentNodes = xctxt.getCurrentNodeStack(); xctxt.pushCurrentExpressionNode(DTM.NULL); IntStack currentExpressionNodes = xctxt.getCurrentExpressionNodeStack(); xctxt.pushSAXLocatorNull(); xctxt.pushContextNodeList(sourceNodes); transformer.pushElemTemplateElement(null); // pushParams(transformer, xctxt); // Should be able to get this from the iterator but there must be a bug. DTM dtm = xctxt.getDTM(sourceNode); int docID = sourceNode & DTMManager.IDENT_DTM_DEFAULT; int child; while (DTM.NULL != (child = sourceNodes.nextNode())) { currentNodes.setTop(child); currentExpressionNodes.setTop(child); if ((child & DTMManager.IDENT_DTM_DEFAULT) != docID) { dtm = xctxt.getDTM(child); docID = child & DTMManager.IDENT_DTM_DEFAULT; } // final int exNodeType = dtm.getExpandedTypeID(child); final int nodeType = dtm.getNodeType(child); // Fire a trace event for the template. if (transformer.getDebug()) { transformer.getTraceManager().fireTraceEvent(this); } // And execute the child templates. // Loop through the children of the template, calling execute on // each of them. for (ElemTemplateElement t = this.m_firstChild; t != null; t = t.m_nextSibling) { xctxt.setSAXLocator(t); transformer.setCurrentElement(t); t.execute(transformer); } if (transformer.getDebug()) { // We need to make sure an old current element is not // on the stack. See TransformerImpl#getElementCallstack. transformer.setCurrentElement(null); transformer.getTraceManager().fireTraceEndEvent(this); } // KLUGE: Implement <?xalan:doc_cache_off?> // ASSUMPTION: This will be set only when the XPath was indeed // a call to the Document() function. Calling it in other // situations is likely to fry Xalan. // // %REVIEW% We need a MUCH cleaner solution -- one that will // handle cleaning up after document() and getDTM() in other // contexts. The whole SourceTreeManager mechanism should probably // be moved into DTMManager rather than being explicitly invoked in // FuncDocument and here. if (m_doc_cache_off) { if (DEBUG) System.out.println( "JJK***** CACHE RELEASE *****\n" + "\tdtm=" + dtm.getDocumentBaseURI()); // NOTE: This will work because this is _NOT_ a shared DTM, and thus has // only a single Document node. If it could ever be an RTF or other // shared DTM, this would require substantial rework. xctxt.getSourceTreeManager().removeDocumentFromCache(dtm.getDocument()); xctxt.release(dtm, false); } } } finally { if (transformer.getDebug()) transformer .getTraceManager() .fireSelectedEndEvent( sourceNode, this, "select", new XPath(m_selectExpression), new org.apache.xpath.objects.XNodeSet(sourceNodes)); xctxt.popSAXLocator(); xctxt.popContextNodeList(); transformer.popElemTemplateElement(); xctxt.popCurrentExpressionNode(); xctxt.popCurrentNode(); sourceNodes.detach(); } }
/** @see ExpressionOwner#setExpression(Expression) */ public void setExpression(Expression exp) { exp.exprSetParent(UnionPattern.this); m_patterns[m_index] = (StepPattern) exp; }
/** * For support of literal objects in xpaths. * * @param xctxt The XPath execution context. * @return This object. * @throws javax.xml.transform.TransformerException */ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException { Expression expr = ((ElemVariable) m_obj).getSelect().getExpression(); XObject xobj = expr.execute(xctxt); xobj.allowDetachToRelease(false); return xobj; }