/* * MetadataExportReader.java * * Version: $Revision: $ * * Date: $Date: $ * * Copyright (c) 2002-2009, The DSpace Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of the DSpace Foundation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.dspace.app.xmlui.cocoon; import java.io.IOException; import java.util.Map; import java.util.ArrayList; import javax.servlet.http.HttpServletResponse; import org.xml.sax.SAXException; import org.apache.avalon.excalibur.pool.Recyclable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.Response; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.environment.http.HttpEnvironment; import org.apache.cocoon.reading.AbstractReader; import org.apache.log4j.Logger; import org.dspace.app.xmlui.utils.AuthenticationUtil; import org.dspace.app.xmlui.utils.ContextUtil; import org.dspace.authorize.AuthorizeManager; import org.dspace.handle.HandleManager; import org.dspace.core.Context; import org.dspace.core.Constants; import org.dspace.core.LogManager; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; import org.dspace.content.ItemIterator; import org.dspace.app.bulkedit.DSpaceCSV; import org.dspace.app.bulkedit.MetadataExport; /** * * AbstractReader that generates a CSV of item, collection * or community metadata using MetadataExport * * @author Kim Shepherd */ public class MetadataExportReader extends AbstractReader implements Recyclable { /** * Messages to be sent when the user is not authorized to view * a particular bitstream. They will be redirected to the login * where this message will be displayed. */ private final static String AUTH_REQUIRED_HEADER = "xmlui.ItemExportDownloadReader.auth_header"; private final static String AUTH_REQUIRED_MESSAGE = "xmlui.ItemExportDownloadReader.auth_message"; /** * How big of a buffer should we use when reading from the bitstream before * writting to the HTTP response? */ protected static final int BUFFER_SIZE = 8192; /** * When should a download expire in milliseconds. This should be set to * some low value just to prevent someone hitting DSpace repeatily from * killing the server. Note: 60000 milliseconds are in a second. * * Format: minutes * seconds * milliseconds */ protected static final int expires = 60 * 60 * 60000; /** The Cocoon response */ protected Response response; /** The Cocoon request */ protected Request request; private static Logger log = Logger.getLogger(MetadataExportReader.class); DSpaceCSV csv = null; MetadataExport exporter = null; String filename = null; /** * Set up the export reader. * * See the class description for information on configuration options. */ public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException { super.setup(resolver, objectModel, src, par); try { this.request = ObjectModelHelper.getRequest(objectModel); this.response = ObjectModelHelper.getResponse(objectModel); Context context = ContextUtil.obtainContext(objectModel); if(AuthorizeManager.isAdmin(context)) { /* Get our parameters that identify the item, collection * or community to be exported * */ String handle = par.getParameter("handle"); DSpaceObject dso = HandleManager.resolveToObject(context, handle); ArrayList itemmd = new ArrayList(); if(dso.getType() == Constants.ITEM) { itemmd.add(dso.getID()); exporter = new MetadataExport(context, new ItemIterator(context, itemmd),true); } else if(dso.getType() == Constants.COLLECTION) { Collection collection = (Collection)dso; ItemIterator toExport = collection.getAllItems(); exporter = new MetadataExport(context, toExport,true); } else if(dso.getType() == Constants.COMMUNITY) { exporter = new MetadataExport(context, (Community)dso, false); } log.info(LogManager.getHeader(context, "metadataexport", "exporting_handle:" + handle)); csv = exporter.export(); filename = handle.replaceAll("/", "-") + ".csv"; log.info(LogManager.getHeader(context, "metadataexport", "exported_file:" + filename)); } else { /* * Auth should ge done by MetadataExport -- pass context through * we should just be catching exceptions and displaying errors here * */ if(this.request.getSession().getAttribute("dspace.current.user.id")!=null) { String redictURL = request.getContextPath() + "/restricted-resource"; HttpServletResponse httpResponse = (HttpServletResponse) objectModel.get(HttpEnvironment.HTTP_RESPONSE_OBJECT); httpResponse.sendRedirect(redictURL); return; } else { String redictURL = request.getContextPath() + "/login"; AuthenticationUtil.interruptRequest(objectModel, AUTH_REQUIRED_HEADER, AUTH_REQUIRED_MESSAGE, null); HttpServletResponse httpResponse = (HttpServletResponse) objectModel.get(HttpEnvironment.HTTP_RESPONSE_OBJECT); httpResponse.sendRedirect(redictURL); return; } } } catch (Exception e) { throw new ProcessingException("Unable to read bitstream.",e); } } /** * Write the CSV. * */ public void generate() throws IOException, SAXException, ProcessingException { response.setContentType("text/csv; charset=UTF-8"); response.setHeader("Content-Disposition","attachment; filename=" + filename); out.write(csv.toString().getBytes("UTF-8")); out.flush(); out.close(); } /** * Recycle */ public void recycle() { this.response = null; this.request = null; } }