import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
import java.net.URI;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
+import java.util.Objects;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
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.acr.xml.XmlNormalizer;
import org.argeo.cms.auth.RemoteAuthUtils;
import org.argeo.cms.servlet.ServletHttpRequest;
-import org.argeo.util.LangUtils;
+import org.argeo.cms.util.LangUtils;
+import org.geotools.data.collection.ListFeatureCollection;
+import org.geotools.data.simple.SimpleFeatureCollection;
+import org.opengis.feature.simple.SimpleFeature;
/**
* A servlet transforming an XML view of the data to either FOP or PDF.
public class FopServlet extends HttpServlet {
private static final long serialVersionUID = 6906020513498289335L;
+ private final static String PROP_ARGEO_FO_XSL = "argeo.fo.xsl";
+
private ContentRepository contentRepository;
private DocumentBuilderFactory documentBuilderFactory;
private TransformerFactory transformerFactory;
private Templates foTemplates;
- private String xslUrl;
+ private URL xslUrl;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
boolean pdf = ".pdf".equals(ext);
ContentSession session = RemoteAuthUtils.doAs(() -> contentRepository.get(), new ServletHttpRequest(req));
Content content = session.get(path);
- Source xmlInput = content.adapt(Source.class);
- xmlInput.setSystemId(req.getRequestURI());
// dev only
- try (InputStream in = new URL(xslUrl).openStream()) {
- Source xslSource = new StreamSource(in);
- foTemplates = transformerFactory.newTemplates(xslSource);
- if (foTemplates == null)
- throw new IllegalStateException("Could not instantiate XSL " + xslUrl);
- } catch (TransformerConfigurationException | IOException e) {
- throw new IllegalStateException("Cannot instantiate XSL " + xslUrl, e);
+ final boolean DEV = false;
+ if (DEV) {
+ try (InputStream in = xslUrl.openStream()) {
+ Source xslSource = new StreamSource(in);
+ foTemplates = transformerFactory.newTemplates(xslSource);
+ if (foTemplates == null)
+ throw new IllegalStateException("Could not instantiate XSL " + xslUrl);
+ } catch (TransformerConfigurationException | IOException e) {
+ throw new IllegalStateException("Cannot instantiate XSL " + xslUrl, e);
+ }
+
+ Source xmlInput = content.adapt(Source.class);
+ XmlNormalizer.print(xmlInput,0);
}
+ Source xmlInput = content.adapt(Source.class);
+ String systemId = req.getRequestURL().toString();
+ xmlInput.setSystemId(systemId);
+
URIResolver uriResolver = (href, base) -> {
try {
- URL url = new URL(href);
- if (url.getProtocol().equals("file")) {
- InputStream in = Files.newInputStream(Paths.get(URI.create(url.toString())));
- return new StreamSource(in);
+ URI url = URI.create(href);
+ if (url.getScheme() != null) {
+ if (url.getScheme().equals("file")) {
+ InputStream in = Files.newInputStream(Paths.get(URI.create(url.toString())));
+ return new StreamSource(in);
+ }
+ if (url.getScheme().equals("geo2svg")) {
+ String includePath = path + url.getPath();
+ String geoExt = includePath.substring(includePath.lastIndexOf('.'));
+ Content geoContent = session.get(includePath);
+ if (".gpx".equals(geoExt)) {
+ try (InputStream in = geoContent.open(InputStream.class)) {
+ SimpleFeature field = GpxUtils.parseGpxToPolygon(in);
+ SimpleFeatureCollection features = new ListFeatureCollection(field.getType(), field);
+ try (StringWriter writer = new StringWriter()) {
+ GeoUtils.exportToSvg(features, writer, 100, 100);
+ StreamSource res = new StreamSource(new StringReader(writer.toString()));
+ return res;
+ }
+ }
+ } else {
+ throw new UnsupportedOperationException(geoExt + " is not supported");
+ }
+ }
}
} catch (IOException e) {
- // silent
+ throw new RuntimeException("Cannot process " + href);
}
- Content subContent = session.get(href);
+
+ String p = href.startsWith("/") ? href : path + '/' + href;
+ Content subContent = session.get(p);
return subContent.adapt(Source.class);
};
}
+ @Override
+ public void init() throws ServletException {
+// for (Enumeration<String> it = getServletConfig().getInitParameterNames(); it.hasMoreElements();)
+// System.out.println(it.nextElement());
+// for (String str : getServletContext().getResourcePaths("/"))
+// System.out.println(str);
+ }
+
public void start(Map<String, Object> properties) {
documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setXIncludeAware(true);
// with DocBook stylesheets
transformerFactory = new TransformerFactoryImpl();
// transformerFactory = TransformerFactory.newDefaultInstance();
+ try {
+ String xslStr = LangUtils.get(properties, PROP_ARGEO_FO_XSL);
+ Objects.requireNonNull(xslStr);
+ xslUrl = new URL(xslStr);
+ try (InputStream in = xslUrl.openStream()) {
+ Source xslSource = new StreamSource(in);
+ foTemplates = transformerFactory.newTemplates(xslSource);
+ if (foTemplates == null)
+ throw new IllegalStateException("Could not instantiate XSL " + xslUrl);
+ }
- xslUrl = LangUtils.get(properties, "argeo.fo.xsl");
- try (InputStream in = new URL(xslUrl).openStream()) {
- Source xslSource = new StreamSource(in);
- foTemplates = transformerFactory.newTemplates(xslSource);
- if (foTemplates == null)
- throw new IllegalStateException("Could not instantiate XSL " + xslUrl);
} catch (TransformerConfigurationException | IOException e) {
throw new IllegalStateException("Cannot instantiate XSL " + xslUrl, e);
}