view gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java @ 1022:28a0628b11b0

Added license file and license header. gnv/trunk@1258 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 02 Nov 2010 17:15:08 +0000
parents 33198e55371c
children
line wrap: on
line source
/*
 * Copyright (c) 2010 by Intevation GmbH
 *
 * This program is free software under the LGPL (>=v2.1)
 * Read the file LGPL.txt coming with the software for details
 * or visit http://www.gnu.org/licenses/ if it does not exist.
 */

package de.intevation.gnv.action;

import de.intevation.gnv.action.sessionmodel.SessionModel;
import de.intevation.gnv.action.sessionmodel.SessionModelFactory;

import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;

import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter;
import de.intevation.gnv.artifactdatabase.objects.ExportMode;
import de.intevation.gnv.artifactdatabase.objects.InputParameter;
import de.intevation.gnv.artifactdatabase.objects.OutputMode;
import de.intevation.gnv.artifactdatabase.objects.OutputParameter;

import java.io.OutputStream;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

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

import org.apache.log4j.Logger;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * This controller is called to trigger an export (e.g. pdf, svg, image). A
 * 'save-file' dialog is opened to save the export.
 *
 * @author <a href="mailto:tim.englich@intevation.de">Tim Englich</a>
 */
public class DoExportAction extends ArtifactDatabaseActionBase {

    /**
     * the logger, used to log exceptions and additonaly information
     */
    private static Logger log = Logger.getLogger(DoExportAction.class);

    /**
     * Constructor
     */
    public DoExportAction() {
        super();
    }


    @Override
    public ActionForward execute(
        ActionMapping       mapping,
        ActionForm          form,
        HttpServletRequest  request,
        HttpServletResponse response)
    throws Exception
    {
        if (isSessionExhausted(request)) {
            return sessionExhaustedForward(mapping, form, request, response);
        }

        try {
            String target   = request.getParameter("target");
            String mimeType = request.getParameter("mimetype");
            String mode     = request.getParameter("mode");

            log.debug("Target: " + target);
            log.debug("MimeType: " + mimeType);
            log.debug("ExportMode: " + mode);

            SessionModel sm = SessionModelFactory.getInstance()
                    .getSessionModel(request);
            OutputMode outputMode = sm.getOutputMode(target);
            if (outputMode != null) {
                ExportMode exportMode = outputMode.getExportMode(mode);

                if (target.equals(mode) || (exportMode != null
                &&  exportMode.getMimeType().equals(mimeType)))
                {
                    Collection<OutputParameter> inputParameter = outputMode
                            .getOutputParameters();
                    Collection<InputParameter> ips = null;
                    if (inputParameter != null) {
                        ips = new ArrayList<InputParameter>(inputParameter.size());
                        Iterator<OutputParameter> it = inputParameter.iterator();
                        while (it.hasNext()) {
                            String name = it.next().getName();
                            String[] values = request.getParameterValues(name);
                            InputParameter ip = new DefaultInputParameter(name,
                                    values);
                            ips.add(ip);
                        }
                    }

                    ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
                            .getInstance()
                            .getArtifactDatabaseClient(getLocale(request));

                    this.setHeaders(mode, mimeType, response, request);

                    OutputStream outputStream = response.getOutputStream();
                    adc.doOutput(
                        sm.getSelectedArtifactFactory(),
                        sm.getCurrentArtifact(),
                        outputStream,
                        target,
                        mode,
                        mimeType,
                        ips);

                    outputStream.flush();
                    outputStream.close();
                }
                else if (exportMode == null) {
                    Collection<OutputParameter> inputParameter = outputMode
                            .getOutputParameters();
                    Collection<InputParameter> ips = null;
                    if (inputParameter != null) {
                        ips = new ArrayList<InputParameter>(inputParameter.size());
                        Iterator<OutputParameter> it = inputParameter.iterator();
                        while (it.hasNext()) {
                            String name = it.next().getName();
                            String[] values = request.getParameterValues(name);
                            InputParameter ip = new DefaultInputParameter(name,
                                    values);
                            ips.add(ip);
                        }
                    }

                    ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
                            .getInstance()
                            .getArtifactDatabaseClient(getLocale(request));

                    this.setHeaders(target, mimeType, response, request);

                    OutputStream outputStream = response.getOutputStream();
                    adc.doOutput(
                        sm.getSelectedArtifactFactory(),
                        sm.getCurrentArtifact(),
                        outputStream,
                        target,
                        mode,
                        mimeType,
                        ips);

                    outputStream.flush();
                    outputStream.close();
                }
                else {
                    if (outputMode == null) {
                        log.error("Outputmode is not supported.");
                    }
                    else if (!exportMode.getMimeType().equals(mimeType)) {
                        log.error("MimeType "+mimeType+" wis not supported.");
                    }
                    // TODO FIXME: Fehlerbehandlung
                }
            }
            return super.execute(mapping, form, request, response);
        } catch (Exception e) {
            log.error(e, e);
            request.setAttribute(
                    CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
                            .getMessage());
            return super.getExceptionForward(mapping);
        }
    }

    protected void setHeaders(String target, String mimeType,
                              HttpServletResponse response,
                              HttpServletRequest request) {
        log.debug("DoExportAction.setHeaders");
        try {
            response.setHeader("Content-Type", mimeType);
            String fileName = "GNVEXPORT_" + System.currentTimeMillis() + ".";

            target = target.toLowerCase();
            log.debug("******************************************************");
            log.debug("TARGET: " + target);
            log.debug("MIMETYPE: " + mimeType);

            if (target.equals("chart")) {
                fileName = fileName
                           + mimeType.substring(mimeType.indexOf("/") + 1);
            }
            else if (target.equals("histogram")) {
                fileName = fileName
                           + mimeType.substring(mimeType.indexOf("/") + 1);
            }
            else if (target.equals("img")) {
                fileName = fileName
                           + mimeType.substring(mimeType.indexOf("/") + 1);
            }
            else if (target.equals("pdf")) {
                fileName = fileName + "pdf";
            } else if (target.equals("svg")) {
                fileName = fileName + "svg";
            } else if (target.equals("csv")) {
                fileName = fileName + "csv";
            } else if (target.equals("zip")) {
                fileName = fileName + "zip";
            } else if (target.equals("wms")) {
                fileName = fileName + "xml";
            } else {
                fileName = fileName + "txt";
            }
            log.debug("FileName for Export: " + fileName);
            response.setHeader("Content-Disposition", "attachment;filename="
                                                      + fileName);
        } catch (Exception e) {
            log.error(e, e);
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org