sascha@2502: package de.intevation.flys.client.server; sascha@2502: sascha@2502: import java.io.File; sascha@2502: import java.io.IOException; sascha@2502: import java.io.InputStream; sascha@2502: import java.io.FileOutputStream; sascha@2502: import java.io.FileInputStream; sascha@2502: import java.io.BufferedInputStream; sascha@2502: import java.io.BufferedOutputStream; sascha@2502: import java.io.OutputStream; sascha@2502: sascha@2504: import java.util.List; sascha@2504: import java.util.Map; sascha@2504: import java.util.ArrayList; sascha@2504: import java.util.LinkedHashMap; sascha@2504: sascha@2502: import javax.servlet.ServletException; sascha@2502: sascha@2502: import javax.servlet.http.HttpServlet; sascha@2502: import javax.servlet.http.HttpServletRequest; sascha@2502: import javax.servlet.http.HttpServletResponse; sascha@2502: sascha@2504: import de.intevation.artifacts.common.ArtifactNamespaceContext; sascha@2504: sascha@2504: import de.intevation.artifacts.common.utils.ClientProtocolUtils; sascha@2504: import de.intevation.artifacts.common.utils.JSON; sascha@2504: import de.intevation.artifacts.common.utils.StringUtils; sascha@2504: import de.intevation.artifacts.common.utils.XMLUtils; sascha@2504: sascha@2504: import de.intevation.artifacts.httpclient.exceptions.ConnectionException; sascha@2504: sascha@2504: import de.intevation.artifacts.httpclient.http.HttpClient; sascha@2504: import de.intevation.artifacts.httpclient.http.HttpClientImpl; sascha@2504: sascha@2504: import de.intevation.flys.client.shared.model.MapConfig; sascha@2504: sascha@2502: import org.apache.log4j.Logger; sascha@2502: sascha@2502: import org.mapfish.print.MapPrinter; sascha@2502: sascha@2502: import org.mapfish.print.output.OutputFactory; sascha@2502: import org.mapfish.print.output.OutputFormat; sascha@2502: sascha@2502: import org.mapfish.print.utils.PJsonObject; sascha@2502: sascha@2503: import org.w3c.dom.Document; sascha@2504: import org.w3c.dom.Element; sascha@2504: import org.w3c.dom.NodeList; sascha@2503: sascha@2502: public class MapPrintServiceImpl sascha@2502: extends HttpServlet sascha@2502: { sascha@2502: private static final Logger log = sascha@2502: Logger.getLogger(MapPrintServiceImpl.class); sascha@2502: sascha@2504: protected static String generateSpec( sascha@2504: Document document, sascha@2504: double minX, double minY, sascha@2504: double maxX, double maxY sascha@2504: ) { sascha@2504: System.err.println(XMLUtils.toString(document)); sascha@2504: MapConfig mapConfig = MapHelper.parseConfig(document); sascha@2504: sascha@2504: Map spec = new LinkedHashMap(); sascha@2504: spec.put("layout", "A4 portrait"); sascha@2504: spec.put("title", "FLYS Druck"); sascha@2504: spec.put("srs", "EPSG:" + mapConfig.getSrid()); sascha@2504: spec.put("dpi", Integer.valueOf(254)); sascha@2504: spec.put("units", "degrees"); sascha@2504: spec.put("outputFormat", "pdf"); sascha@2504: sascha@2504: List layers = new ArrayList(); sascha@2504: sascha@2504: String ns = ArtifactNamespaceContext.NAMESPACE_URI; sascha@2504: sascha@2504: NodeList facets = document.getElementsByTagNameNS(ns, "facet"); sascha@2504: sascha@2504: for (int i = 0, N = facets.getLength(); i < N; ++i) { sascha@2504: Element element = (Element)facets.item(i); sascha@2504: if (!element.getParentNode().getLocalName().equals("layers")) { sascha@2504: continue; sascha@2504: } sascha@2504: Map layer = new LinkedHashMap(); sascha@2504: sascha@2504: layer.put("type", "WMS"); sascha@2504: List subLayers = new ArrayList(1); sascha@2504: subLayers.add(element.getAttributeNS(ns, "layers")); sascha@2504: layer.put("layers", subLayers); sascha@2504: layer.put("baseURL", element.getAttributeNS(ns, "url")); sascha@2504: layer.put("format", "image/png"); sascha@2504: sascha@2504: layers.add(layer); sascha@2504: } sascha@2504: sascha@2504: spec.put("layers", layers); sascha@2504: spec.put("name", "Name"); sascha@2504: sascha@2504: List pages = new ArrayList(1); sascha@2504: sascha@2504: spec.put("pages", pages); sascha@2504: sascha@2504: Map page = new LinkedHashMap(); sascha@2504: sascha@2504: List bounds = new ArrayList(4); sascha@2504: bounds.add(Double.valueOf(minX)); sascha@2504: bounds.add(Double.valueOf(minY)); sascha@2504: bounds.add(Double.valueOf(maxX)); sascha@2504: bounds.add(Double.valueOf(maxY)); sascha@2504: sascha@2504: page.put("bbox", bounds); sascha@2504: sascha@2504: page.put("mapTitle", "FLYS Karte"); sascha@2504: page.put("comment", "Eine mit FLYS gedruckte Karte."); sascha@2504: page.put("rotation", Integer.valueOf(0)); sascha@2504: sascha@2504: pages.add(page); sascha@2504: sascha@2504: return JSON.toJSONString(spec); sascha@2504: } sascha@2502: sascha@2502: sascha@2503: @Override sascha@2503: public void doGet(HttpServletRequest req, HttpServletResponse resp) sascha@2503: throws ServletException, IOException sascha@2503: { sascha@2503: log.info("MapPrintServiceImpl.doGet"); sascha@2503: sascha@2503: String uuid = req.getParameter("uuid"); sascha@2503: sascha@2503: if (uuid == null || !StringUtils.checkUUID(uuid)) { sascha@2503: throw new ServletException("Missing or misspelled UUID"); sascha@2503: } sascha@2503: sascha@2503: String minXS = req.getParameter("minx"); sascha@2503: String maxXS = req.getParameter("maxx"); sascha@2503: String minYS = req.getParameter("miny"); sascha@2503: String maxYS = req.getParameter("maxy"); sascha@2503: sascha@2503: if (minXS == null || maxXS == null sascha@2503: || minYS == null || maxYS == null) { sascha@2503: throw new ServletException("Missing minX, minY, maxX or maxY"); sascha@2503: } sascha@2503: sascha@2503: double minX, maxX, minY, maxY; sascha@2503: sascha@2503: try { sascha@2503: minX = Double.parseDouble(minXS); sascha@2503: minY = Double.parseDouble(minYS); sascha@2503: maxX = Double.parseDouble(maxXS); sascha@2503: maxY = Double.parseDouble(maxYS); sascha@2503: } sascha@2503: catch (NumberFormatException nfe) { sascha@2503: throw new ServletException("Misspelled minX, minY, maxX or maxY"); sascha@2503: } sascha@2503: sascha@2503: String mapType = req.getParameter("maptype"); sascha@2503: sascha@2503: if (mapType == null || !mapType.equals("map")) { sascha@2503: mapType = "floodmap"; sascha@2503: } sascha@2503: sascha@2503: String url = getURL(); sascha@2503: sascha@2503: Document request = ClientProtocolUtils.newOutCollectionDocument( sascha@2503: uuid, mapType, mapType); sascha@2503: sascha@2503: Document result; sascha@2503: try { sascha@2503: HttpClient client = new HttpClientImpl(url); sascha@2503: InputStream is = client.collectionOut(request, uuid, mapType); sascha@2503: try { sascha@2503: result = XMLUtils.parseDocument(is); sascha@2503: } sascha@2503: finally { sascha@2503: is.close(); sascha@2503: } sascha@2503: } sascha@2503: catch (ConnectionException ce) { sascha@2503: log.error(ce); sascha@2503: throw new ServletException(ce); sascha@2503: } sascha@2503: sascha@2504: String spec = generateSpec( sascha@2504: result, sascha@2504: minX, minY, sascha@2504: maxX, maxY); sascha@2503: sascha@2504: if (log.isDebugEnabled()) { sascha@2504: log.debug(spec); sascha@2504: //System.err.println(spec); sascha@2504: } sascha@2503: sascha@2504: producePDF(spec, resp); sascha@2503: } sascha@2503: sascha@2503: protected String getURL() throws ServletException { sascha@2503: String url = getServletContext().getInitParameter("server-url"); sascha@2503: if (url == null) { sascha@2503: throw new ServletException("Missing server-url"); sascha@2503: } sascha@2503: return url; sascha@2503: } sascha@2503: sascha@2503: protected MapPrinter getMapPrinter() throws ServletException, IOException { sascha@2502: String configPath = getInitParameter("config"); sascha@2502: if (configPath == null) { sascha@2502: throw new ServletException("Missing configuration in web.xml"); sascha@2502: } sascha@2502: sascha@2502: File configFile = new File(configPath); sascha@2502: if (!configFile.isAbsolute()) { sascha@2502: configFile = new File(getServletContext().getRealPath(configPath)); sascha@2502: } sascha@2502: sascha@2502: if (!configFile.isFile() || !configFile.canRead()) { sascha@2502: throw new ServletException("Cannot read '" + configFile + "'"); sascha@2502: } sascha@2502: sascha@2502: return new MapPrinter(configFile); sascha@2502: } sascha@2502: sascha@2503: sascha@2503: protected void producePDF(String json, HttpServletResponse resp) sascha@2503: throws ServletException, IOException sascha@2502: { sascha@2504: PJsonObject jsonSpec = MapPrinter.parseSpec(json); sascha@2502: sascha@2502: MapPrinter printer = getMapPrinter(); sascha@2502: sascha@2502: OutputFormat outputFormat = OutputFactory.create( sascha@2502: printer.getConfig(), jsonSpec); sascha@2502: sascha@2502: resp.setHeader("Content-Disposition", "attachment;filename=print.pdf"); sascha@2502: resp.setHeader("Content-Type", "application/pdf"); sascha@2502: sascha@2502: // XXX: Streaming the generated PDF directly sascha@2502: // to the request out does not work. :-/ sascha@2502: File tmpFile = File.createTempFile("map-printing", null); sascha@2502: sascha@2502: try { sascha@2502: OutputStream out = sascha@2502: new BufferedOutputStream( sascha@2502: new FileOutputStream(tmpFile)); sascha@2502: try { sascha@2502: outputFormat.print(printer, jsonSpec, out, ""); sascha@2502: out.flush(); sascha@2502: } sascha@2502: catch (Exception e) { sascha@2502: log.error(e); sascha@2502: throw new ServletException(e); sascha@2502: } sascha@2502: finally { sascha@2502: printer.stop(); sascha@2502: out.close(); sascha@2502: } sascha@2502: InputStream in = sascha@2502: new BufferedInputStream( sascha@2502: new FileInputStream(tmpFile)); sascha@2502: out = resp.getOutputStream(); sascha@2502: try { sascha@2502: byte [] buf = new byte[4096]; sascha@2502: int r; sascha@2502: while ((r = in.read(buf)) >= 0) { sascha@2502: out.write(buf, 0, r); sascha@2502: } sascha@2502: out.flush(); sascha@2502: } sascha@2502: finally { sascha@2502: in.close(); sascha@2502: out.close(); sascha@2502: } sascha@2502: } sascha@2502: finally { sascha@2502: if (tmpFile.exists()) { sascha@2502: tmpFile.delete(); sascha@2502: } sascha@2502: } sascha@2502: } sascha@2502: } sascha@2502: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :