Changeset 30251

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

NXP-2082: XML export uses incorrect charset; NXP-2085: Restlet export consumes too much memory

Files:

Legend:

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

    • Property svn:keywords set to Id
    r29029 r30251  
    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 
     23import static org.jboss.seam.ScopeType.STATELESS; 
    2224 
    23 import static org.jboss.seam.ScopeType.EVENT; 
    24  
    25 import java.io.ByteArrayOutputStream; 
    26 import java.io.IOException; 
     25import java.util.Map; 
    2726 
    2827import org.jboss.seam.annotations.In; 
     
    3332import org.nuxeo.ecm.core.api.DocumentModel; 
    3433import org.nuxeo.ecm.core.api.IdRef; 
    35 import org.nuxeo.ecm.core.io.DocumentPipe; 
    36 import org.nuxeo.ecm.core.io.DocumentReader; 
    37 import org.nuxeo.ecm.core.io.DocumentWriter; 
    38 import org.nuxeo.ecm.core.io.impl.DocumentPipeImpl; 
    39 import org.nuxeo.ecm.core.io.impl.plugins.DocumentTreeReader; 
    40 import org.nuxeo.ecm.core.io.impl.plugins.NuxeoArchiveWriter; 
    41 import org.nuxeo.ecm.core.io.impl.plugins.SingleDocumentReader; 
    42 import org.nuxeo.ecm.core.io.impl.plugins.XMLDocumentTreeWriter; 
    43 import org.nuxeo.ecm.core.io.impl.plugins.XMLDocumentWriter; 
    4434import org.nuxeo.ecm.platform.ui.web.api.NavigationContext; 
    4535import org.nuxeo.ecm.platform.util.RepositoryLocation; 
    46 import org.restlet.data.MediaType
     36import org.restlet.data.Form
    4737import org.restlet.data.Request; 
    4838import org.restlet.data.Response; 
    4939 
     40import com.noelios.restlet.http.HttpConstants; 
    5041 
    5142@Name("exportRestlet") 
    52 @Scope(EVENT
     43@Scope(STATELESS
    5344public class ExportRestlet extends BaseNuxeoRestlet { 
    5445 
     
    5647    protected NavigationContext navigationContext; 
    5748 
    58     protected CoreSession documentManager; 
    59  
    6049    @Override 
    6150    public void handle(Request req, Response res) { 
    62  
    63         boolean exportAsTree = false; 
    64         boolean exportAsZip = false; 
     51        boolean exportAsTree; 
     52        boolean exportAsZip; 
     53        CoreSession documentManager; 
     54        DocumentModel root; 
    6555 
    6656        String action = req.getResourceRef().getSegments().get(4); 
     
    7262            exportAsZip = false; 
    7363        } else if (action.equals("export")) { 
     64            exportAsTree = false; 
     65            exportAsZip = false; 
     66        } else { 
    7467            exportAsTree = false; 
    7568            exportAsZip = false; 
     
    8679        String repo = (String) req.getAttributes().get("repo"); 
    8780        String docid = (String) req.getAttributes().get("docid"); 
    88         DocumentModel dm = null; 
    8981 
    9082        if (repo == null || repo.equals("*")) { 
     
    9890            documentManager = navigationContext.getOrCreateDocumentManager(); 
    9991            if (docid == null || docid.equals("*")) { 
    100                 dm = documentManager.getRootDocument(); 
     92                root = documentManager.getRootDocument(); 
    10193            } else { 
    102                 dm = documentManager.getDocument(new IdRef(docid)); 
     94                root = documentManager.getDocument(new IdRef(docid)); 
    10395            } 
    10496        } catch (ClientException e) { 
     
    10799        } 
    108100 
    109         DocumentReader reader = null; 
    110         DocumentWriter writer = null; 
    111         try { 
    112             if (exportAsTree) { 
    113                 reader = new DocumentTreeReader(documentManager, dm, false); 
    114                 if (!exportAsZip) { 
    115                     ((DocumentTreeReader) reader).setInlineBlobs(true); 
    116                 } 
    117             } else { 
    118                 reader = new SingleDocumentReader(documentManager, dm); 
     101        if (exportAsZip) { 
     102            // set the content disposition and file name 
     103            String FILENAME = "export.zip"; 
     104 
     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(); 
    119110            } 
    120  
    121             ByteArrayOutputStream exportOut = new ByteArrayOutputStream(); 
    122  
    123             if (exportAsZip) { 
    124                 writer = new NuxeoArchiveWriter(exportOut); 
    125             } else { 
    126                 if (exportAsTree) { 
    127                     writer = new XMLDocumentTreeWriter(exportOut); 
    128                 } else { 
    129                     writer = new XMLDocumentWriter(exportOut); 
    130                 } 
    131             } 
    132  
    133             DocumentPipe pipe; 
    134  
    135             if (exportAsTree) { 
    136                 pipe = new DocumentPipeImpl(10); 
    137             } else { 
    138                 pipe = new DocumentPipeImpl(); 
    139             } 
    140  
    141             // pipe.addTransformer(transformer); 
    142             pipe.setReader(reader); 
    143             pipe.setWriter(writer); 
    144             pipe.run(); 
    145  
    146             if (exportAsZip) { 
    147                 ExportResource result = new ExportResource(getContext(), req, 
    148                         res, exportOut); 
    149                 res.setEntity(result.getRepresentation(null)); 
    150                 String filename="export.zip"; 
    151                 getHttpResponse(res).setHeader("Content-Disposition", 
    152                         "attachment; filename=\"" + filename + "\";"); 
    153             } else { 
    154                 res.setEntity(exportOut.toString(), MediaType.TEXT_XML); 
    155             } 
    156  
    157  
    158         } catch (ClientException e) { 
    159             handleError(res, e); 
    160         } catch (IOException e) { 
    161             handleError(res, e); 
    162         } catch (Exception e) { 
    163             handleError(res, e); 
    164         } finally { 
    165             if (reader != null) { 
    166                 reader.close(); 
    167             } 
    168             if (writer != null) { 
    169                 writer.close(); 
    170             } 
     111            headers.add("Content-Disposition", String.format( 
     112                    "attachment; filename=\"%s\";", FILENAME)); 
     113            attributes.put(HttpConstants.ATTRIBUTE_HEADERS, headers); 
    171114        } 
    172115 
     116        res.setEntity(new ExportRepresentation(exportAsTree, exportAsZip, 
     117                documentManager, root)); 
    173118    } 
    174119