gradle draft

This commit is contained in:
Andrei Isvoran 2024-02-06 16:03:03 +02:00
parent 3bbd13daca
commit 46c9bed663
17 changed files with 454 additions and 190 deletions

8
.gitignore vendored
View File

@ -27,3 +27,11 @@
**/classpath-data.json
**/dependencies-and-licenses-overview.txt
git.tag
gradle.properties
gradlew
gradlew.bat
gradle/
**/.gradle
**/build

View File

@ -1,4 +1,21 @@
include:
- project: 'gitlab/gitlab'
ref: 'main'
file: 'ci-templates/maven_deps.yml'
file: 'ci-templates/gradle_java.yml'
deploy:
stage: deploy
tags:
- dind
script:
- echo "Building with gradle version ${BUILDVERSION}"
- gradle -Pversion=${BUILDVERSION} publish
- gradle bootBuildImage --cleanCache --publishImage -PbuildbootDockerHostNetwork=true -Pversion=${BUILDVERSION}
- echo "BUILDVERSION=$BUILDVERSION" >> version.env
artifacts:
reports:
dotenv: version.env
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_BRANCH =~ /^release/
- if: $CI_COMMIT_TAG

136
build.gradle.kts Normal file
View File

@ -0,0 +1,136 @@
plugins {
`java-library`
`maven-publish`
`kotlin-dsl`
pmd
checkstyle
jacoco
id("io.freefair.lombok") version "8.4"
}
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
repositories {
mavenLocal()
maven {
url = uri("https://nexus.knecon.com/repository/gindev/")
}
maven {
url = uri("https://pdftron.com/maven/release")
}
maven {
url = uri("https://repo.spring.io/milestone")
}
maven {
url = uri("http://dist.wso2.org/maven2/")
isAllowInsecureProtocol = true
}
maven {
url = uri("https://projectlombok.org/edge-releases")
}
maven {
url = uri("https://repo.maven.apache.org/maven2/")
}
maven {
url = uri("https://pdftron.com/maven/release")
}
maven {
url = uri("https://nexus.knecon.com/repository/red-platform-releases/")
credentials {
username = providers.gradleProperty("mavenUser").getOrNull();
password = providers.gradleProperty("mavenPassword").getOrNull();
}
}
}
dependencies {
api(libs.org.projectlombok.lombok)
api(libs.org.springframework.boot.spring.boot.configuration.processor)
api(libs.com.google.guava.guava)
api(libs.org.projectlombok.lombok)
api(libs.org.springframework.boot.spring.boot.configuration.processor)
implementation("com.pdftron:PDFNet:10.5.0")
testImplementation(libs.org.junit.jupiter.junit.jupiter)
testImplementation(libs.org.assertj.assertj.core)
testImplementation(libs.org.mockito.mockito.core)
testImplementation(libs.org.apache.logging.log4j.log4j.slf4j2.impl)
testImplementation(libs.org.junit.jupiter.junit.jupiter)
testImplementation(libs.org.assertj.assertj.core)
testImplementation(libs.org.mockito.mockito.core)
compileOnly(libs.org.slf4j.slf4j.api)
compileOnly(libs.com.pdftron.pdfnet)
}
group = "com.iqser.red.commons"
version = "2.0-SNAPSHOT"
description = "pdftron-logic-commons"
java.sourceCompatibility = JavaVersion.VERSION_17
val testsJar by tasks.registering(Jar::class) {
archiveClassifier.set("tests")
from(sourceSets["test"].output)
}
java {
withSourcesJar()
withJavadocJar()
}
publishing {
publications.create<MavenPublication>("maven") {
from(components["java"])
artifact(testsJar)
}
}
tasks.withType<JavaCompile>() {
options.encoding = "UTF-8"
}
tasks.withType<Javadoc>() {
options.encoding = "UTF-8"
}
pmd {
isConsoleOutput = true
}
tasks.pmdMain {
pmd.ruleSetFiles = files("${rootDir}/config/pmd/pmd.xml")
}
tasks.pmdTest {
pmd.ruleSetFiles = files("${rootDir}/config/pmd/test_pmd.xml")
}
tasks.named<Test>("test") {
useJUnitPlatform()
reports {
junitXml.outputLocation.set(layout.buildDirectory.dir("reports/junit"))
}
}
tasks.test {
finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run
}
tasks.jacocoTestReport {
dependsOn(tasks.test) // tests are required to run before generating the report
reports {
xml.required.set(true)
csv.required.set(false)
html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml"))
}
}
java {
withJavadocJar()
}

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
<property
name="severity"
value="error"/>
<module name="TreeWalker">
<module name="SuppressWarningsHolder"/>
<module name="MissingDeprecated"/>
<module name="MissingOverride"/>
<module name="AnnotationLocation"/>
<module name="JavadocStyle"/>
<module name="NonEmptyAtclauseDescription"/>
<module name="IllegalImport"/>
<module name="RedundantImport"/>
<module name="RedundantModifier"/>
<module name="EmptyBlock"/>
<module name="DefaultComesLast"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="ExplicitInitialization"/>
<module name="IllegalInstantiation"/>
<module name="ModifiedControlVariable"/>
<module name="MultipleVariableDeclarations"/>
<module name="PackageDeclaration"/>
<module name="ParameterAssignment"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="StringLiteralEquality"/>
<module name="OneStatementPerLine"/>
<module name="FinalClass"/>
<module name="ArrayTypeStyle"/>
<module name="UpperEll"/>
<module name="OuterTypeFilename"/>
</module>
<module name="FileTabCharacter"/>
<module name="SuppressWarningsFilter"/>
</module>

20
config/pmd/pmd.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0"?>
<ruleset name="Custom ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>
Knecon ruleset checks the code for bad stuff
</description>
<rule ref="category/java/errorprone.xml">
<exclude name="MissingSerialVersionUID"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="NullAssignment"/>
<exclude name="AssignmentInOperand"/>
<exclude name="BeanMembersShouldSerialize"/>
</rule>
</ruleset>

22
config/pmd/test_pmd.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<ruleset name="Custom ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>
Knecon test ruleset checks the code for bad stuff
</description>
<rule ref="category/java/errorprone.xml">
<exclude name="MissingSerialVersionUID"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="NullAssignment"/>
<exclude name="AssignmentInOperand"/>
<exclude name="TestClassWithoutTestCases"/>
<exclude name="BeanMembersShouldSerialize"/>
</rule>
</ruleset>

1
settings.gradle.kts Normal file
View File

@ -0,0 +1 @@
rootProject.name = "pdftron-logic-commons"

View File

@ -62,11 +62,12 @@ public class Converter {
@SneakyThrows
public static Color convertColor(ColorSpace colorSpace, ColorPt colorPt) {
ColorPt rgbColor = colorSpace.convert2RGB(colorPt);
try (ColorPt rgbColor = colorSpace.convert2RGB(colorPt)) {
Color color = new Color((float) rgbColor.get(0), (float) rgbColor.get(1), (float) rgbColor.get(2));
rgbColor.destroy();
return color;
}
}
@SneakyThrows

View File

@ -103,6 +103,7 @@ public class ElementFeatures {
@Getter
@SuperBuilder
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
@SuppressWarnings("PMD")
public static class Text extends ElementFeatures {
String text;

View File

@ -35,8 +35,8 @@ public class ImageHashFactory {
@SneakyThrows
private byte[] getBytesOfImage(com.pdftron.pdf.Image inputImage) {
// 0 because the memory filter determines the size
var memFilter = new MemoryFilter(0, false);
var filterWriter = new FilterWriter(memFilter);
try(var memFilter = new MemoryFilter(0, false)) {
try(var filterWriter = new FilterWriter(memFilter)) {
inputImage.export(filterWriter);
filterWriter.flushAll();
@ -47,6 +47,8 @@ public class ImageHashFactory {
filterWriter.destroy();
return res;
}
}
}
public String getSimplePHash(BufferedImage image) {

View File

@ -151,8 +151,8 @@ public class InvisibleElementRemovalService {
private void execute(PDFDoc pdfDoc, boolean delta, boolean removePaths, Set<String> markedContentToIgnore) {
log.info("Start removing invisible Elements");
ElementWriter writer = new ElementWriter();
ElementReader reader = new ElementReader();
try(ElementWriter writer = new ElementWriter()) {
try(ElementReader reader = new ElementReader()) {
Set<Long> visitedXObjIds = new TreeSet<>();
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -183,7 +183,8 @@ public class InvisibleElementRemovalService {
}
writer.destroy();
reader.destroy();
}
}
log.info("Finished removing invisible Elements");
}
@ -239,7 +240,7 @@ public class InvisibleElementRemovalService {
private void processImages(Element imageElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
Rect rect = imageElement.getBBox();
try(Rect rect = imageElement.getBBox()) {
if (rect == null) {
return;
@ -255,11 +256,12 @@ public class InvisibleElementRemovalService {
writer.writeElement(imageElement);
}
}
}
private void processText(Element textElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
Rect textBBox = textElement.getBBox();
try(Rect textBBox = textElement.getBBox()) {
if (textBBox == null) {
writer.writeElement(textElement);
@ -304,6 +306,7 @@ public class InvisibleElementRemovalService {
}
}
}
}
private void processForm(Element formElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
@ -315,7 +318,7 @@ public class InvisibleElementRemovalService {
context.visitedXObjIds().add(formObj.getObjNum());
// writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter();
try(ElementWriter formWriter = new ElementWriter()) {
context.clippingPathStack().enterNewGState();
context.clippingPathStack().intersectClippingPath(new GeneralPath(Converter.toRectangle2D(formElement.getBBox())));
context.reader().formBegin();
@ -331,6 +334,7 @@ public class InvisibleElementRemovalService {
context.clippingPathStack().leaveGState();
}
}
}
private void processPath(Element pathElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
@ -481,7 +485,7 @@ public class InvisibleElementRemovalService {
context.visitedXObjIds().add(formObj.getObjNum());
// writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter();
try(ElementWriter formWriter = new ElementWriter()) {
context.reader().formBegin();
formWriter.begin(formObj);
@ -494,6 +498,7 @@ public class InvisibleElementRemovalService {
context.reader().end();
}
}
}
private boolean isTextRenderedVisibly(GState gState, Rect textBBox, InvisibleElementRemovalContext context) throws PDFNetException {
@ -582,10 +587,10 @@ public class InvisibleElementRemovalService {
@SneakyThrows
private void drawBBox(ElementWriter writer, Rectangle2D r, String hexcolor) {
ColorPt colorPt = new ColorPt(Integer.valueOf(hexcolor.substring(1, 3), 16) / 255d,
try(ColorPt colorPt = new ColorPt(Integer.valueOf(hexcolor.substring(1, 3), 16) / 255d,
Integer.valueOf(hexcolor.substring(3, 5), 16) / 255d,
Integer.valueOf(hexcolor.substring(5, 7), 16) / 255d);
ElementBuilder eb = new ElementBuilder();
Integer.valueOf(hexcolor.substring(5, 7), 16) / 255d)) {
try(ElementBuilder eb = new ElementBuilder()) {
Element rect = eb.createRect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
rect.setPathStroke(true);
rect.getGState().setStrokeColorSpace(ColorSpace.createDeviceRGB());
@ -595,6 +600,8 @@ public class InvisibleElementRemovalService {
colorPt.destroy();
eb.destroy();
}
}
}
@Builder

View File

@ -7,33 +7,33 @@ import java.util.Set;
public class MarkedContentStack {
Deque<MarkedContent> markedContentStack = new LinkedList<>();
Deque<MarkedContent> markedContentQueue = new LinkedList<>();
public void enterMarkedContent(String name) {
markedContentStack.push(new MarkedContent(name));
markedContentQueue.push(new MarkedContent(name));
}
public void leaveMarkedContent() {
markedContentStack.pop();
markedContentQueue.pop();
}
public String currentMarkedContent() {
if (markedContentStack.isEmpty()) {
if (markedContentQueue.isEmpty()) {
return "";
}
return markedContentStack.peek().name();
return markedContentQueue.peek().name();
}
public boolean currentMarkedContentContains(String name) {
Iterator<MarkedContent> markedContentIterator = markedContentStack.descendingIterator();
Iterator<MarkedContent> markedContentIterator = markedContentQueue.descendingIterator();
while (markedContentIterator.hasNext()) {
var markedContent = markedContentIterator.next();
if (markedContent.name().equals(name)) {
@ -46,10 +46,10 @@ public class MarkedContentStack {
public boolean currentMarkedContentContainsAny(Set<String> names) {
if (markedContentStack.isEmpty()) {
if (markedContentQueue.isEmpty()) {
return false;
}
Iterator<MarkedContent> markedContentIterator = markedContentStack.descendingIterator();
Iterator<MarkedContent> markedContentIterator = markedContentQueue.descendingIterator();
while (markedContentIterator.hasNext()) {
var markedContent = markedContentIterator.next();
if (names.contains(markedContent.name())) {
@ -62,7 +62,7 @@ public class MarkedContentStack {
public void clear() {
markedContentStack.clear();
markedContentQueue.clear();
}

View File

@ -43,8 +43,8 @@ public class OCGWatermarkRemovalService {
@SneakyThrows
private void removeOCGWatermarks(PDFDoc pdfDoc) {
ElementReader reader = new ElementReader();
ElementWriter writer = new ElementWriter();
try(ElementReader reader = new ElementReader()) {
try(ElementWriter writer = new ElementWriter()) {
Set<Long> visitedXObjIds = new TreeSet<>();
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -56,6 +56,8 @@ public class OCGWatermarkRemovalService {
reader.destroy();
writer.destroy();
}
}
}
@SneakyThrows
@ -124,7 +126,7 @@ public class OCGWatermarkRemovalService {
visitedXObjIds.add(element.getXObject().getObjNum());
// writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter();
try(ElementWriter formWriter = new ElementWriter()) {
reader.formBegin();
formWriter.begin(element.getXObject());
@ -136,6 +138,7 @@ public class OCGWatermarkRemovalService {
formWriter.destroy();
reader.end();
}
}
}

View File

@ -16,8 +16,8 @@ import lombok.experimental.UtilityClass;
@UtilityClass
public class PdfTextExtraction {
private static String execute(PDFDoc pdfDoc) throws IOException, PDFNetException{
TextExtractor extractor = new TextExtractor();
private static String execute(PDFDoc pdfDoc) throws PDFNetException{
try(TextExtractor extractor = new TextExtractor()) {
List<String> texts = new ArrayList<>();
PageIterator iterator = pdfDoc.getPageIterator();
@ -31,6 +31,7 @@ public class PdfTextExtraction {
pdfDoc.close();
return String.join("\n", texts);
}
}
public static String extractAllTextFromDocument(InputStream fileStream) throws IOException, PDFNetException {
PDFDoc pdfDoc = new PDFDoc(fileStream);

View File

@ -93,7 +93,7 @@ public class WatermarkRemovalService {
Map<Long, List<ElementFeatures>> formObjectsAndImagesForPages = new HashMap<>();
Set<Long> visitedXObjIds = new TreeSet<>();
ElementReader reader = new ElementReader();
try(ElementReader reader = new ElementReader()) {
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -115,6 +115,7 @@ public class WatermarkRemovalService {
return formObjectsAndImagesForPages;
}
}
private void processElement(Element element,
@ -220,13 +221,14 @@ public class WatermarkRemovalService {
}
if (visitedXObjIds.add(element.getXObject().getObjNum())) {
ElementReader xObjectReader = new ElementReader();
try(ElementReader xObjectReader = new ElementReader()) {
xObjectReader.begin(element.getXObject());
for (Element element1 = xObjectReader.next(); element1 != null; element1 = xObjectReader.next()) {
processElement(element1, visitedXObjIds, elementFeaturesLinkedList, formObjectsOccuringMoreThanOnceOnAPage, minAreaCoveringPage, page);
}
elementFeaturesLinkedList.add(ElementFeatureFactory.extractFeatures(element));
xObjectReader.destroy();
}
} else {
elementFeaturesLinkedList.add(ElementFeatureFactory.extractFeatures(element));
}
@ -256,8 +258,8 @@ public class WatermarkRemovalService {
@SneakyThrows
private void removeAllWatermarks(PDFDoc pdfDoc, List<ElementFeatures> watermarksElementFeaturesList) {
ElementReader reader = new ElementReader();
ElementWriter writer = new ElementWriter();
try(ElementReader reader = new ElementReader()) {
try (ElementWriter writer = new ElementWriter()) {
Set<Long> visitedXObjIds = new TreeSet<>();
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -270,7 +272,8 @@ public class WatermarkRemovalService {
reader.destroy();
writer.destroy();
}
}
}
@ -390,7 +393,7 @@ public class WatermarkRemovalService {
visitedXObjIds.add(element.getXObject().getObjNum());
// writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter();
try(ElementWriter formWriter = new ElementWriter()) {
reader.formBegin();
formWriter.begin(element.getXObject());
@ -402,6 +405,7 @@ public class WatermarkRemovalService {
formWriter.destroy();
reader.end();
}
}
}

View File

@ -13,6 +13,7 @@ import com.pdftron.pdf.PDFNet;
import lombok.SneakyThrows;
@SuppressWarnings("PMD")
class InvisibleElementRemovalServiceTest {
InvisibleElementRemovalService invisibleElementRemovalService;

View File

@ -13,6 +13,7 @@ import com.pdftron.pdf.PDFNet;
import lombok.SneakyThrows;
@Disabled
@SuppressWarnings("PMD")
class WatermarkRemovalServiceTest {
@SneakyThrows