walkerfactory.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,871 行 · 第 1/5 页

JAVA
1,871
字号
    case OpCodes.FROM_DESCENDANTS :      axis = Axis.ANCESTOR;      predicateAxis = Axis.DESCENDANT;      break;    default :      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "                                 //+ stepType);    }    if(null == ai)    {      whatToShow = compiler.getWhatToShow(opPos); // %REVIEW%      ai = new StepPattern(whatToShow, compiler.getStepNS(opPos),                                compiler.getStepLocalName(opPos),                                axis, predicateAxis);    }       if (false || DEBUG_PATTERN_CREATION)    {      System.out.print("new step: "+ ai);      System.out.print(", axis: " + Axis.names[ai.getAxis()]);      System.out.print(", predAxis: " + Axis.names[ai.getAxis()]);      System.out.print(", what: ");      System.out.print("    ");      ai.debugWhatToShow(ai.getWhatToShow());    }    int argLen = compiler.getFirstPredicateOpPos(opPos);    ai.setPredicates(compiler.getCompiledPredicates(argLen));    return ai;  }  /**   * Analyze a step and give information about it's predicates.  Right now this   * just returns true or false if the step has a predicate.   *   * @param compiler non-null reference to compiler object that has processed   *                 the XPath operations into an opcode map.   * @param opPos The opcode position for the step.   * @param stepType The type of step, one of OP_GROUP, etc.   *   * @return true if step has a predicate.   *   * @throws javax.xml.transform.TransformerException   */  static boolean analyzePredicate(Compiler compiler, int opPos, int stepType)          throws javax.xml.transform.TransformerException  {    int argLen;    switch (stepType)    {    case OpCodes.OP_VARIABLE :    case OpCodes.OP_EXTFUNCTION :    case OpCodes.OP_FUNCTION :    case OpCodes.OP_GROUP :      argLen = compiler.getArgLength(opPos);      break;    default :      argLen = compiler.getArgLengthOfStep(opPos);    }    int pos = compiler.getFirstPredicateOpPos(opPos);    int nPredicates = compiler.countPredicates(pos);    return (nPredicates > 0) ? true : false;  }  /**   * Create the proper Walker from the axes type.   *   * @param compiler non-null reference to compiler object that has processed   *                 the XPath operations into an opcode map.   * @param opPos The opcode position for the step.   * @param lpi The owning location path iterator.   * @param analysis 32 bits of analysis, from which the type of AxesWalker   *                 may be influenced.   *   * @return non-null reference to AxesWalker derivative.   * @throws RuntimeException if the input is bad.   */  private static AxesWalker createDefaultWalker(Compiler compiler, int opPos,          WalkingIterator lpi, int analysis)  {    AxesWalker ai = null;    int stepType = compiler.getOp(opPos);    /*    System.out.println("0: "+compiler.getOp(opPos));    System.out.println("1: "+compiler.getOp(opPos+1));    System.out.println("2: "+compiler.getOp(opPos+2));    System.out.println("3: "+compiler.getOp(opPos+3));    System.out.println("4: "+compiler.getOp(opPos+4));    System.out.println("5: "+compiler.getOp(opPos+5));    */    boolean simpleInit = false;    int totalNumberWalkers = (analysis & BITS_COUNT);    boolean prevIsOneStepDown = true;    switch (stepType)    {    case OpCodes.OP_VARIABLE :    case OpCodes.OP_EXTFUNCTION :    case OpCodes.OP_FUNCTION :    case OpCodes.OP_GROUP :      prevIsOneStepDown = false;      if (DEBUG_WALKER_CREATION)        System.out.println("new walker:  FilterExprWalker: " + analysis                           + ", " + compiler.toString());      ai = new FilterExprWalker(lpi);      simpleInit = true;      break;    case OpCodes.FROM_ROOT :      ai = new AxesWalker(lpi, Axis.ROOT);      break;    case OpCodes.FROM_ANCESTORS :      prevIsOneStepDown = false;      ai = new ReverseAxesWalker(lpi, Axis.ANCESTOR);      break;    case OpCodes.FROM_ANCESTORS_OR_SELF :      prevIsOneStepDown = false;      ai = new ReverseAxesWalker(lpi, Axis.ANCESTORORSELF);      break;    case OpCodes.FROM_ATTRIBUTES :      ai = new AxesWalker(lpi, Axis.ATTRIBUTE);      break;    case OpCodes.FROM_NAMESPACE :      ai = new AxesWalker(lpi, Axis.NAMESPACE);      break;    case OpCodes.FROM_CHILDREN :      ai = new AxesWalker(lpi, Axis.CHILD);      break;    case OpCodes.FROM_DESCENDANTS :      prevIsOneStepDown = false;      ai = new AxesWalker(lpi, Axis.DESCENDANT);      break;    case OpCodes.FROM_DESCENDANTS_OR_SELF :      prevIsOneStepDown = false;      ai = new AxesWalker(lpi, Axis.DESCENDANTORSELF);      break;    case OpCodes.FROM_FOLLOWING :      prevIsOneStepDown = false;      ai = new AxesWalker(lpi, Axis.FOLLOWING);      break;    case OpCodes.FROM_FOLLOWING_SIBLINGS :      prevIsOneStepDown = false;      ai = new AxesWalker(lpi, Axis.FOLLOWINGSIBLING);      break;    case OpCodes.FROM_PRECEDING :      prevIsOneStepDown = false;      ai = new ReverseAxesWalker(lpi, Axis.PRECEDING);      break;    case OpCodes.FROM_PRECEDING_SIBLINGS :      prevIsOneStepDown = false;      ai = new ReverseAxesWalker(lpi, Axis.PRECEDINGSIBLING);      break;    case OpCodes.FROM_PARENT :      prevIsOneStepDown = false;      ai = new ReverseAxesWalker(lpi, Axis.PARENT);      break;    case OpCodes.FROM_SELF :      ai = new AxesWalker(lpi, Axis.SELF);      break;    default :      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "                                 //+ stepType);    }    if (simpleInit)    {      ai.initNodeTest(DTMFilter.SHOW_ALL);    }    else    {      int whatToShow = compiler.getWhatToShow(opPos);      /*      System.out.print("construct: ");      NodeTest.debugWhatToShow(whatToShow);      System.out.println("or stuff: "+(whatToShow & (DTMFilter.SHOW_ATTRIBUTE                             | DTMFilter.SHOW_ELEMENT                             | DTMFilter.SHOW_PROCESSING_INSTRUCTION)));      */      if ((0 == (whatToShow                 & (DTMFilter.SHOW_ATTRIBUTE | DTMFilter.SHOW_NAMESPACE | DTMFilter.SHOW_ELEMENT                    | DTMFilter.SHOW_PROCESSING_INSTRUCTION))) || (whatToShow == DTMFilter.SHOW_ALL))        ai.initNodeTest(whatToShow);      else      {        ai.initNodeTest(whatToShow, compiler.getStepNS(opPos),                        compiler.getStepLocalName(opPos));      }    }    return ai;  }    public static String getAnalysisString(int analysis)  {    StringBuffer buf = new StringBuffer();    buf.append("count: "+getStepCount(analysis)+" ");    if((analysis & BIT_NODETEST_ANY) != 0)    {      buf.append("NTANY|");    }    if((analysis & BIT_PREDICATE) != 0)    {      buf.append("PRED|");    }    if((analysis & BIT_ANCESTOR) != 0)    {      buf.append("ANC|");    }    if((analysis & BIT_ANCESTOR_OR_SELF) != 0)    {      buf.append("ANCOS|");    }    if((analysis & BIT_ATTRIBUTE) != 0)    {      buf.append("ATTR|");    }    if((analysis & BIT_CHILD) != 0)    {      buf.append("CH|");    }    if((analysis & BIT_DESCENDANT) != 0)    {      buf.append("DESC|");    }    if((analysis & BIT_DESCENDANT_OR_SELF) != 0)    {      buf.append("DESCOS|");    }    if((analysis & BIT_FOLLOWING) != 0)    {      buf.append("FOL|");    }    if((analysis & BIT_FOLLOWING_SIBLING) != 0)    {      buf.append("FOLS|");    }    if((analysis & BIT_NAMESPACE) != 0)    {      buf.append("NS|");    }    if((analysis & BIT_PARENT) != 0)    {      buf.append("P|");    }    if((analysis & BIT_PRECEDING) != 0)    {      buf.append("PREC|");    }    if((analysis & BIT_PRECEDING_SIBLING) != 0)    {      buf.append("PRECS|");    }    if((analysis & BIT_SELF) != 0)    {      buf.append(".|");    }    if((analysis & BIT_FILTER) != 0)    {      buf.append("FLT|");    }    if((analysis & BIT_ROOT) != 0)    {      buf.append("R|");    }    return buf.toString();  }  /** Set to true for diagnostics about walker creation */  static final boolean DEBUG_PATTERN_CREATION = false;  /** Set to true for diagnostics about walker creation */  static final boolean DEBUG_WALKER_CREATION = false;  /** Set to true for diagnostics about iterator creation */  static final boolean DEBUG_ITERATOR_CREATION = false;    public static boolean hasPredicate(int analysis)  {    return (0 != (analysis & BIT_PREDICATE));  }  public static boolean isWild(int analysis)  {    return (0 != (analysis & BIT_NODETEST_ANY));  }  public static boolean walksAncestors(int analysis)  {    return isSet(analysis, BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);  }    public static boolean walksAttributes(int analysis)  {    return (0 != (analysis & BIT_ATTRIBUTE));  }  public static boolean walksNamespaces(int analysis)  {    return (0 != (analysis & BIT_NAMESPACE));  }    public static boolean walksChildren(int analysis)  {    return (0 != (analysis & BIT_CHILD));  }  public static boolean walksDescendants(int analysis)  {    return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF);  }  public static boolean walksSubtree(int analysis)  {    return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF | BIT_CHILD);  }    public static boolean walksSubtreeOnlyMaybeAbsolute(int analysis)  {    return walksSubtree(analysis)           && !walksExtraNodes(analysis)            && !walksUp(analysis)            && !walksSideways(analysis)            ;  }    public static boolean walksSubtreeOnly(int analysis)  {    return walksSubtreeOnlyMaybeAbsolute(analysis)            && !isAbsolute(analysis)            ;  }  public static boolean walksFilteredList(int analysis)  {    return isSet(analysis, BIT_FILTER);  }    public static boolean walksSubtreeOnlyFromRootOrContext(int analysis)  {    return walksSubtree(analysis)           && !walksExtraNodes(analysis)            && !walksUp(analysis)            && !walksSideways(analysis)            && !isSet(analysis, BIT_FILTER)            ;  }  public static boolean walksInDocOrder(int analysis)  {    return (walksSubtreeOnlyMaybeAbsolute(analysis)           || walksExtraNodesOnly(analysis)           || walksFollowingOnlyMaybeAbsolute(analysis))            && !isSet(analysis, BIT_FILTER)            ;  }    public static boolean walksFollowingOnlyMaybeAbsolute(int analysis)  {    return isSet(analysis, BIT_SELF | BIT_FOLLOWING_SIBLING | BIT_FOLLOWING)           && !walksSubtree(analysis)            && !walksUp(analysis)            && !walksSideways(analysis)            ;  }  

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?