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 + -
显示快捷键?