com.openkm.extension.servlet.StaplingDownloadServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.openkm.extension.servlet.StaplingDownloadServlet.java

Source

/**
 *  OpenKM, Open Document Management System (http://www.openkm.com)
 *  Copyright (c) 2006-2011  Paco Avila & Josep Llort
 *
 *  No bytes were intentionally harmed during the development of this application.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.openkm.extension.servlet;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.openkm.api.OKMDocument;
import com.openkm.api.OKMRepository;
import com.openkm.core.AccessDeniedException;
import com.openkm.core.DatabaseException;
import com.openkm.core.PathNotFoundException;
import com.openkm.core.RepositoryException;
import com.openkm.extension.dao.StapleGroupDAO;
import com.openkm.extension.dao.bean.Staple;
import com.openkm.extension.dao.bean.StapleGroup;
import com.openkm.util.ArchiveUtils;
import com.openkm.util.FileUtils;
import com.openkm.util.WebUtils;

/**
 * Staple Download Servlet
 */
public class StaplingDownloadServlet extends BaseServlet {
    private static Logger log = LoggerFactory.getLogger(StaplingDownloadServlet.class);
    private static final long serialVersionUID = 1L;

    /**
     * 
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        int sgId = WebUtils.getInt(request, "sgId");
        File tmpZip = File.createTempFile("okm", ".zip");

        try {
            String archive = "stapling.zip";
            response.setHeader("Content-disposition", "attachment; filename=\"" + archive + "\"");
            response.setContentType("application/zip");
            OutputStream out = response.getOutputStream();
            exportZip(sgId, out);
            out.flush();
            out.close();
        } catch (RepositoryException e) {
            log.warn(e.getMessage(), e);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                    "RepositoryException: " + e.getMessage());
        } catch (Exception e) {
            log.warn(e.getMessage(), e);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
        } finally {
            FileUtils.deleteQuietly(tmpZip);
        }
    }

    /**
     * Generate a zip file from a repository folder path   
     */
    private void exportZip(int sgId, OutputStream os) throws RepositoryException, IOException, DatabaseException {
        log.debug("exportZip({}, {})", sgId, os);
        File tmpDir = null;
        BufferedWriter bw = null;
        OKMDocument okmDoc = OKMDocument.getInstance();
        OKMRepository okmRepo = OKMRepository.getInstance();

        try {
            tmpDir = FileUtils.createTempDir();
            bw = new BufferedWriter(new FileWriter(new File(tmpDir, "summary.txt")));
            StapleGroup sg = StapleGroupDAO.findByPk(sgId);

            for (Staple s : sg.getStaples()) {
                String uuid = s.getUuid();
                String path = null;

                try {
                    path = okmRepo.getNodePath(null, uuid);
                    int idx = path.indexOf('/', 1);

                    if (idx > 0) {
                        String relPath = path.substring(idx);
                        File expFile = new File(tmpDir, relPath);
                        expFile.getParentFile().mkdirs();
                        FileOutputStream fos = new FileOutputStream(expFile);

                        if (okmDoc.isValid(null, path)) {
                            InputStream is = okmDoc.getContent(null, path, false);
                            IOUtils.copy(is, fos);
                            is.close();
                        }

                        bw.write(path + " - OK\n");
                        bw.flush();
                    }
                } catch (PathNotFoundException e) {
                    bw.write(path != null ? path : uuid + " - " + e.getMessage() + "\n");
                    bw.flush();
                } catch (AccessDeniedException e) {
                    bw.write(path != null ? path : uuid + " - " + e.getMessage() + "\n");
                    bw.flush();
                }
            }

            // Zip files
            IOUtils.closeQuietly(bw);
            ArchiveUtils.createZip(tmpDir, "stapling", os);
        } catch (IOException e) {
            log.error("Error exporting zip", e);
            throw e;
        } finally {
            if (tmpDir != null) {
                try {
                    org.apache.commons.io.FileUtils.deleteDirectory(tmpDir);
                } catch (IOException e) {
                    log.error("Error deleting temporal directory", e);
                    throw e;
                }
            }
        }

        log.debug("exportZip: void");
    }
}