jspnode.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,836 行 · 第 1/4 页
JAVA
1,836 行
String generateFragmentParameter(String string, boolean allowRtexpr) throws Exception { int index = _gen.addExpr(string); return ("new com.caucho.jsp.ELExprFragment(pageContext, _caucho_expr_" + index + ")"); } /** * Returns the containing segment. */ public JspSegmentNode getSegment() { JspNode parent = getParent(); if (parent != null) return parent.getSegment(); else return null; } void generateFragment(JspJavaWriter out, JspFragmentNode frag, String contextVar) throws Exception { out.print(generateFragment(frag, contextVar)); } void generateParentTag(JspJavaWriter out, TagInstance parent) throws IOException { String parentId = parent.getId(); if (parentId == null || parentId.startsWith("top_")) { out.print("null"); } else if (parent.isSimpleTag()) { out.print("(" + parentId + "_adapter != null ? "); out.print(parentId + "_adapter : "); out.print("(" + parentId + "_adapter = new javax.servlet.jsp.tagext.TagAdapter(" + parentId + ")))"); } else out.print(parentId); } String generateRTValue(Class type, Object value) throws Exception { if (value instanceof String) return generateParameterValue(type, (String) value, true, null, _parseState.isELIgnored()); else { JspAttribute attr = (JspAttribute) value; return stringToValue(type, attr.generateValue()); } } /** * Generates the code invoking a fragment to a string. */ protected String invokeFragment(JspFragmentNode frag) throws Exception { return frag.generateValue(); } /** * Generates the code for a fragment. */ protected String generateFragment(JspFragmentNode frag, String contextVar) throws Exception { int index = _gen.addFragment(frag); StringBuffer cb = new StringBuffer(); if (frag.isStatic()) { String fragmentVar = frag.getFragmentName(); cb.append(fragmentVar + " = com.caucho.jsp.StaticJspFragmentSupport.create(" + fragmentVar + ", " + contextVar + ", \""); cb.append(escapeJavaString(frag.getStaticText())); cb.append("\")"); return cb.toString(); } String fragmentVar = frag.getFragmentName(); cb.append(fragmentVar + " = _CauchoFragment.create(" + fragmentVar + ", " + index + ", " + contextVar + ", "); JspNode parentTag = getParentTagNode(); if (parentTag == null) cb.append("null"); else if (frag.hasCustomTag() && parentTag instanceof CustomSimpleTag) cb.append(parentTag.getCustomTagName() + "_adapter"); else cb.append(parentTag.getCustomTagName()); if (_gen instanceof JavaTagGenerator) { JavaTagGenerator tagGen = (JavaTagGenerator) _gen; if (tagGen.isStaticDoTag()) // jsp/1025 cb.append(", _jspBody"); else cb.append(", getJspBody()"); } else cb.append(", null"); cb.append(", _jsp_state"); cb.append(")"); return cb.toString(); } /** * Generates the code for the value of a parent tag. */ protected String generateParentTag(TagInstance parent) throws IOException { String parentId = parent.getId(); if (parent.isTop()) { return "null"; } else if (parent.isSimpleTag()) { CharBuffer cb = CharBuffer.allocate(); cb.append("(" + parentId + "_adapter != null ? "); cb.append(parentId + "_adapter : "); cb.append("(" + parentId + "_adapter = new javax.servlet.jsp.tagext.TagAdapter(" + parentId + ")))"); return cb.close(); } else return parentId; } // // JSF functions // /** * Returns the variable containing the jsf component */ public String getJsfVar() { if (_parent != null) return _parent.getJsfVar(); else return null; } /** * Returns the variable containing the jsf body */ public String getJsfBodyVar() { if (_parent != null) return _parent.getJsfBodyVar(); else return null; } /** * True if the jsf-parent setting is required. */ public boolean isJsfParentRequired() { return false; } // // value generation // /** * Generate include params. */ void generateIncludeParams(JspJavaWriter out, ArrayList params) throws Exception { boolean hasQuery = false; for (int i = 0; i < params.size(); i++) { JspParam param = (JspParam) params.get(i); String value = param.getValue(); if (hasQuery) out.print("+ \"&\" + "); hasQuery = true; out.print("\"" + param.getName() + "=\""); String outValue = generateParameterValue(String.class, value); if (outValue.equals("null")) { } else if (outValue.startsWith("\"")) out.print(" + (" + outValue + ")"); else out.print(" + com.caucho.el.Expr.toString(" + outValue + ", null)"); } } String generateJstlValue(Class type, String value) throws Exception { return generateParameterValue(type, value, true, null, false); } String generateValue(Class type, String value) throws Exception { return generateParameterValue(type, value, true, null, _parseState.isELIgnored()); } String generateParameterValue(Class type, String value) throws Exception { return generateParameterValue(type, value, true, null, _parseState.isELIgnored()); } String generateParameterValue(Class type, String value, boolean rtexpr, TagAttributeInfo attrInfo, boolean isELIgnored) throws Exception { // jsp/1c2m if (isJstl()) isELIgnored = false; boolean isEmpty = value == null || value.equals(""); if (isEmpty) value = "0"; try { if (JspFragment.class.equals(type)) return generateFragmentParameter(value, rtexpr); else if (type.equals(ValueExpression.class)) { int exprIndex; String typeName = attrInfo != null ? attrInfo.getExpectedTypeName() : ""; if (isEmpty) exprIndex = _gen.addValueExpr("", typeName); else exprIndex = _gen.addValueExpr(value, typeName); if (value.indexOf("#{") < 0) return ("_caucho_value_expr_" + exprIndex); else { StringBuilder sb = new StringBuilder(); sb.append("pageContext.createExpr(_caucho_value_expr_"); sb.append(exprIndex); sb.append(", \""); sb.append(escapeJavaString(value)); sb.append("\", "); if (null == typeName || "".equals(typeName)) { sb.append("java.lang.Object.class)"); } else { sb.append(escapeJavaString(typeName)); sb.append(".class)"); } return sb.toString(); } } else if (type.equals(MethodExpression.class)) { int exprIndex; String sig = attrInfo != null ? attrInfo.getMethodSignature() : "java.lang.String misc()"; if (isEmpty) exprIndex = _gen.addMethodExpr("", sig); else exprIndex = _gen.addMethodExpr(value, sig); return ("_caucho_method_expr_" + exprIndex); } else if (com.caucho.el.Expr.class.equals(type)) { int exprIndex; if (isEmpty) exprIndex = _gen.addExpr(""); else exprIndex = _gen.addExpr(value); return ("_caucho_expr_" + exprIndex); } else if (com.caucho.xpath.Expr.class.equals(type)) { int exprIndex; com.caucho.xpath.Expr expr; if (isEmpty) expr = XPath.parseExpr(""); else expr = XPath.parseExpr(value, getNamespaceContext()); return _gen.addXPathExpr(expr); } else if (rtexpr && hasRuntimeAttribute(value)) { return getRuntimeAttribute(value); } else if (rtexpr && hasELAttribute(value, isELIgnored)) { // jsp/0138, jsp/18s0, jsp/1ce5, jsp/1e0a return generateELValue(type, value); } else if (! rtexpr && hasELAttribute(value, isELIgnored)) { // JSP.2.3.6 says this is an error // jsp/184v vs jsp/18cr vs jsp/18f5 // #2112 if (String.class.equals(type)) return '"' + escapeJavaString(value) + '"'; else throw error(L.l("EL expression '{0}' is only allowed for attributes with rtexprvalue='true'.", value)); } else if (rtexpr && hasDeferredAttribute(value, false)) { // jsp/1c2m, jsp/1ce8 return generateELValue(type, value); } else if (! rtexpr && hasDeferredAttribute(value, isELIgnored) && ! _gen.getParseState().isDeferredSyntaxAllowedAsLiteral()) { throw error(L.l("Deferred syntax '{0}' is not allowed as a literal.", value)); } else if (type.equals(boolean.class)) return String.valueOf(Boolean.valueOf(isEmpty ? "false" : value)); else if (type.equals(Boolean.class)) { if (isEmpty) return "java.lang.Boolean.FALSE"; else return "new java.lang.Boolean(" + Boolean.valueOf(value) + ")"; } else if (type.equals(byte.class)) return "(byte) " + Byte.valueOf(value); else if (type.equals(Byte.class)) return "new java.lang.Byte((byte) " + Byte.valueOf(value) + ")"; else if (type.equals(char.class)) { if (isEmpty) return "'\\0'"; else return "'" + value.charAt(0) + "'"; } else if (type.equals(Character.class)) { if (isEmpty) return "new java.lang.Character('\\0')"; else return ("new Character('" + value.charAt(0) + "')"); } else if (type.equals(short.class)) return ("(short) " + Short.valueOf(value)); else if (type.equals(Short.class)) return ("new java.lang.Short((short) " + Short.valueOf(value) + ")"); else if (type.equals(int.class)) return String.valueOf(Integer.valueOf(value)); else if (type.equals(Integer.class)) return ("new java.lang.Integer(" + Integer.valueOf(value) + ")"); else if (type.equals(long.class)) return String.valueOf(Long.valueOf(value)); else if (type.equals(Long.class)) return ("new java.lang.Long(" + Long.valueOf(value) + ")"); else if (type.equals(float.class)) return ("(float) " + Float.valueOf(value)); else if (type.equals(Float.class)) return ("new java.lang.Float((float) " + Float.valueOf(value) + ")"); else if (type.equals(double.class)) return String.valueOf(Double.valueOf(value)); else if (type.equals(Double.class)) { double v = Double.valueOf(value); if (Double.isNaN(v)) return ("new java.lang.Double(Double.NaN)"); else return ("new java.lang.Double(" + v + ")"); } else if (! type.equals(String.class) && ! type.equals(Object.class)) { return null; } else if (! isEmpty) { return '"' + escapeJavaString(value) + '"'; } else return "\"\""; } catch (NumberFormatException e) { throw error(L.l("parameter format error: {0}", e.getMessage()), e); } } protected String generateELValue(Class type, String value) throws Exception { if (type.equals(com.caucho.el.Expr.class)) { int exprIndex; exprIndex = _gen.addExpr(value); return ("_caucho_expr_" + exprIndex); } else if (type.equals(ValueExpression.class)) { int exprIndex; exprIndex = _gen.addValueExpr(value, ""); return ("_caucho_value_expr_" + exprIndex); } else if (type.equals(com.caucho.xpath.Expr.class)) { com.caucho.xpath.Expr expr; expr = XPath.parseExpr(value, getNamespaceContext()); return _gen.addXPathExpr(expr); } Expr expr = _gen.genExpr(value); if (expr.isConstant()) { try { if (expr.evalObject(null) != null) { } else if (Character.class.isAssignableFrom(type)) { // jsp/18s0 return "new Character((char) 0)"; } else if (Boolean.class.isAssignableFrom(type)) { // jsp/18s1 return "Boolean.FALSE"; } else if (String.class.isAssignableFrom(type)) { // jsp/18s2 return "\"\""; } else if (BigInteger.class.isAssignableFrom(type)) { return "java.math.BigInteger.ZERO"; } else if (BigDecimal.class.isAssignableFrom(type)) { return "java.math.BigDecimal.ZERO"; } else if (Number.class.isAssignableFrom(type)) { // jsp/18s6 return "new " + type.getName() + "((byte) 0)"; } else if (Object.class.isAssignableFrom(type)) return "null";
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?