huber       2003/01/25 23:27:32

  Modified:    src/java/org/apache/cocoon/transformation
                        EncodeURLTransformer.java
  Log:
  fix bug 16246, getSession each time it is needed, don't save session as member
  minor doc fixes, added encodeURL handling for buggy servlet container
  
  Revision  Changes    Path
  1.6       +108 -64   
xml-cocoon2/src/java/org/apache/cocoon/transformation/EncodeURLTransformer.java
  
  Index: EncodeURLTransformer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/EncodeURLTransformer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- EncodeURLTransformer.java 25 Jan 2003 02:58:58 -0000      1.5
  +++ EncodeURLTransformer.java 26 Jan 2003 07:27:32 -0000      1.6
  @@ -77,7 +77,7 @@
    * <p>
    *   This transformer applies encodeURL method to URLs.
    *   You may want to use this transform to avoid doing the manually
  - *   encodeURL() call.
  + *   encodeURL() calls.
    * </p>
    * <p>
    *   Usually this transformer is appended as last transformer before
  @@ -85,27 +85,27 @@
    *   URLs introduced in the generator, and xslt transformer phase.
    * </p>
    * <p>
  - *   You can specify which attributes hold URL values in order to restrict
  + *   You can specify which attributes hold an URL values in order to restrict
    *   URL rewriting to specific attributes only.
    * </p>
    * <p>
    * Usage in a sitemap:
    * </p>
    * <pre><tt>
  - *   <map:composition>
  + *   &lt;map:composition&gt;
    *   ...
  - *     <map:transformers>
  + *     &lt;map:transformers&gt;
    *     ...
  - *       <map:transformer type="encodeURL"
  - *         src="org.apache.cocoon.optional.transformation.EncodeURLTransformer">
  - *         <exclude-name>img/@src</exclude-name>
  - *         
<include-name>.&asterik;/@href|.&asterik;/@src|.&asterik;/@action</include-name>
  - *       </map:transformer>
  + *       &lt;map:transformer type=&quot;encodeURL&quot;
  + *         
src=&quot;org.apache.cocoon.optional.transformation.EncodeURLTransformer&quot;&gt;
  + *         &lt;exclude-name&gt;img/@src&lt;/exclude-name&gt;
  + *         
&lt;include-name&gt;.&amp;asterik;/@href|.&amp;asterik;/@src|.&amp;asterik;/@action&lt;/include-name&gt;
  + *       &lt;/map:transformer&gt;
    *   ...
  - *   <map:pipelines>
  - *     <map:pipeline>
  + *   &lt;map:pipelines&gt;
  + *     &lt;map:pipeline&gt;
    *       ...
  - *       <map:transform type="encodeURL"/>
  + *       &lt;map:transform type=&quot;encodeURL&quot;/&gt;
    *       ...
    * </pre></tt>
    *
  @@ -129,32 +129,24 @@
       /**
        * Configuration name for specifying excluding patterns,
        * ie exclude-name.
  -     *
  -     * @since
        */
       public final static String EXCLUDE_NAME = "exclude-name";
   
       /**
        * Configuration name for specifying including patterns,
        * ie include-name.
  -     *
  -     * @since
        */
       public final static String INCLUDE_NAME = "include-name";
   
       /**
        * Configuration default exclude pattern,
        * ie img/@src
  -     *
  -     * @since
        */
       public final static String EXCLUDE_NAME_DEFAULT = "img/@src";
   
       /**
        * Configuration default exclude pattern,
        * ie .*\/@href|.*\/@action|frame/@src
  -     *
  -     * @since
        */
       public final static String INCLUDE_NAME_DEFAULT = 
".*/@href|.*/@action|frame/@src";
   
  @@ -163,10 +155,44 @@
   
       private ElementAttributeMatching elementAttributeMatching;
       private Response response;
  -    private Session  session;
  +    private Request request;
   
   
       /**
  +     * get the session from the request.
  +     * 
  +     * @return Session object, or null if no session is available
  +     */
  +    protected Session getSession() {
  +        // assume that request is already set
  +        Session session = this.request.getSession( false );
  +        return session;
  +    }
  +
  +    /**
  +     * check if encoding of URLs is neccessary.
  +     * 
  +     * @return true iff session object exists, and session-id 
  +     *   was provided from URL, or session is new,
  +     *   else return false
  +     */
  +    protected boolean isEncodeURLNeeded() {
  +        Session session = getSession();
  +        boolean isEncodeURLNeeded = false;
  +        
  +        if ( null != session ) {
  +            // do encoding if session id is from URL, or the session is new, 
  +            // fixes BUG #13855, due to [EMAIL PROTECTED]
  +            if ( request.isRequestedSessionIdFromURL() || session.isNew()) {
  +                isEncodeURLNeeded = true;
  +            }
  +        }
  +        return isEncodeURLNeeded;
  +    }
  +                
  +
  +    
  +    /**
        * Setup the transformer.
        * <p>
        *   Setup include, and exclude patterns from the parameters
  @@ -180,28 +206,21 @@
       public void setup(SourceResolver resolver, Map objectModel, String source, 
Parameters parameters)
       throws ProcessingException, SAXException, IOException {
   
  -        final Request request = ObjectModelHelper.getRequest(objectModel);
  -        this.session = request.getSession( false );
  -        if ( null != this.session ) {
  -            // do encoding if session id is from URL, or the session is new, 
  -            // fixes BUG #13855, due to [EMAIL PROTECTED]
  -            if ( request.isRequestedSessionIdFromURL() || this.session.isNew()) {
  -                this.response = ObjectModelHelper.getResponse(objectModel);
  -                final String includeName = parameters.getParameter(INCLUDE_NAME,
  -                                                                   
this.includeNameConfigure);
  -                final String excludeName = parameters.getParameter(EXCLUDE_NAME,
  -                                                                   
this.excludeNameConfigure);
  -                try {
  -                    this.elementAttributeMatching = new 
ElementAttributeMatching(includeName, excludeName);
  -                } catch (RESyntaxException reex) {
  -                    final String message = "Cannot parse include-name: " + 
includeName + " " +
  -                        "or exclude-name: " + excludeName + "!";
  -                    throw new ProcessingException(message, reex);
  -                }
  -            } else {
  -                // we don't need to encode
  -                this.session = null;
  -            }
  +        this.request = ObjectModelHelper.getRequest(objectModel);
  +        this.response = ObjectModelHelper.getResponse(objectModel);
  +
  +        // don't check if URL encoding is needed now, as
  +        // a generator might create a new session 
  +        final String includeName = parameters.getParameter(INCLUDE_NAME,
  +                                                           
this.includeNameConfigure);
  +        final String excludeName = parameters.getParameter(EXCLUDE_NAME,
  +                                                           
this.excludeNameConfigure);
  +        try {
  +            this.elementAttributeMatching = new 
ElementAttributeMatching(includeName, excludeName);
  +        } catch (RESyntaxException reex) {
  +            final String message = "Cannot parse include-name: " + includeName + " 
" +
  +                "or exclude-name: " + excludeName + "!";
  +            throw new ProcessingException(message, reex);
           }
       }
   
  @@ -211,7 +230,6 @@
        *
        * @param  configuration               Description of Parameter
        * @exception  ConfigurationException  Description of Exception
  -     * @since
        */
       public void configure(Configuration configuration) throws 
ConfigurationException {
           Configuration child;
  @@ -234,14 +252,12 @@
   
   
       /**
  -     *Description of the Method
  -     *
  -     * @since
  +     * Recycle resources of this transformer
        */
       public void recycle() {
           super.recycle();
           this.response = null;
  -        this.session = null;
  +        this.request = null;
           this.elementAttributeMatching = null;
       }
   
  @@ -253,10 +269,11 @@
        * @return The generated key hashes the src
        */
       public java.io.Serializable generateKey() {
  -        if ( null == this.session ) {
  +        if (isEncodeURLNeeded()) {
               return "1";
  +        } else {
  +            return null;
           }
  -        return null;
       }
   
       /**
  @@ -266,10 +283,11 @@
        *         component is currently not cacheable.
        */
       public SourceValidity generateValidity() {
  -        if ( null == this.session ) {
  +        if (isEncodeURLNeeded()) {
               return NOPValidity.SHARED_INSTANCE;
  +        } else {
  +            return null;
           }
  -        return null;
       }
   
       /**
  @@ -280,12 +298,12 @@
        * @param  raw               name of the element
        * @param  attributes        list
        * @exception  SAXException  Description of Exception
  -     * @since
        */
       public void startElement(String uri, String name, String raw, Attributes 
attributes)
       throws SAXException {
  +        boolean isEncodeURLNeeded = isEncodeURLNeeded();
   
  -        if (this.session != null && this.elementAttributeMatching != null) {
  +        if (isEncodeURLNeeded && this.elementAttributeMatching != null) {
               String lname = name;
               if (attributes != null && attributes.getLength() > 0) {
                   AttributesImpl new_attributes = new AttributesImpl(attributes);
  @@ -295,7 +313,10 @@
                       String value = new_attributes.getValue(i);
   
                       if (elementAttributeMatching.matchesElementAttribute(lname, 
attr_lname)) {
  -                        final String new_value = response.encodeURL( value );
  +                        // don't use simply response.encodeURL
  +                        // but be more smart about the url encoding
  +                        //final String new_value = this.response.encodeURL( value );
  +                        final String new_value = this.encodeURL( value, response );
                           if (getLogger().isDebugEnabled()) {
                               this.getLogger().debug("element/@attribute matches: " + 
name + "/@" + attr_lname);
                               this.getLogger().debug("encodeURL: " + value + " -> " + 
new_value);
  @@ -313,6 +334,36 @@
       }
   
       /**
  +     * Do the URL rewriting.
  +     * <p>
  +     *   Check if <code>url</code> contains already the sessionid, some 
servlet-engines
  +     *   just appends the session-id without checking if the sessionid is already 
present.
  +     * </p>
  +     *
  +     * @param  url       the URL probably without sessionid.
  +     * @param  request   the http request
  +     * @param  response  the http response
  +     * @return           String the original url inclusive the sessionid
  +     */
  +    private String encodeURL(String url, Response response) {
  +        String encoded_url;
  +        if (response != null) {
  +            // As some servlet-engine does not check if url has been already 
rewritten
  +            Session session = getSession();
  +            if (session != null && url.indexOf(session.getId()) > -1) {
  +                // url contains already the session id encoded
  +                encoded_url = url;
  +            } else {
  +                // do encode the session id
  +                encoded_url = response.encodeURL(url);
  +            }
  +        } else {
  +            encoded_url = url;
  +        }
  +        return encoded_url;
  +    }
  +    
  +    /**
        * A helper class for matching element names, and attribute names.
        *
        * <p>
  @@ -327,13 +378,11 @@
           /**
            * Regular expression of including patterns
            *
  -         * @since
            */
           protected RE includeNameRE;
           /**
            * Regular expression of excluding patterns
            *
  -         * @since
            */
           protected RE excludeNameRE;
   
  @@ -344,7 +393,6 @@
            * @param  includeName            Description of Parameter
            * @param  excludeName            Description of Parameter
            * @exception  RESyntaxException  Description of Exception
  -         * @since
            */
           public ElementAttributeMatching(String includeName, String excludeName) 
throws RESyntaxException {
               includeNameRE = new RE(includeName, RE.MATCH_CASEINDEPENDENT);
  @@ -360,7 +408,6 @@
            * @param  attr_name
            * @return               boolean true iff value of attribute_name should 
get rewritten, else
            *   false.
  -         * @since
            */
           public boolean matchesElementAttribute(String element_name, String 
attr_name) {
               String element_attr_name = canonicalizeElementAttribute(element_name, 
attr_name);
  @@ -384,7 +431,6 @@
            * @param  element_name  Description of Parameter
            * @param  attr_name     Description of Parameter
            * @return               Description of the Returned Value
  -         * @since
            */
           private String canonicalizeElementAttribute(String element_name, String 
attr_name) {
               return element_name + "/@" + attr_name;
  @@ -397,7 +443,6 @@
            * @param  element_attr_name
            * @return                    boolean true iff exclude-name matches 
element_name, attr_name, else
            *   false.
  -         * @since
            */
           private boolean matchesExcludesElementAttribute(String element_attr_name) {
               boolean match = excludeNameRE.match(element_attr_name);
  @@ -411,7 +456,6 @@
            * @param  element_attr_name
            * @return                    boolean true iff include-name matches 
element_name, attr_name, else
            *   false.
  -         * @since
            */
           private boolean matchesIncludesElementAttribute(String element_attr_name) {
               boolean match = includeNameRE.match(element_attr_name);
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to