You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by lu...@apache.org on 2003/01/06 19:57:16 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime JspRuntimeLibrary.java

luehe       2003/01/06 10:57:16

  Modified:    jasper2/src/share/org/apache/jasper/compiler Generator.java
                        JspUtil.java Node.java Validator.java
               jasper2/src/share/org/apache/jasper/runtime
                        JspRuntimeLibrary.java
  Log:
  Implemented JSTL EL rules for coercing of empty string and null values
  
  Revision  Changes    Path
  1.144     +32 -90    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java
  
  Index: Generator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
  retrieving revision 1.143
  retrieving revision 1.144
  diff -u -r1.143 -r1.144
  --- Generator.java	16 Dec 2002 23:37:59 -0000	1.143
  +++ Generator.java	6 Jan 2003 18:57:14 -0000	1.144
  @@ -2511,7 +2511,19 @@
   	    }
   	}
   
  -	private String convertString(Class c, String s, String attrName,
  +	/*
  +	 * @param c The target class to which to coerce the given string
  +	 * @param s The string value
  +	 * @param attrName The name of the attribute whose value is being
  +	 * supplied
  +	 * @param propEditorClass The property editor for the given attribute
  +	 * @param isNamedAttribute true if the given attribute is a named
  +	 * attribute (that is, specified using the jsp:attribute standard
  +	 * action), and false otherwise
  +	 */
  +	private String convertString(Class c,
  +				     String s,
  +				     String attrName,
   				     Class propEditorClass,
   				     boolean isNamedAttribute)
   	            throws JasperException {
  @@ -2530,107 +2542,37 @@
   	    } else if (c == String.class) {
   		return quoted;
   	    } else if (c == boolean.class) {
  -		if (isNamedAttribute)
  -		    return "Boolean.valueOf(" + s + ").booleanValue()";
  -		else
  -		    return Boolean.valueOf(s).toString();
  +		return JspUtil.coerceToPrimitiveBoolean(s, isNamedAttribute);
   	    } else if (c == Boolean.class) {
  -		if (isNamedAttribute)
  -		    return "new Boolean(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Boolean(" + Boolean.valueOf(s).toString() + ")";
  +		return JspUtil.coerceToBoolean(s, isNamedAttribute);
   	    } else if (c == byte.class) {
  -		return "((byte)" + Byte.valueOf(s).toString() + ")";
  +		return JspUtil.coerceToPrimitiveByte(s, isNamedAttribute);
   	    } else if (c == Byte.class) {
  -		if (isNamedAttribute)
  -		    return "new Byte(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Byte((byte)" + Byte.valueOf(s).toString() + ")";
  +		return JspUtil.coerceToByte(s, isNamedAttribute);
   	    } else if (c == char.class) {
  -		if (isNamedAttribute) {
  -		    return "org.apache.jasper.runtime.JspRuntimeLibrary.getChar(" + s + ")";
  -		} else {
  -		    // non-normative (normative method would fail to compile)
  -		    if (s.length() > 0) {
  -			char ch = s.charAt(0);
  -			// this trick avoids escaping issues
  -			return "((char) " + (int) ch + ")";
  -		    } else {
  -			throw new NumberFormatException(
  -                                err.getString("jsp.error.bad_string_char"));
  -		    }
  -		}
  +		return JspUtil.coerceToChar(s, isNamedAttribute);
   	    } else if (c == Character.class) {
  -		if (isNamedAttribute) {
  -		    return "org.apache.jasper.runtime.JspRuntimeLibrary.getCharacter(" + s + ")";
  -		} else {
  -		    // non-normative (normative method would fail to compile)
  -		    if (s.length() > 0) {
  -			char ch = s.charAt(0);
  -			// this trick avoids escaping issues
  -			return "new Character((char) " + (int) ch + ")";
  -		    } else {
  -			throw new NumberFormatException(
  -			    err.getString("jsp.error.bad_string_Character"));
  -		    }
  -		}
  +		return JspUtil.coerceToCharacter(s, isNamedAttribute);
   	    } else if (c == double.class) {
  -		if (isNamedAttribute)
  -		    return "Double.valueOf(" + s + ").doubleValue()";
  -		else
  -		    return Double.valueOf(s).toString();
  +		return JspUtil.coerceToPrimitiveDouble(s, isNamedAttribute);
   	    } else if (c == Double.class) {
  -		if (isNamedAttribute)
  -		    return "new Double(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Double(" + Double.valueOf(s).toString() + ")";
  +		return JspUtil.coerceToDouble(s, isNamedAttribute);
   	    } else if (c == float.class) {
  -		if (isNamedAttribute)
  -		    return "Float.valueOf(" + s + ").floatValue()";
  -		else
  -		    return Float.valueOf(s).toString() + "f";
  +		return JspUtil.coerceToPrimitiveFloat(s, isNamedAttribute);
   	    } else if (c == Float.class) {
  -		if (isNamedAttribute)
  -		    return "new Float(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Float(" + Float.valueOf(s).toString() + "f)";
  +		return JspUtil.coerceToFloat(s, isNamedAttribute);
   	    } else if (c == int.class) {
  -		if (isNamedAttribute)
  -		    return "Integer.valueOf(" + s + ").intValue()";
  -		else
  -		    return Integer.valueOf(s).toString();
  +		return JspUtil.coerceToInt(s, isNamedAttribute);
   	    } else if (c == Integer.class) {
  -		if (isNamedAttribute)
  -		    return "new Integer(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Integer(" + Integer.valueOf(s).toString() + ")";
  +		return JspUtil.coerceToInteger(s, isNamedAttribute);
   	    } else if (c == short.class) {
  -		if (isNamedAttribute)
  -		    return "Short.valueOf(" + s + ").shortValue()";
  -		else
  -		    return "((short) " + Short.valueOf(s).toString() + ")";
  +		return JspUtil.coerceToPrimitiveShort(s, isNamedAttribute);
   	    } else if (c == Short.class) {
  -		if (isNamedAttribute)
  -		    return "new Short(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Short(\"" + Short.valueOf(s).toString() + "\")";
  +		return JspUtil.coerceToShort(s, isNamedAttribute);
   	    } else if (c == long.class) {
  -		if (isNamedAttribute)
  -		    return "Long.valueOf(" + s + ").longValue()";
  -		else
  -		    return Long.valueOf(s).toString() + "l";
  +		return JspUtil.coerceToPrimitiveLong(s, isNamedAttribute);
   	    } else if (c == Long.class) {
  -		if (isNamedAttribute)
  -		    return "new Long(" + s + ")";
  -		else
  -		    // Detect format error at translation time
  -		    return "new Long(" + Long.valueOf(s).toString() + "l)";
  +		return JspUtil.coerceToLong(s, isNamedAttribute);
   	    } else if (c == Object.class) {
   		return "new String(" + quoted + ")";
   	    } else {
  
  
  
  1.27      +205 -3    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspUtil.java
  
  Index: JspUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspUtil.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- JspUtil.java	5 Dec 2002 02:41:53 -0000	1.26
  +++ JspUtil.java	6 Jan 2003 18:57:15 -0000	1.27
  @@ -728,6 +728,208 @@
           }    
       }
   
  +    public static String coerceToPrimitiveBoolean(String s,
  +						  boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToBoolean(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "false";
  +	    else
  +		return Boolean.valueOf(s).toString();
  +	}
  +    }
  +
  +    public static String coerceToBoolean(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Boolean) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Boolean.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Boolean(false)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Boolean(" + Boolean.valueOf(s).toString() + ")";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToPrimitiveByte(String s,
  +					       boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToByte(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "(byte) 0";
  +	    else
  +		return "((byte)" + Byte.valueOf(s).toString() + ")";
  +	}
  +    }
  +
  +    public static String coerceToByte(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Byte) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Byte.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Byte((byte) 0)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Byte((byte)" + Byte.valueOf(s).toString() + ")";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToChar(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToChar(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "(char) 0";
  +	    } else {
  +		char ch = s.charAt(0);
  +		// this trick avoids escaping issues
  +		return "((char) " + (int) ch + ")";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToCharacter(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Character) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Character.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Character((char) 0)";
  +	    } else {
  +		char ch = s.charAt(0);
  +		// this trick avoids escaping issues
  +		return "new Character((char) " + (int) ch + ")";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToPrimitiveDouble(String s,
  +						 boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToDouble(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "(double) 0";
  +	    else
  +		return Double.valueOf(s).toString();
  +	}
  +    }
  +
  +    public static String coerceToDouble(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Double) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Double.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Double(0)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Double(" + Double.valueOf(s).toString() + ")";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToPrimitiveFloat(String s,
  +						boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToFloat(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "(float) 0";
  +	    else
  +		return Float.valueOf(s).toString() + "f";
  +	}
  +    }
  +
  +    public static String coerceToFloat(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Float) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Float.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Float(0)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Float(" + Float.valueOf(s).toString() + "f)";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToInt(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToInt(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "0";
  +	    else
  +		return Integer.valueOf(s).toString();
  +	}
  +    }
  +
  +    public static String coerceToInteger(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Integer) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Integer.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Integer(0)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Integer(" + Integer.valueOf(s).toString() + ")";
  +	    }
  +	}
  +    }
  +
  +    public static String coerceToPrimitiveShort(String s,
  +						boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToShort(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "(short) 0";
  +	    else
  +		return "((short) " + Short.valueOf(s).toString() + ")";
  +	}
  +    }
  +    
  +    public static String coerceToShort(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Short) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Short.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Short((short) 0)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Short(\"" + Short.valueOf(s).toString() + "\")";
  +	    }
  +	}
  +    }
  +    
  +    public static String coerceToPrimitiveLong(String s,
  +					       boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "org.apache.jasper.runtime.JspRuntimeLibrary.coerceToLong(" + s + ")";
  +	} else {
  +	    if (s == null || s.length() == 0)
  +		return "(long) 0";
  +	    else
  +		return Long.valueOf(s).toString() + "l";
  +	}
  +    }
  +
  +    public static String coerceToLong(String s, boolean isNamedAttribute) {
  +	if (isNamedAttribute) {
  +	    return "(Long) org.apache.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Long.class)";
  +	} else {
  +	    if (s == null || s.length() == 0) {
  +		return "new Long(0)";
  +	    } else {
  +		// Detect format error at translation time
  +		return "new Long(" + Long.valueOf(s).toString() + "l)";
  +	    }
  +	}
  +    }
  +
       public static InputStream getInputStream(String fname, JarFile jarFile,
   					     JspCompilationContext ctxt,
   					     ErrorDispatcher err)
  
  
  
  1.50      +8 -5      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java
  
  Index: Node.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- Node.java	16 Dec 2002 16:13:28 -0000	1.49
  +++ Node.java	6 Jan 2003 18:57:15 -0000	1.50
  @@ -1363,8 +1363,11 @@
   	    // Get the attribute value from this named attribute
   	    // (<jsp:attribute>).
   	    // Since this method is only for attributes that are not rtexpr,
  -	    // we can assume the body of the jsp:attribute is a template text
  -	    String text = null;
  +	    // we can assume the body of the jsp:attribute is a template text.
  +	    // According to JSP 2.0, if the body of the <jsp:attribute>
  +	    // action is empty, it is equivalent of specifying "" as the value
  +	    // of the attribute.
  +	    String text = "";
   	    if (getBody() != null) {
   		AttributeVisitor attributeVisitor = new AttributeVisitor();
   		try {
  
  
  
  1.64      +10 -9     jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java
  
  Index: Validator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java,v
  retrieving revision 1.63
  retrieving revision 1.64
  diff -u -r1.63 -r1.64
  --- Validator.java	18 Dec 2002 17:37:50 -0000	1.63
  +++ Validator.java	6 Jan 2003 18:57:15 -0000	1.64
  @@ -820,15 +820,16 @@
   		    if (na.getName().equals(tldAttrs[j].getName())) {
   			jspAttrs[attrs.getLength() + i]
   			    = new Node.JspAttribute(na, false);
  -
  -			NamedAttributeVisitor nav = new NamedAttributeVisitor();
  -			na.getBody().visit(nav);
  -			if (nav.hasDynamicContent()) {
  +			NamedAttributeVisitor nav = null;
  +			if (na.getBody() != null) {
  +			    nav = new NamedAttributeVisitor();
  +			    na.getBody().visit(nav);
  +			}
  +			if (nav != null && nav.hasDynamicContent()) {
   			    tagDataAttrs.put(na.getName(),
   					     TagData.REQUEST_TIME_VALUE);
   			} else {
  -			    tagDataAttrs.put(na.getName(),
  -					     na.getText());    
  +			    tagDataAttrs.put(na.getName(), na.getText());    
   			}
   			found = true;
   			break;
  
  
  
  1.13      +104 -11   jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspRuntimeLibrary.java
  
  Index: JspRuntimeLibrary.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspRuntimeLibrary.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- JspRuntimeLibrary.java	12 Dec 2002 23:31:51 -0000	1.12
  +++ JspRuntimeLibrary.java	6 Jan 2003 18:57:15 -0000	1.13
  @@ -135,18 +135,111 @@
           }
       }
   
  -    public static Character getCharacter(String s) throws JasperException {
  -	if (s.length() == 0) {
  -	    err.jspError("jsp.error.bad_string_Character");
  +    public static boolean coerceToBoolean(String s) {
  +	if (s == null || s.length() == 0)
  +	    return false;
  +	else
  +	    return Boolean.valueOf(s).booleanValue();
  +    }
  +
  +    public static byte coerceToByte(String s) {
  +	if (s == null || s.length() == 0)
  +	    return (byte) 0;
  +	else
  +	    return Byte.valueOf(s).byteValue();
  +    }
  +
  +    public static char coerceToChar(String s) {
  +	if (s == null || s.length() == 0) {
  +	    return (char) 0;
  +	} else {
  +	    // this trick avoids escaping issues
  +	    return (char)(int) s.charAt(0);
   	}
  -	return new Character(s.charAt(0));
       }
   
  -    public static char getChar(String s) throws JasperException {
  -	if (s.length() == 0) {
  -	    err.jspError("jsp.error.bad_string_Character");
  +    public static double coerceToDouble(String s) {
  +	if (s == null || s.length() == 0)
  +	    return (double) 0;
  +	else
  +	    return Double.valueOf(s).doubleValue();
  +    }
  +
  +    public static float coerceToFloat(String s) {
  +	if (s == null || s.length() == 0)
  +	    return (float) 0;
  +	else
  +	    return Float.valueOf(s).floatValue();
  +    }
  +
  +    public static int coerceToInt(String s) {
  +	if (s == null || s.length() == 0)
  +	    return 0;
  +	else
  +	    return Integer.valueOf(s).intValue();
  +    }
  +
  +    public static short coerceToShort(String s) {
  +	if (s == null || s.length() == 0)
  +	    return (short) 0;
  +	else
  +	    return Short.valueOf(s).shortValue();
  +    }
  +
  +    public static long coerceToLong(String s) {
  +	if (s == null || s.length() == 0)
  +	    return (long) 0;
  +	else
  +	    return Long.valueOf(s).longValue();
  +    }
  +
  +    public static Object coerce(String s, Class target) {
  +
  +	boolean isNullOrEmpty = (s == null || s.length() == 0);
  +
  +	if (target == Boolean.class) {
  +	    if (isNullOrEmpty) {
  +		s = "false";
  +	    }
  +	    return new Boolean(s);
  +	} else if (target == Byte.class) {
  +	    if (isNullOrEmpty)
  +		return new Byte((byte) 0);
  +	    else
  +		return new Byte(s);
  +	} else if (target == Character.class) {
  +	    if (isNullOrEmpty)
  +		return new Character((char) 0);
  +	    else 
  +		return new Character(s.charAt(0));
  +	} else if (target == Double.class) {
  +	    if (isNullOrEmpty)
  +		return new Double(0);
  +	    else
  +		return new Double(s);
  +	} else if (target == Float.class) {
  +	    if (isNullOrEmpty)
  +		return new Float(0);
  +	    else
  +		return new Float(s);
  +	} else if (target == Integer.class) {
  +	    if (isNullOrEmpty)
  +		return new Integer(0);
  +	    else
  +		return new Integer(s);
  +	} else if (target == Short.class) {
  +	    if (isNullOrEmpty)
  +		return new Short((short) 0);
  +	    else
  +		return new Short(s);
  +	} else if (target == Long.class) {
  +	    if (isNullOrEmpty)
  +		return new Long(0);
  +	    else
  +		return new Long(s);
  +	} else {
  +	    return null;
   	}
  -	return s.charAt(0);
       }
   
      // __begin convertMethod
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>