예제 #1
0
  /**
   * 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;
  }
예제 #3
0
  /** @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;
  }
예제 #4
0
파일: ElemForEach.java 프로젝트: srnsw/xena
  /**
   * 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);
  }
예제 #5
0
파일: ElemForEach.java 프로젝트: srnsw/xena
  /**
   * 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);
 }
예제 #10
0
파일: ElemForEach.java 프로젝트: srnsw/xena
 /** @see ExpressionOwner#setExpression(Expression) */
 public void setExpression(Expression exp) {
   exp.exprSetParent(this);
   m_selectExpression = exp;
 }
예제 #11
0
 /**
  * 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);
 }
예제 #12
0
 /**
  * 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();
 }
예제 #13
0
 /** @see ExpressionOwner#setExpression(Expression) */
 public void setExpression(Expression exp) {
   exp.exprSetParent(this);
   m_arg0 = exp;
 }
예제 #14
0
 /** @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor) */
 public void callArgVisitors(XPathVisitor visitor) {
   if (null != m_arg0) m_arg0.callVisitors(this, visitor);
 }
예제 #15
0
파일: ElemForEach.java 프로젝트: srnsw/xena
  /**
   * 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();
    }
  }
예제 #16
0
 /** @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;
 }