Changeset 30252

Show
Ignore:
Timestamp:
02/18/08 20:36:56 (9 months ago)
Author:
fguillaume
Message:

NXP-2082: XML export uses incorrect charset; NXP-2085: Restlet export consumes too much memory (merged r30251 from 5.1. branch)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • org.nuxeo.ecm.platform/trunk/nuxeo-platform-ui-web/src/main/java/org/nuxeo/ecm/platform/ui/web/restAPI/ExportRestlet.java

    • Property svn:keywords set to Id
    r29019 r30252  
    11/* 
    2  * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors. 
     2 * (C) Copyright 2006-2008 Nuxeo SAS (http://nuxeo.com/) and contributors. 
    33 * 
    44 * All rights reserved. This program and the accompanying materials 
     
    1313 * 
    1414 * Contributors: 
    15  *     Nuxeo - initial API and implementation 
     15 *     Thierry Delprat 
     16 *     Florent Guillaume 
    1617 * 
    17  * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier
     18 * $Id
    1819 */ 
    1920 
    2021package org.nuxeo.ecm.platform.ui.web.restAPI; 
    2122 
    22 import static org.jboss.seam.ScopeType.EVENT
     23import static org.jboss.seam.ScopeType.STATELESS
    2324 
    24 import java.io.ByteArrayOutputStream; 
    25 import java.io.IOException; 
     25import java.util.Map; 
    2626 
    2727import org.jboss.seam.annotations.In; 
     
    3232import org.nuxeo.ecm.core.api.DocumentModel; 
    3333import org.nuxeo.ecm.core.api.IdRef; 
    34 import org.nuxeo.ecm.core.io.DocumentPipe; 
    35 import org.nuxeo.ecm.core.io.DocumentReader; 
    36 import org.nuxeo.ecm.core.io.DocumentWriter; 
    37 import org.nuxeo.ecm.core.io.impl.DocumentPipeImpl; 
    38 import org.nuxeo.ecm.core.io.impl.plugins.DocumentTreeReader; 
    39 import org.nuxeo.ecm.core.io.impl.plugins.NuxeoArchiveWriter; 
    40 import org.nuxeo.ecm.core.io.impl.plugins.SingleDocumentReader; 
    41 import org.nuxeo.ecm.core.io.impl.plugins.XMLDocumentTreeWriter; 
    42 import org.nuxeo.ecm.core.io.impl.plugins.XMLDocumentWriter; 
    4334import org.nuxeo.ecm.platform.ui.web.api.NavigationContext; 
    4435import org.nuxeo.ecm.platform.util.RepositoryLocation; 
    45 import org.restlet.data.MediaType
     36import org.restlet.data.Form
    4637import org.restlet.data.Request; 
    4738import org.restlet.data.Response; 
    4839 
     40import com.noelios.restlet.http.HttpConstants; 
     41 
    4942@Name("exportRestlet") 
    50 @Scope(EVENT
     43@Scope(STATELESS
    5144public class ExportRestlet extends BaseNuxeoRestlet { 
    5245 
     
    5447    protected NavigationContext navigationContext; 
    5548 
    56     protected CoreSession documentManager; 
    57  
    5849    @Override 
    5950    public void handle(Request req, Response res) { 
    60  
    61         boolean exportAsTree = false; 
    62         boolean exportAsZip = false; 
     51        boolean exportAsTree; 
     52        boolean exportAsZip; 
     53        CoreSession documentManager; 
     54        DocumentModel root; 
    6355 
    6456        String action = req.getResourceRef().getSegments().get(4); 
     
    7062            exportAsZip = false; 
    7163        } else if (action.equals("export")) { 
     64            exportAsTree = false; 
     65            exportAsZip = false; 
     66        } else { 
    7267            exportAsTree = false; 
    7368            exportAsZip = false; 
     
    8479        String repo = (String) req.getAttributes().get("repo"); 
    8580        String docid = (String) req.getAttributes().get("docid"); 
    86         DocumentModel dm = null; 
    8781 
    8882        if (repo == null || repo.equals("*")) { 
     
    9690            documentManager = navigationContext.getOrCreateDocumentManager(); 
    9791            if (docid == null || docid.equals("*")) { 
    98                 dm = documentManager.getRootDocument(); 
     92                root = documentManager.getRootDocument(); 
    9993            } else { 
    100                 dm = documentManager.getDocument(new IdRef(docid)); 
     94                root = documentManager.getDocument(new IdRef(docid)); 
    10195            } 
    10296        } catch (ClientException e) { 
     
    10599        } 
    106100 
    107         DocumentReader reader = null; 
    108         DocumentWriter writer = null; 
    109         try { 
     101        if (exportAsZip) { 
     102            // set the content disposition and file name 
     103            String FILENAME = "export.zip"; 
    110104 
    111             if (exportAsTree) { 
    112                 reader = new DocumentTreeReader(documentManager, dm, false); 
    113                 if (!exportAsZip) { 
    114                     ((DocumentTreeReader) reader).setInlineBlobs(true); 
    115                 } 
    116             } else { 
    117                 reader = new SingleDocumentReader(documentManager, dm); 
     105            // use the Facelets APIs to set a new header 
     106            Map<String, Object> attributes = res.getAttributes(); 
     107            Form headers = (Form) attributes.get(HttpConstants.ATTRIBUTE_HEADERS); 
     108            if (headers == null) { 
     109                headers = new Form(); 
    118110            } 
    119  
    120             ByteArrayOutputStream exportOut = new ByteArrayOutputStream(); 
    121  
    122             if (exportAsZip) { 
    123                 writer = new NuxeoArchiveWriter(exportOut); 
    124             } else { 
    125                 if (exportAsTree) { 
    126                     writer = new XMLDocumentTreeWriter(exportOut); 
    127                 } else { 
    128                     writer = new XMLDocumentWriter(exportOut); 
    129                 } 
    130             } 
    131  
    132             DocumentPipe pipe; 
    133  
    134             if (exportAsTree) { 
    135                 pipe = new DocumentPipeImpl(10); 
    136             } else { 
    137                 pipe = new DocumentPipeImpl(); 
    138             } 
    139  
    140             // pipe.addTransformer(transformer); 
    141             pipe.setReader(reader); 
    142             pipe.setWriter(writer); 
    143             pipe.run(); 
    144  
    145             if (exportAsZip) { 
    146                 ExportResource result = new ExportResource(getContext(), req, 
    147                         res, exportOut); 
    148                 res.setEntity(result.getRepresentation(null)); 
    149                 String filename = "export.zip"; 
    150                 getHttpResponse(res).setHeader("Content-Disposition", 
    151                         "attachment; filename=\"" + filename + "\";"); 
    152             } else { 
    153                 res.setEntity(exportOut.toString(), MediaType.TEXT_XML); 
    154             } 
    155  
    156         } catch (ClientException e) { 
    157             handleError(res, e); 
    158         } catch (IOException e) { 
    159             handleError(res, e); 
    160         } catch (Exception e) { 
    161             handleError(res, e); 
    162         } finally { 
    163             if (reader != null) { 
    164                 reader.close(); 
    165             } 
    166             if (writer != null) { 
    167                 writer.close(); 
    168             } 
     111            headers.add("Content-Disposition", String.format( 
     112                    "attachment; filename=\"%s\";", FILENAME)); 
     113            attributes.put(HttpConstants.ATTRIBUTE_HEADERS, headers); 
    169114        } 
    170115 
     116        res.setEntity(new ExportRepresentation(exportAsTree, exportAsZip, 
     117                documentManager, root)); 
    171118    } 
    172119