You are viewing a plain text version of this content. The canonical link for it is here.
Posted to taglibs-dev@jakarta.apache.org by pi...@apache.org on 2003/05/01 00:53:09 UTC
cvs commit: jakarta-taglibs/standard/src/org/apache/taglibs/standard/tag/common/core ParamSupport.java Util.java
pierred 2003/04/30 15:53:08
Modified: standard/src/org/apache/taglibs/standard/tag/common/core
ParamSupport.java Util.java
Log:
Fix for bug 16912.
Revision Changes Path
1.10 +12 -49 jakarta-taglibs/standard/src/org/apache/taglibs/standard/tag/common/core/ParamSupport.java
Index: ParamSupport.java
===================================================================
RCS file: /home/cvs/jakarta-taglibs/standard/src/org/apache/taglibs/standard/tag/common/core/ParamSupport.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ParamSupport.java 14 Mar 2003 22:04:35 -0000 1.9
+++ ParamSupport.java 30 Apr 2003 22:53:08 -0000 1.10
@@ -57,10 +57,13 @@
import java.lang.reflect.*;
import java.util.*;
+import java.io.*;
+
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
-import java.net.URLEncoder;
+
import org.apache.taglibs.standard.resources.Resources;
+import org.apache.taglibs.standard.tag.common.core.Util;
/**
* <p>Support for tag handlers for <param>, the URL parameter
@@ -73,12 +76,6 @@
public abstract class ParamSupport extends BodyTagSupport {
//*********************************************************************
- // Private constants
-
- private static final Class[] URL_ENCODER_PARAM_TYPES =
- new Class[] { String.class, String.class };
-
- //*********************************************************************
// Protected state
protected String name; // 'name' attribute
@@ -92,26 +89,8 @@
protected boolean encode = true;
//*********************************************************************
- // Private state
-
- private static Method encodeMethod1_4 = null;
-
- //*********************************************************************
// Constructor and initialization
- // URLEncoder.encode(String) has been deprecated in J2SE 1.4.
- // Take advantage of the new method URLEncoder.encode(String, enc)
- // if J2SE 1.4 is used.
- static {
- try {
- Class urlEncoderClass = Class.forName("java.net.URLEncoder");
- encodeMethod1_4 =
- urlEncoderClass.getMethod(
- "encode",
- new Class[] {String.class, String.class});
- } catch (Exception ex) {} // encodeMethod1_4 will be null if exception
- }
-
public ParamSupport() {
super();
init();
@@ -121,7 +100,6 @@
name = value = null;
}
-
//*********************************************************************
// Tag logic
@@ -145,29 +123,14 @@
else
value = bodyContent.getString().trim();
}
- if (encode) {
- if (encodeMethod1_4 != null) {
- Object[] methodArgsName = new Object[2];
- methodArgsName[0] = name;
- methodArgsName[1] = pageContext.getResponse().getCharacterEncoding();
- Object[] methodArgsValue = new Object[2];
- methodArgsValue[0] = value;
- methodArgsValue[1] = pageContext.getResponse().getCharacterEncoding();
-
- try {
- parent.addParameter(
- (String)encodeMethod1_4.invoke(null, methodArgsName),
- (String)encodeMethod1_4.invoke(null, methodArgsValue));
- } catch (Exception ex) {
- throw new JspException("System error invoking URLEncoder.encode() by reflection.", ex);
- }
- } else {
- // must use J2SE 1.3 version
- parent.addParameter(
- URLEncoder.encode(name), URLEncoder.encode(value));
- }
- } else {
- parent.addParameter(name, value);
+ if (encode) {
+ // FIXME: revert to java.net.URLEncoder.encode(s, enc) once
+ // we have a dependency on J2SE 1.4+.
+ String enc = pageContext.getResponse().getCharacterEncoding();
+ parent.addParameter(
+ Util.URLEncode(name, enc), Util.URLEncode(value, enc));
+ } else {
+ parent.addParameter(name, value);
}
return EVAL_PAGE;
}
1.11 +79 -0 jakarta-taglibs/standard/src/org/apache/taglibs/standard/tag/common/core/Util.java
Index: Util.java
===================================================================
RCS file: /home/cvs/jakarta-taglibs/standard/src/org/apache/taglibs/standard/tag/common/core/Util.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Util.java 31 Mar 2003 15:53:51 -0000 1.10
+++ Util.java 30 Apr 2003 22:53:08 -0000 1.11
@@ -55,9 +55,12 @@
package org.apache.taglibs.standard.tag.common.core;
+import java.io.*;
import java.text.DateFormat;
+
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
+
import org.apache.taglibs.standard.resources.Resources;
/**
@@ -194,4 +197,80 @@
}
return input.substring(begin, end).trim();
}
+
+ /**
+ * URL encodes a string, based on the supplied character encoding.
+ * This performs the same function as java.next.URLEncode.encode
+ * in J2SDK1.4, and should be removed if the only platform supported
+ * is 1.4 or higher.
+ * @param s The String to be URL encoded.
+ * @param enc The character encoding
+ * @return The URL encoded String
+ * [taken from jakarta-tomcat-jasper/jasper2
+ * org.apache.jasper.runtime.JspRuntimeLibrary.java]
+ */
+ public static String URLEncode(String s, String enc) {
+
+ if (s == null) {
+ return "null";
+ }
+
+ if (enc == null) {
+ enc = "UTF-8"; // Is this right?
+ }
+
+ StringBuffer out = new StringBuffer(s.length());
+ ByteArrayOutputStream buf = new ByteArrayOutputStream();
+ OutputStreamWriter writer = null;
+ try {
+ writer = new OutputStreamWriter(buf, enc);
+ } catch (java.io.UnsupportedEncodingException ex) {
+ // Use the default encoding?
+ writer = new OutputStreamWriter(buf);
+ }
+
+ for (int i = 0; i < s.length(); i++) {
+ int c = s.charAt(i);
+ if (c == ' ') {
+ out.append('+');
+ } else if (isSafeChar(c)) {
+ out.append((char)c);
+ } else {
+ // convert to external encoding before hex conversion
+ try {
+ writer.write(c);
+ writer.flush();
+ } catch(IOException e) {
+ buf.reset();
+ continue;
+ }
+ byte[] ba = buf.toByteArray();
+ for (int j = 0; j < ba.length; j++) {
+ out.append('%');
+ // Converting each byte in the buffer
+ out.append(Character.forDigit((ba[j]>>4) & 0xf, 16));
+ out.append(Character.forDigit(ba[j] & 0xf, 16));
+ }
+ buf.reset();
+ }
+ }
+ return out.toString();
+ }
+
+ private static boolean isSafeChar(int c) {
+ if (c >= 'a' && c <= 'z') {
+ return true;
+ }
+ if (c >= 'A' && c <= 'Z') {
+ return true;
+ }
+ if (c >= '0' && c <= '9') {
+ return true;
+ }
+ if (c == '-' || c == '_' || c == '.' || c == '!' ||
+ c == '~' || c == '*' || c == '\'' || c == '(' || c == ')') {
+ return true;
+ }
+ return false;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: taglibs-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: taglibs-dev-help@jakarta.apache.org