javagenerator.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 2,601 行 · 第 1/5 页

JAVA
2,601
字号
      if (isSimple) {        println("if (node instanceof Element)");        if (isSingleString) {          print("  " + var + " = ((Element) node).getAttribute(\"");          print(exprString.substring(1));          println("\");");        }        else {          print("  " + var + ".append(((Element) node).getAttribute(\"");          print(exprString.substring(1));          println("\"));");        }        return;      }    }    else if (allowJavaSelect(select)) {      int oldSelectDepth = _selectDepth;      String loopVar = "_xsl_loop" + _unique++;      _selectLoopDepth = 0;            String ptr = printSelectBegin(select, true, loopVar);      if (isSingleString)        println(var + " = XmlUtil.textValue(" + ptr + ");");      else        println("XmlUtil.textValue(" + var + ", " + ptr + ");");      println("break " + loopVar + ";");      for (; _selectDepth > oldSelectDepth; _selectDepth--) {        popDepth();        println("}");      }      return;    }    if (isSingleString) {      println(var + " = _exprs[" + addExpr(exprString) +              "].evalString(node, " + getEnv() + ");");    }    else {      println("_exprs[" + addExpr(exprString) + "].evalString(" +              var + ", node, " + getEnv() + ");");    }  }  /**   * Prints iterator code to start a select.   */  private String printSelectBegin(AbstractPattern select,                                  boolean isForEach, String loopVar)    throws IOException, XslParseException  {    if (select == null)      throw new NullPointerException();        if (select instanceof FromContext &&        ((FromContext) select).getCount() == 0)      return "node";    else if (select instanceof FromRoot)      return "ownerDocument(node)";    boolean useXPath = allowJavaSelect(select);        String name = "node";    if (! useXPath) {      // punt and let XPath handle it.      String iterName = "_xsl_iter" + _unique++;            String ptrName = "_xsl_ptr" + _unique++;      if (isForEach)        println("env.setCurrentNode(node);");      println("Iterator " + iterName + " = _select_patterns[" +              addSelect(select) + "].select(" + name + ", env);");            if (loopVar != null && _selectLoopDepth == 0)        println(loopVar + ":");            println("while (" + iterName + ".hasNext()) {");      pushDepth();      _selectDepth++;      _selectLoopDepth++;      println("Node " + ptrName + " = (Node) " + iterName + ".next();");      return ptrName;    }    if (select instanceof FromChildren) {      name = printSelectBegin(select.getParent(), isForEach, loopVar);            String ptrName = "_xsl_ptr" + _unique++;      if (loopVar != null && _selectLoopDepth == 0)        println(loopVar + ":");            println("for (Node " + ptrName + " = " + name + ".getFirstChild();");      println("     " + ptrName + " != null;");      println("     " + ptrName + " = " + ptrName + ".getNextSibling()) {");      pushDepth();      _selectDepth++;      _selectLoopDepth++;      return ptrName;    }    else if (select instanceof FromNextSibling) {      name = printSelectBegin(select.getParent(), isForEach, loopVar);            String ptrName = "_xsl_ptr" + _unique++;            if (loopVar != null && _selectLoopDepth == 0)        println(loopVar + ":");            println("for (Node " + ptrName + " = " + name + ".getNextSibling();");      println("     " + ptrName + " != null;");      println("     " + ptrName + " = " + ptrName + ".getNextSibling()) {");      pushDepth();      _selectDepth++;      _selectLoopDepth++;      return ptrName;    }    else if (select instanceof NodePattern) {      name = printSelectBegin(select.getParent(), isForEach, loopVar);            NodePattern pat = (NodePattern) select;            println("if (" + name + ".getNodeName() == \"" + pat.getNodeName() + "\" &&");      println("    " + name + " instanceof Element) {");      pushDepth();      _selectDepth++;      return name;    }    else if (select instanceof NodeTypePattern) {      name = printSelectBegin(select.getParent(), isForEach, loopVar);            NodeTypePattern pat = (NodeTypePattern) select;      if (pat.getNodeType() >= 0) {        println("if (" + name + ".getNodeType() == " + pat.getNodeType() + ") {");        pushDepth();        _selectDepth++;      }      return name;    }    else if (select instanceof FilterPattern) {      String posId = "_xsl_pos" + _unique++;      println("int " + posId + " = 0;");            name = printSelectBegin(select.getParent(), isForEach, loopVar);      println(posId + "++;");            FilterPattern pat = (FilterPattern) select;      Expr expr = pat.getExpr();      if (expr instanceof NumericExpr) {        NumericExpr num = (NumericExpr) expr;        if (num.isConstant()) {          println("if (" + posId + " > " + (int) num.getValue() + ")");          println("  break;");          println("else if (" + posId + " == " + (int) num.getValue() + ") {");          pushDepth();          _selectDepth++;          return name;        }      }      throw new RuntimeException();    }    throw new RuntimeException(String.valueOf(select));  }  /**   * Returns true if we can compile in the java select.   */  private boolean allowJavaSelect(AbstractPattern select)  {    if (select == null)      return false;    else if (! select.isStrictlyAscending())      return false;        else if (select instanceof FromContext)      return ((FromContext) select).getCount() == 0;    else if (select instanceof FromRoot)      return true;    else if (select instanceof NodePattern)      return allowJavaSelect(select.getParent());    else if (select instanceof NodeTypePattern)      return allowJavaSelect(select.getParent());    else if (select instanceof FromChildren)      return allowJavaSelect(select.getParent());    else if (select instanceof FromNextSibling)      return allowJavaSelect(select.getParent());    else if (select instanceof FilterPattern) {      if (! allowJavaSelect(select.getParent()))        return false;      Expr expr = ((FilterPattern) select).getExpr();      return ((expr instanceof NumericExpr) &&              ((NumericExpr) expr).isConstant());    }    else      return false;  }  private void stringExpr(String exprString, Element element)    throws Exception, XslParseException  {    print("_exprs[" + addExpr(exprString) +          "].evalString(node, " + getEnv() + ")");  }  /**   * Adds an expression constant returning its index.   *   * @param expr the expression to add.   *   * @return the index into the runtime expression array   */  public int addExpr(Expr expr)    throws XslParseException  {    String exprStr = expr.toString();    int i = _exprMap.get(exprStr);    if (i >= 0)      return i;    i = _exprs.size();    _exprMap.put(exprStr, i);    _exprs.add(expr);        return i;  }  /**   * Adds an expression constant returning its index.   *   * @param exprString the expression to add.   *   * @return the index into the runtime expression array   */  public int addExpr(String exprString)    throws XslParseException  {    int i = _exprMap.get(exprString);    if (i >= 0)      return i;        Expr expr = parseExpr(exprString);    i = _exprs.size();    _exprs.add(expr);    _exprMap.put(exprString, i);    return i;  }  /**   * Adds a select pattern returning its index.   *   * @param select the select pattern to add.   *   * @return the index into the runtime expression array   */  public int addSelect(AbstractPattern select)    throws IOException, XslParseException  {    String selectStr = select.toString();    int i = _selectMap.get(selectStr);    if (i >= 0)      return i;    i = _selectPatterns.size();    _selectMap.put(selectStr, i);    _selectPatterns.add(select);        return i;  }  /**   * Adds a select pattern, returning its index.   *   * @param selectString the expression to add.   *   * @return the index into the runtime select pattern array   */  public int addSelect(String selectString)    throws IOException, XslParseException  {    int i = _selectMap.get(selectString);    if (i >= 0)      return i;        AbstractPattern select = parseSelect(selectString);    i = _selectPatterns.size();    _selectPatterns.add(select);    _selectMap.put(selectString, i);    return i;  }  /**   * Adds a match pattern, returning its index.   *   * @param pattern the expression to add.   *   * @return the index into the runtime expression array   */  public int addMatch(AbstractPattern pattern)    throws XslParseException  {    int index = _matchPatterns.size();    _matchPatterns.add(pattern);    return index;  }  protected StylesheetImpl completeGenerate(ArrayList<XslNode> inits,                                            ArrayList globals)    throws Exception  {    printTemplates();    printMacros();    printInitVars(inits);    printFragments();    printInit();        printStrings();    printExpressions();    printPatterns();    popDepth();    println("}");    _s.close();    _s = null;    /*    if (dbg.canWrite()) {      ReadStream is = path.openRead();      dbg.writeStream(is);      is.close();    }    */        if (_parentLoader instanceof DynamicClassLoader)      ((DynamicClassLoader) _parentLoader).make();        _compiler.compile(_path.getPath(), _lineMap);    StylesheetImpl stylesheet;    stylesheet = (StylesheetImpl) _xslGenerator.loadStylesheet(_path.getFullPath(),                                                               _pkg + "." + _className);    //if (stylesheet != null)    //  stylesheet.init(context);    return stylesheet;  }  private long getLastModified()  {    long lastModified = 0;    for (int i = 0; i < _depends.size(); i++) {      Path path = _depends.get(i);      if (path.getLastModified() > lastModified)	lastModified = path.getLastModified();    }    return lastModified;  }  /**   * Generate code executed for all transformations.   * <ul>   * <li>Add the stylesheet namespaces to the generated document.   * <li>Assign the global variables.   * <li>Initialize the cache dependencies.   */  protected void printInitVars(ArrayList<XslNode> inits)    throws Exception  {    println("private void _xsl_init_vars(XslWriter out, Node node, Env env)");    println("  throws Exception");    println("{");    pushDepth();    // Add the stylesheet namespaces to the generated document.    HashMap namespaces = _qDoc.getNamespaces();    if (namespaces != null) {      Iterator prefixes = namespaces.keySet().iterator();      while (prefixes.hasNext()) {        String prefix = (String) prefixes.next();        String url = (String) namespaces.get(prefix);        if (url.startsWith("http://www.w3.org/XSL/Transform/") ||            url.startsWith("http://www.w3.org/1999/XSL/Transform") ||            url.startsWith("http://www.w3.org/XML/2000/xmlns") ||            url.startsWith("http://www.w3.org/2000/xmlns") ||	    url.equals(XTPNS))          continue;        else if (_excludedNamespaces.get(url) != null)          continue;        else if (_namespaceAliases.get(url) != null)          continue;	if (prefix == null)	  println("out.addNamespace(\"\", \"" + url + "\");");	else	  println("out.addNamespace(\"" + prefix + "\", \"" + url + "\");");      }    }    // Initialize the global stylesheet variables    println("Object _xsl_tmp;");    for (int i = 0; i < inits.size(); i++) {      XslNode node = inits.get(i);      // NamespaceContext oldNamespace = addNamespace(elt);      node.generate(getOut());      /*      if ("variable".equals(getXslLocal(elt)) ||          "assign".equals(getXslLocal(elt))) {	String name = elt.getAttribute("name");	String expr = elt.getAttribute("select");	print("env.setGlobal(\"" + name + "\", ");	if (! expr.equals(""))	  printVariableValue(parseExpr(expr));	else	  printVariableValue(elt);	println(");");      }      else if ("param".equals(getXslLocal(elt))) {        String name = elt.getAttribute("name");        String expr = elt.getAttribute("select");        print("env.setGlobal(\"" + name + "\", ");        if (! expr.equals(""))          printVariableValue(parseExpr(expr));        else          printVariableValue(elt);        println(");");                 println("_xsl_tmp = out.getParameter(\"" + name + "\");");        println("if (_xsl_tmp != null)");        println("  env.setGlobal(\"" + name + "\", _xsl_tmp);");      }      */            // oldNamespace = _namespace;    }    // Initialize the cache dependencies.    println("com.caucho.vfs.Path pwd;");    println("pwd = (com.caucho.vfs.Path) out.getProperty(\"caucho.pwd\");");    for (int i = 0; i < _cacheDepends.size(); i++) {      String depend = (String) _cacheDepends.get(i);      print("out.addCacheDepend(pwd.lookup(\"");      printString(depend);      println("\"));");    }        popDepth();    println("}");  }  protected void printInit()    throws Exception  {    println("protected void _xsl_init(XslWriter out, Node node, Env env)");    println("  throws Exception");    println("{");    pushDepth();    println("Object _xsl_tmp;");    println("_xsl_init_vars(out, node, env);");    // Generic init vars    // println("templates = _staticTemplates;");    for (int i = 0; _globalActions != null && i < _globalActions.size(); i++) {      QAbstractNode node = (QAbstractNode) _globalActions.get(i);      generateChild(node);    }    popDepth();    println("}");    // depends    println("public boolean isModified()"); 

⌨️ 快捷键说明

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