luehe       2004/03/08 12:50:47

  Modified:    jasper2/src/share/org/apache/jasper/compiler
                        ParserController.java
  Log:
  Fixed Bugzilla 27517 ("The pageEncoding attribute is not used, when charset value is 
set.")
  
  Revision  Changes    Path
  1.51      +56 -23    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java
  
  Index: ParserController.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- ParserController.java     9 Feb 2004 23:12:57 -0000       1.50
  +++ ParserController.java     8 Mar 2004 20:50:47 -0000       1.51
  @@ -431,15 +431,19 @@
       }
       
       /*
  -     * Determines page source encoding for page or tag file in JSP syntax
  +     * Determines page source encoding for page or tag file in JSP syntax,
  +     * by reading (in this order) the value of the 'pageEncoding' page
  +     * directive attribute, or the charset value of the 'contentType' page
  +     * directive attribute.
        *
        * @return The page encoding, or null if not found
        */
       private String getPageEncodingForJspSyntax(JspReader jspReader,
  -                                              Mark startMark)
  +                                            Mark startMark)
                throws JasperException {
   
        String encoding = null;
  +        String saveEncoding = null;
   
        /*
         * Determine page encoding from directive of the form <%@ page %> or
  @@ -450,12 +454,22 @@
            jspReader.skipSpaces();
            // compare for "tag ", so we don't match "taglib"
            if (jspReader.matches("tag ") || jspReader.matches("page")) {
  +
                jspReader.skipSpaces();
  -             encoding = getPageEncodingFromDirective(
  -                        Parser.parseAttributes(this, jspReader));
  -             if (encoding != null) break;
  +                Attributes attrs = Parser.parseAttributes(this, jspReader);
  +             encoding = getPageEncodingFromDirective(attrs, "pageEncoding");
  +                if (encoding != null) {
  +                    break;
  +                }
  +             encoding = getPageEncodingFromDirective(attrs, "contentType");
  +                if (encoding != null) {
  +                    saveEncoding = encoding;
  +                }
            }
        }
  +        if (encoding == null) {
  +            encoding = saveEncoding;
  +        }
   
        if (encoding == null) {
            /*
  @@ -465,34 +479,53 @@
            jspReader.reset(startMark);
            while (jspReader.skipUntil("<jsp:directive.page") != null) {
                jspReader.skipSpaces();
  -             encoding = getPageEncodingFromDirective(
  -                        Parser.parseAttributes(this, jspReader));
  -             if (encoding != null) break;
  +                Attributes attrs = Parser.parseAttributes(this, jspReader);
  +
  +             encoding = getPageEncodingFromDirective(attrs, "pageEncoding");
  +                if (encoding != null) {
  +                    break;
  +                }
  +             encoding = getPageEncodingFromDirective(attrs, "contentType");
  +                if (encoding != null) {
  +                    saveEncoding = encoding;
  +                }
            }
  +            if (encoding == null) {
  +                encoding = saveEncoding;
  +            }
        }
   
        return encoding;
       }
   
       /*
  -     * Scans the given attributes for the 'pageEncoding' attribute, if present,
  -     * or the 'contentType' attribute, and gets the page encoding from them.
  +     * Scans the given attributes for the attribute with the given name,
  +     * which is either 'pageEncoding' or 'contentType', and returns the
  +     * specified page encoding.
  +     *
  +     * In the case of 'contentType', the page encoding is taken from the
  +     * content type's 'charset' component.
        *
  -     * In the case of the 'contentType' attribute, the page encoding is taken
  -     * from its 'charset' component.
  +     * @param attrs The page directive attributes
  +     * @param attrName The name of the attribute to search for (either
  +     * 'pageEncoding' or 'contentType')
        *
  -     * @param attrs The attributes from which to determine the page encoding
  -     * @return The page encoding
  +     * @return The page encoding, or null
        */
  -    private String getPageEncodingFromDirective(Attributes attrs) {
  -     String encoding = attrs.getValue("pageEncoding");
  -     if (encoding == null) {
  -         String contentType = attrs.getValue("contentType");
  -         if (contentType != null) {
  -             int loc = contentType.indexOf(CHARSET);
  -             if (loc != -1) {
  -                 encoding = contentType.substring(loc + CHARSET.length());
  -             }
  +    private String getPageEncodingFromDirective(Attributes attrs,
  +                                                String attrName) {
  +     String value = attrs.getValue(attrName);
  +        if (attrName.equals("pageEncoding")) {
  +            return value;
  +        }
  +
  +        // attrName = contentType
  +        String contentType = value;
  +        String encoding = null;
  +        if (contentType != null) {
  +         int loc = contentType.indexOf(CHARSET);
  +         if (loc != -1) {
  +             encoding = contentType.substring(loc + CHARSET.length());
            }
        }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to