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