gianugo     2003/03/03 14:44:10

  Modified:    src/blocks/html/java/org/apache/cocoon/generation
                        HTMLGenerator.java
               src/documentation/xdocs/userdocs/generators
                        html-generator.xml
               .        changes.xml
  Log:
  Extended the HTMLGenerator so that it can handle HTML snippets
  provided as request parameter or as POST data, passing them through
  Tidy to ensure well-formedness.
  
  Revision  Changes    Path
  1.6       +89 -24    
xml-cocoon2/src/blocks/html/java/org/apache/cocoon/generation/HTMLGenerator.java
  
  Index: HTMLGenerator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/blocks/html/java/org/apache/cocoon/generation/HTMLGenerator.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- HTMLGenerator.java        27 Feb 2003 22:25:19 -0000      1.5
  +++ HTMLGenerator.java        3 Mar 2003 22:44:10 -0000       1.6
  @@ -50,7 +50,22 @@
   */
   package org.apache.cocoon.generation;
   
  -import org.apache.excalibur.xml.xpath.XPathProcessor;
  +import java.io.BufferedInputStream;
  +import java.io.ByteArrayInputStream;
  +import java.io.IOException;
  +import java.io.InputStream;
  +import java.io.PrintWriter;
  +import java.io.StringWriter;
  +import java.util.Map;
  +import java.util.Properties;
  +
  +import javax.servlet.http.HttpServletRequest;
  +import javax.xml.transform.OutputKeys;
  +import javax.xml.transform.Transformer;
  +import javax.xml.transform.TransformerFactory;
  +import javax.xml.transform.dom.DOMSource;
  +import javax.xml.transform.sax.SAXResult;
  +
   import org.apache.avalon.framework.activity.Disposable;
   import org.apache.avalon.framework.component.Component;
   import org.apache.avalon.framework.component.ComponentException;
  @@ -64,44 +79,40 @@
   import org.apache.cocoon.caching.CacheableProcessingComponent;
   import org.apache.cocoon.components.source.SourceUtil;
   import org.apache.cocoon.components.url.URLFactory;
  -import org.apache.cocoon.environment.ObjectModelHelper;
  -import org.apache.cocoon.environment.Request;
   import org.apache.cocoon.environment.SourceResolver;
   import org.apache.cocoon.environment.URLFactorySourceResolver;
  +import org.apache.cocoon.environment.http.HttpEnvironment;
  +import org.apache.cocoon.util.PostInputStream;
   import org.apache.cocoon.xml.XMLUtils;
   import org.apache.cocoon.xml.dom.DOMStreamer;
   import org.apache.excalibur.source.Source;
   import org.apache.excalibur.source.SourceException;
   import org.apache.excalibur.source.SourceValidity;
  +import org.apache.excalibur.xml.xpath.XPathProcessor;
   import org.w3c.dom.NodeList;
   import org.w3c.tidy.Tidy;
   import org.xml.sax.SAXException;
   
  -import javax.xml.transform.OutputKeys;
  -import javax.xml.transform.Transformer;
  -import javax.xml.transform.TransformerFactory;
  -import javax.xml.transform.dom.DOMSource;
  -import javax.xml.transform.sax.SAXResult;
  -
  -import java.io.BufferedInputStream;
  -import java.io.IOException;
  -import java.io.PrintWriter;
  -import java.io.StringWriter;
  -import java.util.Map;
  -import java.util.Properties;
  -
   /**
    * @author <a href="mailto:[EMAIL PROTECTED]">Davanum Srinivas</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a>
  + * @author <a href="mailto:[EMAIL PROTECTED]">Gianugo Rabellino</a>
  + *
    * @version CVS $Id$
    */
   public class HTMLGenerator extends ComposerGenerator
   implements Configurable, CacheableProcessingComponent, Disposable {
  -
  -    /** The  source */
  +    
  +    /** The parameter that specifies what request attribute to use, if any */
  +    public static final String FORM_NAME = "form-name";
  +    
  +    /** The  source, if coming from a file */
       private Source inputSource;
  -
  +    
  +    /** The source, if coming from the request */
  +    private InputStream requestStream;
  +    
       /** XPATH expression */
       private String xpath = null;
   
  @@ -155,6 +166,7 @@
           if (this.inputSource != null) {
               this.resolver.release( this.inputSource );
               this.inputSource = null;
  +            this.requestStream = null;
           }
           this.xpath = null;
           super.recycle();
  @@ -168,7 +180,48 @@
       throws ProcessingException, SAXException, IOException {
           super.setup(resolver, objectModel, src, par);
   
  -        Request request = ObjectModelHelper.getRequest(objectModel);
  +        HttpServletRequest request = (HttpServletRequest) 
objectModel.get(HttpEnvironment.HTTP_REQUEST_OBJECT);
  +        
  +        if (src == null) {
  +            // Handle this request as the StreamGenerator does (from the POST
  +            // request or from a request parameter), but try to make sure
  +            // that the output will be well-formed
  +                       
  +            String contentType = request.getContentType();
  +            
  +            if (contentType == null ) {
  +                throw new IOException("Content-type was not specified for this 
request");
  +            } else if (contentType.startsWith("application/x-www-form-urlencoded") 
||
  +                contentType.startsWith("multipart/form-data")) {
  +                String requested = parameters.getParameter(FORM_NAME, null);
  +                if (requested == null) {
  +                    throw new ProcessingException(
  +                        "HtmlGenerator with no \"src\" parameter expects a sitemap 
parameter called '" +
  +                        FORM_NAME + "' for handling form data"
  +                );
  +                }
  +                
  +                String sXml = request.getParameter(requested);
  +                
  +                requestStream = new ByteArrayInputStream(sXml.getBytes());
  +                
  +            } else if (contentType.startsWith("text/plain") ||
  +                contentType.startsWith("text/xml") ||
  +                contentType.startsWith("application/xml")) {
  +
  +                int len = request.getContentLength();
  +                if (len > 0) {
  +                    requestStream = new PostInputStream(request.getInputStream(), 
len);
  +                } else {
  +                throw new IOException("getContentLen() == 0");
  +                }
  +            } else {
  +                throw new IOException("Unexpected getContentType(): " + 
request.getContentType());
  +            }    
  +                
  +            
  +        }
  +
           xpath = request.getParameter("xpath");
           if(xpath == null)
               xpath = par.getParameter("xpath",null);
  @@ -183,7 +236,8 @@
           }
   
           try {
  -            this.inputSource = resolver.resolveURI(super.source);
  +            if (source != null)
  +                this.inputSource = resolver.resolveURI(super.source);
           } catch (SourceException se) {
               throw SourceUtil.handle("Unable to resolve " + super.source, se);
           }
  @@ -198,6 +252,9 @@
        *              is currently not cacheable.
        */
       public java.io.Serializable generateKey() {
  +        if (this.inputSource == null)
  +            return null;
  +            
           if (this.xpath != null) {
               StringBuffer buffer = new StringBuffer(this.inputSource.getURI());
               buffer.append(':').append(this.xpath);
  @@ -216,6 +273,8 @@
        *         component is currently not cacheable.
        */
       public SourceValidity generateValidity() {
  +        if (this.inputSource == null)
  +            return null;
           return this.inputSource.getValidity();
       }
   
  @@ -231,7 +290,7 @@
               tidy.setXmlOut(true);
               
               if (this.properties == null) {
  -            tidy.setXHTML(true);
  +                tidy.setXHTML(true);
               } else {
                   tidy.setConfigurationFromProps(this.properties);
               }
  @@ -246,7 +305,11 @@
               tidy.setErrout(errorWriter);
   
               // Extract the document using JTidy and stream it.
  -            org.w3c.dom.Document doc = tidy.parseDOM(new 
BufferedInputStream(this.inputSource.getInputStream()), null);
  +            
  +            if (inputSource != null)
  +                requestStream = this.inputSource.getInputStream();
  +                                
  +            org.w3c.dom.Document doc = tidy.parseDOM(new 
BufferedInputStream(requestStream), null);
   
               // FIXME: Jtidy doesn't warn or strip duplicate attributes in same
               // tag; stripping.
  @@ -258,6 +321,7 @@
                  getLogger().warn(stringWriter.toString());
               }
   
  +            
               if(xpath != null)
               {
                   Transformer serializer = 
TransformerFactory.newInstance().newTransformer();
  @@ -285,6 +349,7 @@
               throw new ProcessingException("Exception in 
HTMLGenerator.generate()",e);
           }
       }
  +    
   
       public void dispose() {
           if (this.manager != null) {
  
  
  
  1.3       +16 -0     
xml-cocoon2/src/documentation/xdocs/userdocs/generators/html-generator.xml
  
  Index: html-generator.xml
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/documentation/xdocs/userdocs/generators/html-generator.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- html-generator.xml        1 Dec 2002 22:11:24 -0000       1.2
  +++ html-generator.xml        3 Mar 2003 22:44:10 -0000       1.3
  @@ -9,6 +9,7 @@
                <authors>
                        <person name="Carsten Ziegeler" email="[EMAIL PROTECTED]"/>
                        <person name="Sylvain Wallez" email="[EMAIL PROTECTED]"/>
  +                     <person name="Gianugo Rabellino " email="[EMAIL PROTECTED]"/>
                 </authors>
                 <abstract>This document describes the html generator of 
Cocoon.</abstract>
        </header>
  @@ -33,6 +34,21 @@
     <map:generate src="document.html" type="html"/>
        ]]>
   </source>
  +      <p>The html generator, however, can operate also on a request
  +      attribute or on a XML POST request. This can be done also by the
  +      <link href="stream-generator.html">stream generator</link>, with whom
  +      it shares the syntax: the added bonus here is that you can
  +      "sanitize" a possibly non well-formed XML snippet for further
  +      reuse later. In order to use this feature for request attributes, 
  +      just omit the "src" attribute and set a parameter like the following 
  +      one in the sitemap:</p>
  +
  +<source>
  +<![CDATA[
  +  <map:parameter name="form-name" value="my-request-attribute"/>
  +]]>
  +</source>
  +
                </s1>
                <s1 title="Configuring JTidy">
                  <p>Without any configuration, the generator produces an XHTML 
document, with the proper namespace. However,
  
  
  
  1.361     +6 -1      xml-cocoon2/changes.xml
  
  Index: changes.xml
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/changes.xml,v
  retrieving revision 1.360
  retrieving revision 1.361
  diff -u -r1.360 -r1.361
  --- changes.xml       3 Mar 2003 10:14:08 -0000       1.360
  +++ changes.xml       3 Mar 2003 22:44:10 -0000       1.361
  @@ -41,6 +41,11 @@
    </devs>
   
    <release version="@version@" date="@date@">
  +  <action dev="GR" type="add">
  +   Extended the HTMLGenerator so that it can handle HTML snippets
  +   provided as request parameter or as POST data, passing them through
  +   Tidy to ensure well-formedness.
  +  </action>
     <action dev="CZ" type="add">
      New caching cinclude transformer. The cinclude transformer can now cache
      the aggregated content for a distinct period of time. In addition it can
  
  
  

Reply via email to