ixes for sonarcube ce scan results and new unit test

This commit is contained in:
Oliver Warz 2022-09-02 16:27:12 +02:00
parent 410a4d5bc8
commit 1d2de80027
7 changed files with 146 additions and 83 deletions

View File

@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.10.1] - 2022-09-02
### Changed
- fixes for sonarcube ce scan results
- add units tests for servlet with mokito
## [0.9.9] - 2022-06-18
### Changed
- automated github release build

67
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>de.pdv.apex</groupId>
<artifactId>fop4apex</artifactId>
<version>0.9.10-SNAPSHOT</version>
<version>0.10.1-SNAPSHOT</version>
<name>fop4apex</name>
<packaging>war</packaging>
<url>https://www.pdv.de</url>
@ -25,6 +25,12 @@
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
@ -44,6 +50,14 @@
<version>2.0.26</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.7.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop-core -->
<dependency>
@ -104,22 +118,6 @@
<version>3.3.2</version>
</plugin>
<!-- https://mvnrepository.com/artifact/org.owasp/dependency-check-maven -->
<!--
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>7.1.1</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
-->
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-surefire-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@ -157,24 +155,23 @@
</plugin>
<!-- https://mvnrepository.com/artifact/com.google.cloud.tools/jib-maven-plugin -->
<!--
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<from>
<image>compile.pdv.lan:8001/product/base/vis-tomcat:9.0</image>
</from>
<to>
<image>fop4apex</image>
</to>
<container>
<appRoot>/opt/pdv/webapps/fop4apex</appRoot>
</container>
</configuration>
</plugin>
-->
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<from>
<image>compile.pdv.lan:8001/product/base/vis-tomcat:9.0</image>
</from>
<to>
<image>fop4apex</image>
</to>
<container>
<appRoot>/opt/pdv/webapps/fop4apex</appRoot>
</container>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>

View File

@ -3,10 +3,9 @@ package de.pdv.apex;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import static org.apache.xmlgraphics.util.MimeConstants.MIME_PDF;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@ -17,7 +16,9 @@ import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -31,9 +32,6 @@ public class PdfServlet extends HttpServlet {
private final TransformerFactory tFactory = TransformerFactory.newInstance();
public void init() {
}
// <editor-fold default state="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
@ -43,8 +41,7 @@ public class PdfServlet extends HttpServlet {
* @param response servlet response
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
logger.log(Level.FINEST,"Finest output");
logger.log(Level.FINER,"Finer output");
logger.log(Level.FINE,"Fine output");
@ -52,9 +49,8 @@ public class PdfServlet extends HttpServlet {
logger.log(Level.INFO,"doGet");
try {
response.setContentType("application/pdf");
// response.setDateHeader("Expires", System.currentTimeMillis() + cacheExpiringDuration * 1000);
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, response.getOutputStream());
Fop fop = fopFactory.newFop(MIME_PDF, response.getOutputStream());
Transformer transformer = tFactory.newTransformer();
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("samples/helloWorld.fo");
Source src = new StreamSource(inputStream);
@ -62,21 +58,18 @@ public class PdfServlet extends HttpServlet {
transformer.transform(src, res);
logger.log(Level.INFO,"Process complete");
} catch (Exception ex) {
throw new ServletException(ex);
logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex.getMessage()));
}
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
ServletContext context = getServletContext();
logger.log(Level.FINEST,"Finest output");
logger.log(Level.FINER,"Finer output");
@ -87,29 +80,30 @@ public class PdfServlet extends HttpServlet {
String contentType = request.getContentType();
String templateFile = "template.fo";
String templateData = "xml data";
// String pdfFileName = "";
if (request.getParameter("template") != null)
templateFile = request.getParameter("template");
if (request.getParameter("xml") != null)
templateData = request.getParameter("xml");
logger.log(Level.FINEST,"Working directory: " + (new File("dummy1.txt")).getAbsolutePath());
logger.log(Level.FINEST,"Template file: " + templateFile);
logger.log(Level.FINEST,"Template data: " + templateData);
logger.log(Level.FINEST,"Content type: " + contentType);
if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, String.format("Working directory: %s", new File("dummy1.txt").getAbsolutePath()));
logger.log(Level.FINEST, String.format("Template file: %s", templateFile));
logger.log(Level.FINEST, String.format("Template data: %s", templateData));
logger.log(Level.FINEST, String.format("Content type: %s", contentType));
}
String pdfFileName = "Kostenblatt.pdf";
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "attachment; filename=" + pdfFileName);
// response.setDateHeader("Expires", System.currentTimeMillis() + cacheExpiringDuration * 1000);
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, response.getOutputStream());
Fop fop = fopFactory.newFop(MIME_PDF, foUserAgent, response.getOutputStream());
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer( new StreamSource(new StringReader(templateFile)));
Transformer transformer = tFactory.newTransformer( new StreamSource(new StringReader(templateFile)));
// Set the value of a <param> in the stylesheet
transformer.setParameter("versionParam", "2.0");
@ -123,11 +117,10 @@ public class PdfServlet extends HttpServlet {
transformer.transform(src, res);
logger.log(Level.INFO,"Process complete");
} catch (Exception e) {
context.log(e.getMessage(), e);
throw new ServletException(e.getMessage());
} catch (Exception ex) {
context.log(ex.getMessage(), ex);
logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex.getMessage()));
}
// processRequest(request, response);
}
/**
@ -140,8 +133,4 @@ public class PdfServlet extends HttpServlet {
return "APEX FOP Server";
}// </editor-fold>
@Override
public void destroy() {
}
}

View File

@ -9,23 +9,19 @@
</head>
<body>
<main class="container">
<hgroup>
<header>
<h1>Apache FOP integration for Oracle APEX</h1>
<h2>FOP = Formatting Objects Processor</h2>
</hgroup>
<p>FOP = Formatting Objects Processor</p>
</header>
<ul>
<li>Demo: <a href="pdf" data-tooltip="Run pdf servlet with demo data">pdf servlet / fo2pdf</a></li>
<li>Monitoring: <a href="monitoring" data-tooltip="Go to JavaMelody Monitoring page">JavaMelody</a></li>
</ul>
<!-- <a href="pdf">pdf Servlet / Hello World / fo2pdf</a><br/> -->
<%--suppress HtmlUnknownTarget --%>
<!-- <a href="monitoring">JavaMelody Monitoring</a> -->
<hgroup>
<header>
<h2>Sample APEX Settings</h2>
<h3>Internal Workspace / Instance Settings / Report Printing</h3>
</hgroup>
</header>
<table role="grid">
<caption>Internal Workspace / Instance Settings / Report Printing</caption>
<thead>
<tr>
<th scope="col">Parameter</th>
@ -58,10 +54,10 @@
</tr>
</table>
<hgroup>
<header>
<h2>Debugging</h2>
<h3>Add to tomcat conf/logging.properties</h3>
</hgroup>
<p>Add to tomcat conf/logging.properties</p>
</header>
<pre>org.apache.tomcat.util.http.Parameters.level = ALL
de.pdv.apex.level = ALL</pre>

View File

@ -4,8 +4,10 @@ import org.apache.fop.apps.*;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import javax.xml.XMLConstants;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
@ -46,6 +48,7 @@ class ExampleFO2PDFTest {
// Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Transformer transformer = factory.newTransformer(); // identity transformer
// Setup input stream
@ -106,17 +109,18 @@ class ExampleFO2PDFTest {
throw new Exception("result file missing");
try (PDDocument document = PDDocument.load(pdfFile)) {
document.getClass();
//document.getClass();
if (!document.isEncrypted()) {
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
PDFTextStripper tStripper = new PDFTextStripper();
String pdfFileInText = tStripper.getText(document);
String lines[] = pdfFileInText.split("\\r?\\n");
String[] lines = pdfFileInText.split("\\r?\\n");
for (String line : lines) {
System.out.println(line);
}
System.out.println("Pages: " + document.getNumberOfPages());
Assertions.assertEquals(Integer.valueOf(1).intValue(), document.getNumberOfPages());
}
}
System.out.println("Filesize (Bytes): " + Files.size(pdfFile.toPath()));

View File

@ -5,6 +5,7 @@ import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import javax.xml.transform.Result;
@ -82,6 +83,7 @@ class ExampleXML2PDFTest {
PDDocument document = PDDocument.load(pdfFile);
System.out.println("Pages: " + document.getNumberOfPages());
System.out.println("Filesize (Bytes): " + Files.size(pdfFile.toPath()));
Assertions.assertEquals(Integer.valueOf(1).intValue(), document.getNumberOfPages());
System.out.println("Success!");
}
}

View File

@ -0,0 +1,70 @@
package de.pdv.apex;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import javax.servlet.ServletConfig;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
public class PdfServletTest extends Mockito {
@Spy private PdfServlet servlet;
@Mock private ServletConfig servletConfig;
@Mock private HttpServletRequest request;
@Mock private HttpServletResponse response;
@Mock private ServletOutputStream outputStream;
@Before
public void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
public void assertThatNoMethodHasBeenCalled() {
when(servlet.getServletConfig()).thenReturn(servletConfig);
Mockito.verifyNoInteractions(servlet);
}
@Test
public void testServletGet() throws Exception {
when(servlet.getServletConfig()).thenReturn(servletConfig);
when(response.getOutputStream()).thenReturn(outputStream);
when(response.getWriter()).thenReturn(new PrintWriter(new StringWriter()));
servlet.doGet(request, response);
System.out.println("Check for header %PDF-1.4%...");
byte[] b = {0x25,0x50,0x44,0x46,0x2D,0x31,0x2E,0x34,0x0A}; //
verify(outputStream, atLeastOnce()).write(b);
System.out.println("Success!");
}
@Test
public void testServletPost() throws Exception {
PdfServletTest app = new PdfServletTest();
InputStream xsltFile = app.getClass().getClassLoader().getResourceAsStream("samples/kostenblatt_2014.xsl");
assert xsltFile != null;
String xsltFileContent = IOUtils.toString(xsltFile, StandardCharsets.UTF_8.name());
InputStream xmlFile = app.getClass().getClassLoader().getResourceAsStream("samples/kostenblatt_2014.xml");
assert xmlFile != null;
String xmlFileContent = IOUtils.toString(xmlFile, StandardCharsets.UTF_8.name());
when(servlet.getServletConfig()).thenReturn(servletConfig);
when(response.getOutputStream()).thenReturn(outputStream);
when(request.getParameter("template")).thenReturn(xsltFileContent);
when(request.getParameter("xml")).thenReturn(xmlFileContent);
when(response.getWriter()).thenReturn(new PrintWriter(new StringWriter()));
servlet.doPost(request, response);
System.out.println("Check for header %PDF-1.4%...");
byte[] b = {0x25,0x50,0x44,0x46,0x2D,0x31,0x2E,0x34,0x0A}; //
verify(outputStream, atLeastOnce()).write(b);
System.out.println("Success!");
}
}