org.jamwiki.servlets.ExportServlet.java Source code

Java tutorial

Introduction

Here is the source code for org.jamwiki.servlets.ExportServlet.java

Source

/**
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, version 2.1, dated February 1999.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the latest version of the GNU Lesser General
 * Public License as published by the Free Software Foundation;
 *
 * 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program (LICENSE.txt); if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package org.jamwiki.servlets;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.jamwiki.WikiException;
import org.jamwiki.WikiMessage;
import org.jamwiki.migrate.MigrationException;
import org.jamwiki.migrate.MigrationUtil;
import org.jamwiki.utils.WikiLogger;
import org.jamwiki.utils.WikiUtil;
import org.springframework.web.servlet.ModelAndView;

/**
 * Used to export an XML file from a wiki topic.
 */
public class ExportServlet extends JAMWikiServlet {

    private static final WikiLogger logger = WikiLogger.getLogger(ExportServlet.class.getName());
    /** The name of the JSP file used to render the servlet output. */
    protected static final String JSP_EXPORT = "export.jsp";

    /**
     *
     */
    public ModelAndView handleJAMWikiRequest(HttpServletRequest request, HttpServletResponse response,
            ModelAndView next, WikiPageInfo pageInfo) throws Exception {
        // if a file is ready to export then export it as XML, otherwise display a page
        this.layout = true;
        if (!StringUtils.isBlank(request.getParameter("export"))
                && this.exportFile(request, response, next, pageInfo)) {
            // do not load defaults or redirect if processing is successful - return as raw XML
            this.layout = false;
            return null;
        }
        this.view(request, next, pageInfo);
        return next;
    }

    /**
     *
     */
    private boolean exportFile(HttpServletRequest request, HttpServletResponse response, ModelAndView next,
            WikiPageInfo pageInfo) {
        String topicNames = request.getParameter("topics");
        boolean download = (!StringUtils.isBlank(request.getParameter("download")));
        boolean excludeHistory = (!StringUtils.isBlank(request.getParameter("history")));
        boolean success = false;
        try {
            if (StringUtils.isBlank(topicNames)) {
                throw new WikiException(new WikiMessage("export.error.notopic"));
            }
            // write export file to the server
            File directory = WikiUtil.getTempDirectory();
            if (!directory.exists()) {
                throw new WikiException(
                        new WikiMessage("upload.error.directorycreate", directory.getAbsolutePath()));
            }
            // use current timestamp as unique file name
            String filename = System.currentTimeMillis() + ".xml";
            File file = new File(directory, filename);
            List<String> topicNameList = Arrays.asList(StringUtils.split(topicNames, "\n\r"));
            String virtualWiki = pageInfo.getVirtualWikiName();
            MigrationUtil.exportToFile(file, virtualWiki, topicNameList, excludeHistory);
            this.renderXml(response, file, download);
            success = true;
            file.delete();
        } catch (IOException e) {
            logger.error("Failure while exporting to file", e);
            pageInfo.addError(new WikiMessage("export.error.migration", e.getMessage()));
        } catch (MigrationException e) {
            logger.error("Failure while exporting from file", e);
            pageInfo.addError(new WikiMessage("export.error.migration", e.getMessage()));
        } catch (WikiException e) {
            pageInfo.addError(e.getWikiMessage());
        }
        if (!success) {
            next.addObject("topicNames", topicNames);
            next.addObject("download", download);
            next.addObject("excludeHistory", excludeHistory);
        }
        return success;
    }

    /**
     *
     */
    private void renderXml(HttpServletResponse response, File file, boolean download) throws IOException {
        response.setContentType("application/xml");
        response.setCharacterEncoding("UTF-8");
        if (download) {
            // download instead of displaying in a browser window
            response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
        }
        PrintWriter out = response.getWriter();
        FileReader fileReader = null;
        BufferedReader bufferedReader = null;
        try {
            fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String s;
            while ((s = bufferedReader.readLine()) != null) {
                out.println(s);
            }
        } finally {
            IOUtils.closeQuietly(bufferedReader);
            IOUtils.closeQuietly(fileReader);
        }
        out.close();
    }

    /**
     *
     */
    private void view(HttpServletRequest request, ModelAndView next, WikiPageInfo pageInfo) {
        if (StringUtils.isBlank(request.getParameter("export"))) {
            // by default export without history
            next.addObject("excludeHistory", true);
        }
        pageInfo.setContentJsp(JSP_EXPORT);
        pageInfo.setPageTitle(new WikiMessage("export.title"));
        pageInfo.setSpecial(true);
    }
}