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@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 :