ingo@1022: /*
ingo@1022: * Copyright (c) 2010 by Intevation GmbH
ingo@1022: *
ingo@1022: * This program is free software under the LGPL (>=v2.1)
ingo@1022: * Read the file LGPL.txt coming with the software for details
ingo@1022: * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@1022: */
ingo@1022:
tim@29: package de.intevation.gnv.action;
tim@29:
ingo@573: import de.intevation.gnv.action.sessionmodel.SessionModel;
ingo@573: import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
ingo@573:
ingo@573: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
ingo@573: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
ingo@573:
ingo@573: import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter;
ingo@573: import de.intevation.gnv.artifactdatabase.objects.ExportMode;
ingo@573: import de.intevation.gnv.artifactdatabase.objects.InputParameter;
ingo@573: import de.intevation.gnv.artifactdatabase.objects.OutputMode;
ingo@573: import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
ingo@573:
ingo@573: import java.io.OutputStream;
ingo@573:
ingo@573: import java.util.ArrayList;
ingo@573: import java.util.Collection;
ingo@573: import java.util.Iterator;
ingo@573:
ingo@573: import javax.servlet.http.HttpServletRequest;
ingo@573: import javax.servlet.http.HttpServletResponse;
ingo@573:
ingo@573: import org.apache.log4j.Logger;
ingo@573:
ingo@573: import org.apache.struts.action.ActionForm;
ingo@573: import org.apache.struts.action.ActionForward;
ingo@573: import org.apache.struts.action.ActionMapping;
ingo@573:
tim@29: /**
ingo@690: * This controller is called to trigger an export (e.g. pdf, svg, image). A
ingo@690: * 'save-file' dialog is opened to save the export.
sascha@699: *
sascha@684: * @author Tim Englich
tim@29: */
ingo@573: public class DoExportAction extends ArtifactDatabaseActionBase {
tim@29:
tim@29: /**
tim@29: * the logger, used to log exceptions and additonaly information
tim@29: */
tim@29: private static Logger log = Logger.getLogger(DoExportAction.class);
tim@36:
tim@29: /**
tim@29: * Constructor
tim@29: */
tim@29: public DoExportAction() {
tim@29: super();
tim@29: }
tim@29:
ingo@690:
tim@29: @Override
ingo@573: public ActionForward execute(
ingo@573: ActionMapping mapping,
ingo@573: ActionForm form,
ingo@573: HttpServletRequest request,
ingo@573: HttpServletResponse response)
ingo@573: throws Exception
ingo@573: {
ingo@991: if (isSessionExhausted(request)) {
ingo@991: return sessionExhaustedForward(mapping, form, request, response);
ingo@991: }
ingo@991:
ingo@573: try {
ingo@573: String target = request.getParameter("target");
ingo@573: String mimeType = request.getParameter("mimetype");
ingo@573: String mode = request.getParameter("mode");
ingo@573:
ingo@573: log.debug("Target: " + target);
ingo@573: log.debug("MimeType: " + mimeType);
ingo@573: log.debug("ExportMode: " + mode);
ingo@573:
ingo@573: SessionModel sm = SessionModelFactory.getInstance()
ingo@573: .getSessionModel(request);
ingo@573: OutputMode outputMode = sm.getOutputMode(target);
ingo@573: if (outputMode != null) {
ingo@573: ExportMode exportMode = outputMode.getExportMode(mode);
ingo@573:
ingo@573: if (target.equals(mode) || (exportMode != null
ingo@573: && exportMode.getMimeType().equals(mimeType)))
ingo@573: {
ingo@573: Collection inputParameter = outputMode
ingo@573: .getOutputParameters();
ingo@573: Collection ips = null;
ingo@573: if (inputParameter != null) {
ingo@573: ips = new ArrayList(inputParameter.size());
ingo@573: Iterator it = inputParameter.iterator();
ingo@573: while (it.hasNext()) {
ingo@573: String name = it.next().getName();
ingo@573: String[] values = request.getParameterValues(name);
ingo@573: InputParameter ip = new DefaultInputParameter(name,
ingo@573: values);
ingo@573: ips.add(ip);
ingo@573: }
ingo@573: }
ingo@573:
ingo@573: ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
ingo@573: .getInstance()
ingo@573: .getArtifactDatabaseClient(getLocale(request));
ingo@573:
ingo@573: this.setHeaders(mode, mimeType, response, request);
ingo@573:
ingo@573: OutputStream outputStream = response.getOutputStream();
ingo@583: adc.doOutput(
ingo@583: sm.getSelectedArtifactFactory(),
ingo@583: sm.getCurrentArtifact(),
ingo@583: outputStream,
ingo@583: target,
ingo@583: mode,
ingo@583: mimeType,
ingo@583: ips);
ingo@573:
ingo@573: outputStream.flush();
ingo@573: outputStream.close();
ingo@573: }
ingo@576: else if (exportMode == null) {
ingo@576: Collection inputParameter = outputMode
ingo@576: .getOutputParameters();
ingo@576: Collection ips = null;
ingo@576: if (inputParameter != null) {
ingo@576: ips = new ArrayList(inputParameter.size());
ingo@576: Iterator it = inputParameter.iterator();
ingo@576: while (it.hasNext()) {
ingo@576: String name = it.next().getName();
ingo@576: String[] values = request.getParameterValues(name);
ingo@576: InputParameter ip = new DefaultInputParameter(name,
ingo@576: values);
ingo@576: ips.add(ip);
ingo@576: }
ingo@576: }
ingo@576:
ingo@576: ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
ingo@576: .getInstance()
ingo@576: .getArtifactDatabaseClient(getLocale(request));
ingo@576:
ingo@576: this.setHeaders(target, mimeType, response, request);
ingo@576:
ingo@576: OutputStream outputStream = response.getOutputStream();
ingo@583: adc.doOutput(
ingo@583: sm.getSelectedArtifactFactory(),
ingo@583: sm.getCurrentArtifact(),
ingo@583: outputStream,
ingo@583: target,
ingo@583: mode,
ingo@583: mimeType,
ingo@583: ips);
ingo@576:
ingo@576: outputStream.flush();
ingo@576: outputStream.close();
ingo@576: }
ingo@573: else {
ingo@573: if (outputMode == null) {
ingo@573: log.error("Outputmode is not supported.");
ingo@573: }
ingo@573: else if (!exportMode.getMimeType().equals(mimeType)) {
ingo@573: log.error("MimeType "+mimeType+" wis not supported.");
ingo@573: }
ingo@573: // TODO FIXME: Fehlerbehandlung
ingo@573: }
ingo@573: }
ingo@573: return super.execute(mapping, form, request, response);
ingo@573: } catch (Exception e) {
ingo@573: log.error(e, e);
ingo@573: request.setAttribute(
ingo@573: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
ingo@573: .getMessage());
ingo@573: return super.getExceptionForward(mapping);
ingo@573: }
ingo@573: }
ingo@573:
tim@29: protected void setHeaders(String target, String mimeType,
tim@38: HttpServletResponse response,
tim@38: HttpServletRequest request) {
tim@29: log.debug("DoExportAction.setHeaders");
tim@34: try {
ingo@573: response.setHeader("Content-Type", mimeType);
tim@36: String fileName = "GNVEXPORT_" + System.currentTimeMillis() + ".";
tim@36:
sascha@398: target = target.toLowerCase();
ingo@589: log.debug("******************************************************");
ingo@589: log.debug("TARGET: " + target);
ingo@589: log.debug("MIMETYPE: " + mimeType);
sascha@398:
sascha@398: if (target.equals("chart")) {
tim@36: fileName = fileName
tim@38: + mimeType.substring(mimeType.indexOf("/") + 1);
sascha@681: }
ingo@579: else if (target.equals("histogram")) {
ingo@578: fileName = fileName
ingo@578: + mimeType.substring(mimeType.indexOf("/") + 1);
ingo@578: }
ingo@589: else if (target.equals("img")) {
ingo@589: fileName = fileName
ingo@589: + mimeType.substring(mimeType.indexOf("/") + 1);
ingo@589: }
sascha@398: else if (target.equals("pdf")) {
ingo@283: fileName = fileName + "pdf";
sascha@398: } else if (target.equals("svg")) {
ingo@284: fileName = fileName + "svg";
sascha@398: } else if (target.equals("csv")) {
tim@36: fileName = fileName + "csv";
sascha@398: } else if (target.equals("zip")) {
sascha@398: fileName = fileName + "zip";
sascha@398: } else if (target.equals("wms")) {
sascha@398: fileName = fileName + "xml";
tim@36: } else {
tim@36: fileName = fileName + "txt";
tim@34: }
tim@36: log.debug("FileName for Export: " + fileName);
tim@36: response.setHeader("Content-Disposition", "attachment;filename="
tim@38: + fileName);
tim@34: } catch (Exception e) {
tim@36: log.error(e, e);
tim@29: }
tim@29: }
tim@29: }
sascha@700: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :