package org.argeo.app.servlet.publish; import java.io.IOException; import java.io.InputStream; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.argeo.api.acr.Content; import org.argeo.api.acr.ContentRepository; import org.argeo.api.acr.ContentSession; import org.argeo.app.geo.GeoUtils; import org.argeo.app.geo.GpxUtils; import org.argeo.cms.auth.RemoteAuthUtils; import org.argeo.cms.servlet.ServletHttpRequest; import org.geotools.data.collection.ListFeatureCollection; import org.geotools.data.simple.SimpleFeatureCollection; import org.opengis.feature.simple.SimpleFeature; /** * A servlet transforming an geographical data to SVG. */ public class GeoToSvgServlet extends HttpServlet { private static final long serialVersionUID = -6346379324580671894L; private ContentRepository contentRepository; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String servletPath = req.getServletPath(); servletPath = servletPath.substring(1, servletPath.lastIndexOf('.')); servletPath = servletPath.substring(servletPath.indexOf('/'), servletPath.length()); String path = URLDecoder.decode(servletPath, StandardCharsets.UTF_8); String ext = servletPath.substring(path.lastIndexOf('.')); resp.setContentType("image/svg+xml"); ContentSession session = RemoteAuthUtils.doAs(() -> contentRepository.get(), new ServletHttpRequest(req)); Content content = session.get(path); if (".gpx".equals(ext)) { try (InputStream in = content.open(InputStream.class)) { SimpleFeature field = GpxUtils.parseGpxToPolygon(in); SimpleFeatureCollection features = new ListFeatureCollection(field.getType(), field); GeoUtils.exportToSvg(features, resp.getWriter(), 100, 100); // log.debug("SVG:\n" + writer.toString() + "\n"); } } } public void start(Map properties) { } public void stop(Map properties) { } public void setContentRepository(ContentRepository contentRepository) { this.contentRepository = contentRepository; } }