javagenerator.java

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

JAVA
2,601
字号
    printExprTest(test, "node");    println(") {");    pushDepth();    generateChildren(element);    popDepth();    println("}");  }  protected void printDeclaration(Element element)    throws Exception  {    println(((QAbstractNode) element).getTextValue());  }  protected void printCacheDepends(String name)    throws Exception  {    print("out.addCacheDepend(((com.caucho.vfs.Path) out.getProperty(\"caucho.pwd\")).lookup(\"");    printString(name);    println("\"));");  }  public String getElement()  {    return "node" + _loopDepth;  }  public void pushLoop()  {    _loopDepth++;  }  public void popLoop()  {    _loopDepth--;  }  public String getEnv()  {    return "env";  }  void pushEnv()  {    _envDepth.add(0);  }  void popEnv()  {    _envDepth.pop();  }  void printPattern(AbstractPattern pattern)    throws Exception  {    if (pattern == null)      print("null");    else {      print("_match_patterns[" + _matchPatterns.size() + "]");      _matchPatterns.add(pattern);    }  }  private int createNodeSet(String select, Element element)    throws Exception  {    return addSelect(select);  }    int createSelectPattern(AbstractPattern pattern)    throws Exception  {    return addSelect(pattern);  }  int createMatchPattern(String select, Element element)    throws Exception  {    AbstractPattern pattern = parseMatch(select);    _matchPatterns.add(pattern);    return _matchPatterns.size() - 1;  }  String getName(String tag)  {    CharBuffer newTag = new CharBuffer();    for (int i = 0; i < tag.length(); i++) {      int ch = tag.charAt(i);      switch (ch) {      case ' ':      case '\t':      case '\r':      case '\n':      case '(':      case ')':	break;      case ':':      case '.':      case '|':	newTag.append('_');	break;      default:	if (ch >= 'a' && ch <= 'z' ||	    ch >= 'A' && ch <= 'Z' ||	    ch >= '0' && ch <= '9')	  newTag.append((char) ch);      }    }    tag = newTag.toString();    if (_names.get(tag) == null) {      _names.put(tag, tag);      return tag;    }    int i = 0;    while (true) {      String subname = tag + i;      if (_names.get(subname) == null) {	_names.put(subname, subname);	return subname;      }      i++;    }  }  void printExprTest(Expr expr, String element)    throws Exception  {    print("_exprs[" + addExpr(expr) + "].evalBoolean(" + element + 	  ", " + getEnv() + ")");  }  public void printExprTest(int exprId, String element)    throws Exception  {    print("_exprs[" + exprId + "].evalBoolean(" + element + 	  ", " + getEnv() + ")");  }  private boolean attributeHasSpecial(String string)  {    int length = string.length();        for (int i = 0; i < length; i++) {      char ch = string.charAt(i);      if (ch == '{' && i + 1 < length) {	// {{ is treated as a single {	if (string.charAt(i + 1) == '{') {	  i++;          continue;	}        return true;      }      // <#= interpolates      else if (i + 2 < length && ch == '<' && 	       string.charAt(i + 1) == '#' &&	       string.charAt(i + 2) == '=')        return true;    }    return false;  }  /**   * Produces code to generate an attribute value template.  The same   * code is used to produce a string ('a{b}c' -> "a" + b + "c") or a series of   * print statements (',').   *   * @param string the source template   * @param mode separator: either '+' or ','   * @param elt the containing element.  Needed for namespaces.   */  void generateString(String string, int mode, Element elt)    throws Exception  {    CharBuffer cb = new CharBuffer();    int i = 0;    boolean first = true;    int length = string.length();    for (; i < length; i++) {      char ch = string.charAt(i);      if (ch == '\n') {	cb.append("\\n");      }      else if (ch == '"') {	cb.append("\\\"");      }      else if (ch == '{' && i + 1 < length) {	// {{ is treated as a single {	if (string.charAt(i + 1) == '{') {	  cb.append('{');	  i++;	}	// the value is computed from an XPath expr	else {	  // print the gathered text if any	  if (mode == ',') {	    if (cb.length() > 0)	      println("out.print(\"" + cb.toString() + "\");");	  }	  else {	    if (! first)	      print((char) mode);	    if (cb.length() > 0) {	      print("\"");	      print(cb.toString());	      print("\"");	      print((char) mode);	    }	  }	  // scan the contents of '{' ... '}'	  cb.clear();	  for (i++; i < length && string.charAt(i) != '}'; i++)	    cb.append(string.charAt(i));	  // and add the results	  if (mode == ',')	    printStringExpr(cb.toString(), elt);	  else	    stringExpr(cb.toString(), elt);	  cb.clear();	  first = false;	}      }      // }} is treated as a single }      else if (ch == '}' && i + 1 < length) {	if (string.charAt(i + 1) == '}') {	  cb.append('}');	  i++;	}	else	  cb.append('}');      }      // <#= interpolates      else if (i + 2 < length && ch == '<' && 	       string.charAt(i + 1) == '#' &&	       string.charAt(i + 2) == '=') {	// print the gathered text if any	if (mode == ',') {	  if (cb.length() > 0)	    println("out.print(\"" + cb.toString() + "\");");	}	else {	  if (! first)	    print((char) mode);	  if (cb.length() > 0) {	    print("\"");	    print(cb.toString());	    print("\"");	    print((char) mode);	  }	}	// scan the contents of '{' ... '}'	cb.clear();	for (i += 3;	     i + 1 < length && string.charAt(i) != '#' &&	       string.charAt(i + 1) != '>';	     i++)	  cb.append(string.charAt(i));	i++;		// and add the results	if (mode == ',')	  println("out.print(" + cb + ");");	else {	  print("(" + cb + ")");	}	cb.clear();	first = false;      }      else	cb.append((char) ch);    }    // add any trailing text    if (cb.length() > 0) {      if (mode == ',') 	println("out.print(\"" + cb + "\");");      else {	if (! first)	  print((char) mode);	print("\"" + cb + "\"");      }    } else if (first && mode == '+')      print("\"\"");  }  /**   * Produces code to generate an attribute value template.  The same   * code is used to produce a string ('a{b}c' -> "a" + b + "c") or a series of   * print statements (',').   *   * @param string the source template   * @param elt the containing element.  Needed for namespaces.   *   * @return the variable storing the generated string.   */  String generateStringVar(String string, Element elt)    throws Exception  {    CharBuffer cb = new CharBuffer();    int i = 0;    boolean first = true;    int length = string.length();    String strVar = "_xsl_str" + _unique++;    if (string.indexOf('{') < 0 &&        string.indexOf('}') < 0) {      print("String " + strVar + " = \"");      printString(string);      println("\";");            return strVar;    }    else if (string.lastIndexOf('{') == 0 &&        string.indexOf('}') == string.length() - 1) {      println("String " + strVar + " = \"\";");      string = string.substring(1, string.length() - 1);            addStringExpr(strVar, string, elt, true);      return strVar;    }        String cbVar = "_xsl_cb" + _unique++;    println("com.caucho.util.CharBuffer " + cbVar +            " = com.caucho.util.CharBuffer.allocate();");    for (; i < length; i++) {      char ch = string.charAt(i);      if (ch == '\n') {	cb.append("\\n");      }      else if (ch == '"') {	cb.append("\\\"");      }      else if (ch == '{' && i + 1 < length) {	// {{ is treated as a single {	if (string.charAt(i + 1) == '{') {	  cb.append('{');	  i++;	}	// the value is computed from an XPath expr	else {	  // print the gathered text if any          if (cb.length() > 0)            println(cbVar + ".append(\"" + cb.toString() + "\");");	  // scan the contents of '{' ... '}'	  cb.clear();	  for (i++; i < length && string.charAt(i) != '}'; i++)	    cb.append(string.charAt(i));	  // and add the results          addStringExpr(cbVar, cb.toString(), elt, false);          	  cb.clear();	  first = false;	}      }      // }} is treated as a single }      else if (ch == '}' && i + 1 < length) {	if (string.charAt(i + 1) == '}') {	  cb.append('}');	  i++;	}	else	  cb.append('}');      }      // <#= interpolates      else if (i + 2 < length && ch == '<' && 	       string.charAt(i + 1) == '#' &&	       string.charAt(i + 2) == '=') {	// print the gathered text if any        if (cb.length() > 0)          println(cbVar + ".append(\"" + cb.toString() + "\");");	// scan the contents of '<#=' ... '#>'	cb.clear();	for (i += 3;	     i + 1 < length && string.charAt(i) != '#' &&	       string.charAt(i + 1) != '>';	     i++)	  cb.append(string.charAt(i));	i++;		// and add the results        println(cbVar + ".append(" + cb + ");");	cb.clear();	first = false;      }      else	cb.append((char) ch);    }    // add any trailing text    if (cb.length() > 0)      println(cbVar + ".append(\"" + cb + "\");");    println("String " + strVar + " = " + cbVar + ".close();");    return strVar;      }  /**   * Prints a value-of expression   */  private void printStringExpr(String exprString, Element elt)    throws Exception  {    int length = exprString.length();        if (length == 0)      return;    AbstractPattern select = null;    try {      select = parseSelect(exprString);    } catch (Exception e) {    }        if (exprString.equals(".")) {      println("out.valueOf(node);");      return;    }    else if (exprString.charAt(0) == '@') {      boolean isSimple = true;            for (int i = 1; i < length; i++) {        char ch = exprString.charAt(i);        if (! XmlChar.isNameChar(ch) || ch == ':')          isSimple = false;      }      if (isSimple) {        println("if (node instanceof Element)");        print("  out.print(((Element) node).getAttribute(\"");        print(exprString.substring(1));        println("\"));");        return;      }    }    else if (allowJavaSelect(select)) {      int oldSelectDepth = _selectDepth;      String loop = "_xsl_loop" + _unique++;      _selectLoopDepth = 0;            String ptr = printSelectBegin(select, true, loop);      println("out.valueOf(" + ptr + ");");      println("break " + loop + ";");      for (; _selectDepth > oldSelectDepth; _selectDepth--) {        popDepth();        println("}");      }      return;    }    println("out.valueOf(_exprs[" + addExpr(exprString) +            "].evalObject(node, " + getEnv() + "));");  }  /**   * Prints a value-of expression   */  private void addStringExpr(String var, String exprString,                             Element elt, boolean isSingleString)    throws Exception  {    int length = exprString.length();        if (length == 0)      return;    AbstractPattern select = null;    try {      select = parseSelect(exprString);    } catch (Exception e) {    }        if (exprString.equals(".")) {      if (isSingleString)        println(var + " = XmlUtil.textValue(node);");      else        println("XmlUtil.textValue(" + var + ", node);");      return;    }    else if (exprString.charAt(0) == '@') {      boolean isSimple = true;            for (int i = 1; i < length; i++) {        char ch = exprString.charAt(i);        if (! XmlChar.isNameChar(ch) || ch == ':')          isSimple = false;      }

⌨️ 快捷键说明

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