You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Robby Pelssers <Ro...@nxp.com> on 2011/11/10 13:52:05 UTC

Nullpointer in ZipSerializer (cocoon 2.2)

Hi guys,

Just wanted to know if the issue in below thread has ever been fixed.

http://web.archiveorange.com/archive/v/uRmkWnxszXP6g7Xuw33H

To shortly describe the use case:

http://cocoon.apache.org/2.1/userdocs/ziparchive-serializer.html

The zipserializer only allows either:

-          You specify a @src  pointing to some cocoon pipeline using cocoon://   (Ideally it would also support the servlet: protocol as now I have to provide a façade in the calling cocoon block)

-          You specify inline content and the @serializer

In a ideal world you should be able to use @src in combination with the @serializer because now I have to first include the content from a pipeline by using <cinclude> before calling
<map:serialize type="zip"/>



I actually created some nice generic functionality to work around some issues:


************************ FLOWSCRIPT ***************************************
function downloadImdsZip() {
    var entries = [];
    new Collection(cocoon.request.getParameterValues("id")).forEach(function(id){
                var entry = {"name": id + ".xml", "source": "cocoon://chemicalcontent/imds/" + id + ".xml", "serializer": "upload"};
                print('Adding entry [name=' + entry.name + ', source=' + entry.source + '] to ZIP archive.');
                entries.push(entry);
    });
    var response = cocoon.response;
                response.setHeader(
                    "Content-Disposition",
                    "attachment; filename=imds.zip"
                );
    cocoon.sendPage("zipArchive", {"entries": entries});
}

*************************************************************************
<?xml version="1.0" encoding="UTF-8"?>
<jx:template
  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0"
  xmlns:zip="http://apache.org/cocoon/zip-archive/1.0"
  xmlns:cinclude="http://apache.org/cocoon/include/1.0">
  <!--
   This jx expects an array called 'entries' containing objects with following properties:
   * name       (mandatory)
   * source     (mandatory)
   * serializer (optional)
   *
   * If both source and serializer are provided, we assume that we want to include the content inline so we can specify the serializer
   -->
  <zip:archive>
    <jx:forEach var="entry" items="${entries}">
      <zip:entry name="${entry.name}">
        <jx:choose>
          <jx:when test="${entry.serializer != null}">
            <jx:attribute name="serializer" value="${entry.serializer}"/>
            <cinclude:include src="${entry.source}"/>
          </jx:when>
          <jx:otherwise>
            <jx:attribute name="src" value="${entry.source}"/>
          </jx:otherwise>
        </jx:choose>
      </zip:entry>
    </jx:forEach>
  </zip:archive>
</jx:template>
*************************************************************************
<map:match pattern="zipArchive">
  <map:generate src="jx/zipArchive.jx" type="jx"/>
  <map:transform type="cinclude"/>
  <map:serialize type="zip"/>
</map:match>
*************************************************************************

But I now am facing the same nullpointer exception as in the link above.

Anyone some usefull input on this matter?

Cheers,
Robby Pelssers


Re: Nullpointer in ZipSerializer (cocoon 2.2)

Posted by Ivan Lagunov <la...@gmail.com>.
Robby Pelssers <Robby.Pelssers <at> nxp.com> writes:

> 
> 
> Hi guys,
>  
> Just wanted to know if the issue in below thread has ever been fixed.  
>  
> http://web.archiveorange.com/archive/v/uRmkWnxszXP6g7Xuw33H
>  
> To shortly describe the use case:
>  
> http://cocoon.apache.org/2.1/userdocs/ziparchive-serializer.html
>  
> The zipserializer only allows either:
> -          You specify a  <at> src  pointing to some cocoon pipeline using 
cocoon://   (Ideally it would also support the servlet: protocol as now I have 
to provide a façade in the calling cocoon block)
> -          You specify inline content and the  <at> serializer
>  
> In a ideal world you should be able to use  <at> src in combination with the  
<at> serializer because now I have to first include the content from a pipeline 
by using <cinclude> before calling 
> <map:serialize type=”zip”/>
>  
>  
>  
> I actually created some nice generic functionality to work around some issues:
>  
>  
> ************************ FLOWSCRIPT ***************************************
> function downloadImdsZip() {
>     var entries = [];
>     new 
Collection(cocoon.request.getParameterValues("id")).forEach(function(id){
>                 var entry = {"name": id + ".xml", "source": 
"cocoon://chemicalcontent/imds/" + id + ".xml", "serializer": "upload"};
>                 print('Adding entry [name=' + entry.name + ', source=' + 
entry.source + '] to ZIP archive.');          
>                 entries.push(entry);
>     });
>     var response = cocoon.response;                         
>                 response.setHeader(
>                     "Content-Disposition",
>                     "attachment; filename=imds.zip"
>                 );    
>     cocoon.sendPage("zipArchive", {"entries": entries});  
> }
>  
> *************************************************************************
> <?xml version="1.0" encoding="UTF-8"?>
> <jx:template 
>   xmlns:jx="http://apache.org/cocoon/templates/jx/1.0"
>   xmlns:zip="http://apache.org/cocoon/zip-archive/1.0"
>   xmlns:cinclude="http://apache.org/cocoon/include/1.0">
>   <!-- 
>    This jx expects an array called 'entries' containing objects with following 
properties:
>    * name       (mandatory)
>    * source     (mandatory)
>    * serializer (optional)
>    * 
>    * If both source and serializer are provided, we assume that we want to 
include the content inline so we can specify the serializer
>    -->
>   <zip:archive>
>     <jx:forEach var="entry" items="${entries}">
>       <zip:entry name="${entry.name}">
>         <jx:choose>
>           <jx:when test="${entry.serializer != null}">
>             <jx:attribute name="serializer" value="${entry.serializer}"/> 
>             <cinclude:include src="${entry.source}"/>          
>           </jx:when>
>           <jx:otherwise>
>             <jx:attribute name="src" value="${entry.source}"/>           
>           </jx:otherwise>
>         </jx:choose>
>       </zip:entry>
>     </jx:forEach>
>   </zip:archive>
> </jx:template>
> *************************************************************************
> <map:match pattern="zipArchive">
>   <map:generate src="jx/zipArchive.jx" type="jx"/>
>   <map:transform type="cinclude"/>
>   <map:serialize type="zip"/>
> </map:match>
> *************************************************************************
>  
> But I now am facing the same nullpointer exception as in the link above.
>  
> Anyone some usefull input on this matter?
>  
> Cheers,
> Robby Pelssers
>  
> 

Hi Robby,

Just want to share my fix with the community. The NullPointerException was 
caused by ZipArchiveSerializer (improper usage of a setter method). If you read 
javadocs, they'll tell you that you shouldn't provide null to setConsumer 
method. You can use the specific method to deinitialize consumer. Here is the 
patch:

Index: src/main/java/org/apache/cocoon/serialization/ZipArchiveSerializer.java
===================================================================
--- src/main/java/org/apache/cocoon/serialization/ZipArchiveSerializer.java	
(revision 1208405)
+++ src/main/java/org/apache/cocoon/serialization/ZipArchiveSerializer.java	
(revision )
@@ -369,7 +369,7 @@
                     throw this.exception = new SAXException(ioe);
                 }
 
-                super.setConsumer(null);
+                super.recycle();
                 this.selector.release(this.serializer);
                 this.serializer = null;
 
Best regards,
Ivan Lagunov