Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
strategy:
matrix:
distribution: [ 'temurin' ]
java: [ '17', '21' ]
java: [ '17', '21', '25']
steps:
- uses: actions/checkout@v3
- name: Setup java
Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<junit.version>6.0.0</junit.version>
<batik.version>1.16</batik.version>
<pdfbox.version>3.0.5</pdfbox.version>
Expand Down
41 changes: 33 additions & 8 deletions src/main/java/de/pdv/apex/PdfServlet.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.pdv.apex;

import jakarta.servlet.ServletException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
Expand Down Expand Up @@ -27,14 +28,19 @@
@WebServlet(name = "pdf", urlPatterns = {"/pdf"})
public class PdfServlet extends HttpServlet {
private static final Logger logger = Logger.getLogger(PdfServlet.class.getName());

private static FopFactory fopFactory;
private static final TransformerFactory tFactory = TransformerFactory.newInstance();

/**
* Init the servlet and setup TransformerFactory
*/
@Override
public void init() {
public void init() throws ServletException {
// Java 25 may need old parser
System.setProperty("javax.xml.parsers.SAXParserFactory",
"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
System.setProperty("org.xml.sax.driver",
"com.sun.org.apache.xerces.internal.parsers.SAXParser");
try {
tFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
tFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
Expand All @@ -43,6 +49,26 @@ public void init() {
} catch (TransformerConfigurationException e) {
logger.warning(String.format("TransformerConfigurationException while setup TransformerFactory - possible security issue: %s", e.getMessage()));
}
try {
synchronized (PdfServlet.class) {
if (fopFactory == null) {
fopFactory = FopFactory.newInstance(new File(".").toURI());
fopPreload();
}
}
} catch (Exception e) {
throw new ServletException("FOP init failed", e);
}
}

// 🔑 Preload event-model.xml: Dummy Fop anlegen
private static void fopPreload() {
try (java.io.ByteArrayOutputStream dummyOut = new java.io.ByteArrayOutputStream()) {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
fopFactory.newFop(MIME_PDF, foUserAgent, dummyOut);
} catch (Exception e) {
logger.warning("FOP preload failed (can be ignored if once-only): " + e.getMessage());
}
}

/**
Expand All @@ -60,7 +86,6 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
logger.log(Level.INFO,"doGet");
try {
response.setContentType("application/pdf");
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
Fop fop = fopFactory.newFop(MIME_PDF, response.getOutputStream());
Transformer transformer = tFactory.newTransformer();
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("samples/helloWorld.fo");
Expand All @@ -69,7 +94,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
transformer.transform(src, res);
logger.log(Level.INFO,"Process complete");
} catch (Exception ex) {
logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex.getMessage()));
logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex));
}
}

Expand Down Expand Up @@ -108,8 +133,6 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "attachment; filename=" + pdfFileName);

FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());

FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MIME_PDF, foUserAgent, response.getOutputStream());
Expand All @@ -128,8 +151,10 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
logger.log(Level.INFO,"Process complete");

} catch (Exception ex) {
context.log(ex.getMessage(), ex);
logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex.getMessage()));
if (context != null) {
context.log(ex.getMessage(), ex);
}
logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex));
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/test/java/de/pdv/apex/PdfServletTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.pdv.apex;

import jakarta.servlet.ServletException;
import org.apache.commons.io.IOUtils;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -41,6 +42,7 @@ void doGet() throws Exception {
when(servlet.getServletConfig()).thenReturn(servletConfig);
when(response.getOutputStream()).thenReturn(outputStream);
when(response.getWriter()).thenReturn(new PrintWriter(new StringWriter()));
servlet.init();
servlet.doGet(request, response);
System.out.println("Check for header %PDF-1.4%...");
byte[] b = {0x25,0x50,0x44,0x46,0x2D,0x31,0x2E,0x34,0x0A}; //
Expand All @@ -62,6 +64,7 @@ void doPost() throws Exception {
when(request.getParameter("template")).thenReturn(xsltFileContent);
when(request.getParameter("xml")).thenReturn(xmlFileContent);
when(response.getWriter()).thenReturn(new PrintWriter(new StringWriter()));
servlet.init();
servlet.doPost(request, response);
System.out.println("Check for header %PDF-1.4%...");
byte[] b = {0x25,0x50,0x44,0x46,0x2D,0x31,0x2E,0x34,0x0A}; //
Expand All @@ -70,7 +73,7 @@ void doPost() throws Exception {
}

@Test
void init() {
void init() throws ServletException {
when(servlet.getServletConfig()).thenReturn(servletConfig);
assertNotNull(servlet);
servlet.init();
Expand Down