From 12820fe9f75a63599524bbff5b6ab8a042ac2711 Mon Sep 17 00:00:00 2001
From: Lyn Elisa Goltz <goltz@lat-lon.de>
Date: Tue, 23 Apr 2024 07:39:32 +0200
Subject: [PATCH] XPLANBOX-2613 - fixed/suppressed security warnings

---
 pom.xml                                       |  8 +++-
 xplan-cli/xplan-cli-core/pom.xml              |  4 ++
 .../commons/cli/SynchronizeAllExecutor.java   |  2 +
 .../commons/cli/SynchronizeExecutor.java      |  4 ++
 xplan-cli/xplan-cli-tools/pom.xml             |  4 ++
 .../cli/admin/config/CommonContext.java       |  2 +
 .../cli/admin/db/SortPropertyDbUpdater.java   |  3 ++
 .../EvaluationSchemaSynchronizer.java         |  6 +++
 .../xplanbox/cli/manage/ExportSubcommand.java |  3 +-
 .../cli/manage/config/ManageContext.java      |  2 +
 .../validate/config/ValidateFileContext.java  |  3 ++
 .../config/ValidateFromDatabaseContext.java   |  2 +
 .../db/domain/XPlanWithFeatureCollection.java |  5 +-
 .../transform/cli/TransformAllExecutor.java   | 22 ++++-----
 .../cli/TransformApplicationRunner.java       |  2 +-
 .../server/service/ReportController.java      | 18 +++----
 xplan-core/xplan-core-job/pom.xml             |  7 ++-
 .../job/validator/memory/GmlImportJob.java    |  8 +++-
 xplan-core/xplan-core-manager/pom.xml         |  4 ++
 .../de/latlon/xplan/manager/XPlanManager.java |  6 ++-
 .../CoupledResourceConfiguration.java         |  2 +
 .../internalid/InternalIdRetriever.java       | 10 +++-
 .../latlon/xplan/manager/log/SystemLog.java   | 48 ++++++++++---------
 .../ServiceMetadataDocumentWriter.java        |  5 +-
 .../filesystem/DeegreeRasterCacheCleaner.java |  2 +
 .../manager/transaction/XPlanEditManager.java |  5 +-
 .../transaction/service/XPlanEditService.java |  2 +
 .../wmsconfig/WmsWorkspaceWrapper.java        |  5 +-
 .../raster/access/GdalRasterAdapter.java      |  5 +-
 xplan-core/xplan-core-security/pom.xml        |  7 ++-
 .../PropertiesFileUserDetailsManager.java     |  2 +
 xplan-core/xplan-core-validator/pom.xml       |  4 ++
 .../ValidatorConfigurationParser.java         |  3 ++
 .../report/html/HtmlReportGenerator.java      |  9 +++-
 .../dokumente/handler/DocumentHandler.java    |  7 ++-
 .../api/manager/handler/EditHandler.java      |  3 +-
 .../api/manager/handler/PlanHandler.java      | 16 ++++---
 .../xplan-services-wms/pom.xml                |  4 ++
 .../visibility/ValidityPeriodInspector.java   |  2 +
 39 files changed, 184 insertions(+), 72 deletions(-)

diff --git a/pom.xml b/pom.xml
index 436ac489fe..f82b91beab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -608,7 +608,7 @@
         <plugin>
           <groupId>com.github.spotbugs</groupId>
           <artifactId>spotbugs-maven-plugin</artifactId>
-          <version>4.8.3.1</version>
+          <version>4.8.4.0</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
@@ -1649,6 +1649,12 @@
         <type>pom</type>
         <scope>import</scope>
       </dependency>
+      <dependency>
+        <groupId>com.github.spotbugs</groupId>
+        <artifactId>spotbugs-annotations</artifactId>
+        <version>4.8.4</version>
+        <scope>provided</scope>
+      </dependency>
       <!-- Profiles -->
       <dependency>
         <groupId>de.xleitstelle.xplanung</groupId>
diff --git a/xplan-cli/xplan-cli-core/pom.xml b/xplan-cli/xplan-cli-core/pom.xml
index fa5b044966..68d2154a84 100644
--- a/xplan-cli/xplan-cli-core/pom.xml
+++ b/xplan-cli/xplan-cli-core/pom.xml
@@ -16,6 +16,10 @@
       <artifactId>slf4j-api</artifactId>
       <version>${slf4j.version}</version>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeAllExecutor.java b/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeAllExecutor.java
index 8916166505..259967dd9e 100644
--- a/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeAllExecutor.java
+++ b/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeAllExecutor.java
@@ -20,6 +20,7 @@
  */
 package de.latlon.xplan.commons.cli;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,6 +60,7 @@ public class SynchronizeAllExecutor {
 		executor.synchronize(conn);
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "logTableName is a fix value")
 	private void insertInLogTable(Connection conn) {
 		LOG.info("Copy required metadata into {}", logTableName);
 		PreparedStatement ps = null;
diff --git a/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeExecutor.java b/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeExecutor.java
index f44d67c1b7..a19386df5f 100644
--- a/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeExecutor.java
+++ b/xplan-cli/xplan-cli-core/src/main/java/de/latlon/xplan/commons/cli/SynchronizeExecutor.java
@@ -20,6 +20,7 @@
  */
 package de.latlon.xplan.commons.cli;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,6 +55,8 @@ public class SynchronizeExecutor {
 	 * Starts the synchronization.
 	 * @param conn to the dataase with th log table, never <code>null</code>
 	 */
+	@SuppressFBWarnings(value = { "SQL_INJECTION_JDBC", "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" },
+			justification = "logTableName is a fix value")
 	public void synchronize(Connection conn) {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
@@ -156,6 +159,7 @@ public class SynchronizeExecutor {
 		return null;
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "logTableName is a fix value")
 	private void removePlanFromLog(Connection conn, int xplanmgrid) {
 		PreparedStatement ps = null;
 		try {
diff --git a/xplan-cli/xplan-cli-tools/pom.xml b/xplan-cli/xplan-cli-tools/pom.xml
index b1f0f58764..b02e01c505 100644
--- a/xplan-cli/xplan-cli-tools/pom.xml
+++ b/xplan-cli/xplan-cli-tools/pom.xml
@@ -272,6 +272,10 @@
       <groupId>org.yaml</groupId>
       <artifactId>snakeyaml</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
     <!-- Test -->
     <dependency>
       <groupId>org.junit.jupiter</groupId>
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java
index a332238496..28344a9e4f 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java
@@ -34,6 +34,7 @@ import de.latlon.xplan.manager.database.XPlanDbAdapter;
 import de.latlon.xplan.manager.web.shared.ConfigurationException;
 import de.latlon.xplan.manager.workspace.WorkspaceException;
 import org.deegree.commons.config.DeegreeWorkspace;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -108,6 +109,7 @@ public class CommonContext {
 		return new ManagerWorkspaceWrapper(managerWorkspace);
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private Path etcDirectory() {
 		String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
 		File jarLocation = new File(path);
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/db/SortPropertyDbUpdater.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/db/SortPropertyDbUpdater.java
index 88885a46b5..5226e2d37a 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/db/SortPropertyDbUpdater.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/db/SortPropertyDbUpdater.java
@@ -21,6 +21,7 @@
 package de.latlon.xplanbox.cli.admin.db;
 
 import de.latlon.xplan.manager.web.shared.XPlan;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,6 +60,8 @@ public class SortPropertyDbUpdater {
 		updateSortPropertyInMgrSchema(sortDate, plan);
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_SPRING_JDBC",
+			justification = "schemaname and tablename are selected from database")
 	private void updateSortPropertyInSynSchema(Date sortDate, XPlan plan) throws Exception {
 		String selectSchemaAndColumnsToModify = "SELECT table_name, table_schema "
 				+ "FROM information_schema.columns WHERE table_schema like 'xplansyn%' "
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/evaluation/EvaluationSchemaSynchronizer.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/evaluation/EvaluationSchemaSynchronizer.java
index 88687867b9..28bf18739e 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/evaluation/EvaluationSchemaSynchronizer.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/evaluation/EvaluationSchemaSynchronizer.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.Logger;
 import org.gdal.gdal.gdal;
 import org.gdal.ogr.Geometry;
 import org.gdal.ogr.ogr;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -134,6 +135,8 @@ public class EvaluationSchemaSynchronizer implements Synchronizer {
 		}
 	}
 
+	@SuppressFBWarnings(value = { "SQL_INJECTION_JDBC", "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" },
+			justification = "xPath, blobSchema and synTableWithSchema are fix values")
 	private void updateGeomColumn(int xPlanManagerId, Connection conn, String synSchema, String blobSchema,
 			String synTableName, String geomColumn) throws SQLException {
 		PreparedStatement ps = null;
@@ -178,6 +181,7 @@ public class EvaluationSchemaSynchronizer implements Synchronizer {
 		}
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "synTableWithSchema is a fix value")
 	private int update(Connection conn, String synTableWithSchema, String geomColumn, String gmlId, String gmlGeom)
 			throws SQLException {
 		PreparedStatement ps = null;
@@ -205,6 +209,7 @@ public class EvaluationSchemaSynchronizer implements Synchronizer {
 		return 0;
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "synTableWithSchema is a fix value")
 	private void insertInEvaluationTable(Connection conn, int xPlanManagerId, String synSchema, String synTableName)
 			throws SQLException {
 		String synTableWithSchema = synSchema + "." + synTableName;
@@ -225,6 +230,7 @@ public class EvaluationSchemaSynchronizer implements Synchronizer {
 		}
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "synSchema and synTableName are fix values")
 	private void deleteFromEvaluationTable(Connection conn, int xPlanManagerId, String synSchema, String synTableName)
 			throws SQLException {
 		PreparedStatement ps = null;
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ExportSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ExportSubcommand.java
index 18abfc6d67..fc552638c8 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ExportSubcommand.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ExportSubcommand.java
@@ -1,6 +1,7 @@
 package de.latlon.xplanbox.cli.manage;
 
 import de.latlon.xplan.manager.XPlanManager;
+import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -68,7 +69,7 @@ public class ExportSubcommand extends ManagerSubcommand {
 
 	private File createOutputFile(String planId) {
 		File parent = target.isPresent() ? target.get() : new File(".");
-		return new File(parent, "xplan-exported-" + planId + ".zip");
+		return new File(parent, FilenameUtils.getName("xplan-exported-" + planId + ".zip"));
 	}
 
 }
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java
index ed29193b46..197d0cf874 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java
@@ -85,6 +85,7 @@ import de.latlon.xplan.validator.syntactic.SyntacticValidatorImpl;
 import de.latlon.xplanbox.cli.XPlanCli;
 import de.latlon.xplanbox.cli.manage.ServiceMetadataRecordCreator;
 import org.deegree.commons.config.DeegreeWorkspace;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -411,6 +412,7 @@ public class ManageContext {
 		return new SortConfiguration();
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private Path etcDirectory() {
 		String path = XPlanCli.class.getProtectionDomain().getCodeSource().getLocation().getPath();
 		File jarLocation = new File(path);
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFileContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFileContext.java
index b19d94b1a3..84a1e9fcd8 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFileContext.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFileContext.java
@@ -38,6 +38,7 @@ import de.latlon.xplan.validator.semantic.profile.SemanticProfileValidator;
 import de.latlon.xplan.validator.semantic.xquery.XQuerySemanticValidator;
 import de.latlon.xplan.validator.syntactic.SyntacticValidator;
 import de.latlon.xplan.validator.syntactic.SyntacticValidatorImpl;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
@@ -100,6 +101,7 @@ public class ValidateFileContext {
 	}
 
 	@Bean
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	public Path rulesPath(ValidatorConfiguration validatorConfiguration) throws URISyntaxException {
 		Path validationRulesDirectory = validatorConfiguration.getValidationRulesDirectory();
 		if (validationRulesDirectory != null)
@@ -119,6 +121,7 @@ public class ValidateFileContext {
 		return new ConfigurationDirectoryPropertiesLoader(retrieveEtcPath(), ValidatorConfiguration.class);
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private Path retrieveEtcPath() throws URISyntaxException {
 		URL jarPath = ValidateFileContext.class.getProtectionDomain().getCodeSource().getLocation();
 		return get(jarPath.toURI()).getParent().getParent().resolve("etc");
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFromDatabaseContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFromDatabaseContext.java
index 9074a56590..84e2749221 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFromDatabaseContext.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/config/ValidateFromDatabaseContext.java
@@ -30,6 +30,7 @@ import de.latlon.xplanbox.cli.validate.db.ValidationProcessor;
 import de.latlon.xplanbox.cli.validate.db.domain.ValidationResultSummary;
 import de.latlon.xplanbox.cli.validate.db.domain.XPlanWithFeatureCollection;
 import org.apache.commons.dbcp2.BasicDataSource;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.batch.core.Job;
@@ -98,6 +99,7 @@ public class ValidateFromDatabaseContext {
 
 	@Bean
 	@StepScope
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	public SemanticValidator semanticValidator(@Value("#{jobParameters[rulesDirectory]}") String rulesDirectory)
 			throws ConfigurationException {
 		try {
diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/db/domain/XPlanWithFeatureCollection.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/db/domain/XPlanWithFeatureCollection.java
index 3b134b6bb4..ed223f5b27 100644
--- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/db/domain/XPlanWithFeatureCollection.java
+++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/validate/db/domain/XPlanWithFeatureCollection.java
@@ -130,7 +130,10 @@ public class XPlanWithFeatureCollection implements SemanticValidableXPlanArchive
 	public XMLStreamReader getMainFileXmlReader() {
 		try {
 			GZIPInputStream is = new GZIPInputStream(new ByteArrayInputStream(data));
-			XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(is);
+			XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+			xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+			xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+			XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(is);
 			return xmlStreamReader;
 		}
 		catch (XMLStreamException | IOException e) {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java
index bf1b9ed614..0b7bb76ed8 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java
@@ -30,6 +30,7 @@ import java.sql.PreparedStatement;
 import java.sql.SQLException;
 
 import static de.latlon.xplan.commons.cli.DatabaseUtils.closeQuietly;
+import static de.latlon.xplan.transform.cli.TransformApplicationRunner.LOG_TABLE_NAME;
 
 /**
  * @deprecated will be removed in a future version.
@@ -40,19 +41,14 @@ public class TransformAllExecutor {
 
 	private static final Logger LOG = LoggerFactory.getLogger(TransformAllExecutor.class);
 
-	private final String logTableName;
-
 	private final SynchronizeExecutor executor;
 
 	/**
-	 * @param logTableName the name (including the schema) of the log table, never
-	 * <code>null</code>
 	 * @param synchronizer the {@link Synchronizer} used for the synchronization, never
 	 * <code>null</code>
 	 */
-	public TransformAllExecutor(String logTableName, Synchronizer synchronizer) {
-		this.logTableName = logTableName;
-		this.executor = new SynchronizeExecutor(logTableName, synchronizer);
+	public TransformAllExecutor(Synchronizer synchronizer) {
+		this.executor = new SynchronizeExecutor(LOG_TABLE_NAME, synchronizer);
 	}
 
 	/**
@@ -64,22 +60,22 @@ public class TransformAllExecutor {
 	}
 
 	private void insertInLogTable(Connection conn) {
-		LOG.info("Copy required metadata into {}", logTableName);
+		LOG.info("Copy required metadata into {}", LOG_TABLE_NAME);
 		PreparedStatement ps = null;
 		try {
-			ps = conn.prepareStatement("DELETE FROM " + logTableName);
-			LOG.debug("Execute delete from {}: {}", logTableName, ps);
+			ps = conn.prepareStatement("DELETE FROM " + LOG_TABLE_NAME);
+			LOG.debug("Execute delete from {}: {}", LOG_TABLE_NAME, ps);
 			ps.execute();
 
-			ps = conn.prepareStatement("INSERT INTO " + logTableName
+			ps = conn.prepareStatement("INSERT INTO " + LOG_TABLE_NAME
 					+ " (xplanmgrid, xp_version, newplanstatus, oldplanstatus, operation, datum, fids)"
 					+ " SELECT id, xp_version, planstatus, planstatus, (SELECT CASE WHEN EXISTS (SELECT fid FROM xplanmgr.features WHERE plan=id AND fid LIKE '%\\_PLAN\\_%' AND NOT EXISTS(SELECT gml_id from xplan51.gml_objects WHERE fid = gml_id) AND NOT EXISTS(SELECT gml_id from xplan51pre.gml_objects WHERE fid = gml_id) AND NOT EXISTS(SELECT gml_id from xplan51archive.gml_objects WHERE fid = gml_id)) THEN 'INSERT' ELSE 'UPDATE' END), now(), (SELECT ARRAY(SELECT fid FROM xplanmgr.features WHERE plan= id)) from xplanmgr.plans");
-			LOG.debug("Execute insert in {}: {}", logTableName, ps);
+			LOG.debug("Execute insert in {}: {}", LOG_TABLE_NAME, ps);
 			ps.execute();
 			conn.commit();
 		}
 		catch (SQLException e) {
-			LOG.error("Could not update log table {}", logTableName, e);
+			LOG.error("Could not update log table {}", LOG_TABLE_NAME, e);
 			try {
 				if (conn != null) {
 					conn.rollback();
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java
index 832337a978..eab5308e35 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java
@@ -89,7 +89,7 @@ public class TransformApplicationRunner implements ApplicationRunner {
 				sync(managerWorkspaceWrapper, (conn) -> {
 					TransformationSynchronizer synchronizer = new TransformationSynchronizer(xPlanDao,
 							transformingValidator, outDirectory);
-					TransformAllExecutor allExecuter = new TransformAllExecutor(LOG_TABLE_NAME, synchronizer);
+					TransformAllExecutor allExecuter = new TransformAllExecutor(synchronizer);
 					allExecuter.transformAll(conn);
 				});
 				break;
diff --git a/xplan-core/xplan-core-gwt/src/main/java/de/latlon/xplanbox/core/gwt/commons/server/service/ReportController.java b/xplan-core/xplan-core-gwt/src/main/java/de/latlon/xplanbox/core/gwt/commons/server/service/ReportController.java
index e10ffba0e1..37fdb783e6 100644
--- a/xplan-core/xplan-core-gwt/src/main/java/de/latlon/xplanbox/core/gwt/commons/server/service/ReportController.java
+++ b/xplan-core/xplan-core-gwt/src/main/java/de/latlon/xplanbox/core/gwt/commons/server/service/ReportController.java
@@ -20,11 +20,8 @@
  */
 package de.latlon.xplanbox.core.gwt.commons.server.service;
 
-import java.io.IOException;
-import java.util.List;
-
-import javax.servlet.http.HttpServletResponse;
-
+import de.latlon.xplan.validator.web.shared.ArtifactType;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,7 +32,10 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import de.latlon.xplan.validator.web.shared.ArtifactType;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.springframework.http.MediaType.TEXT_HTML_VALUE;
 
@@ -60,7 +60,8 @@ public class ReportController {
 	public void getHtmlReport(HttpServletResponse response, @PathVariable String uuid,
 			@RequestParam(value = "validationName", required = true) String validationName) throws IOException {
 		response.addHeader("Content-Type", TEXT_HTML_VALUE);
-		LOG.debug("HTML-Report for '{}' and validationName '{}' requested.", uuid, validationName);
+		LOG.debug("HTML-Report for '{}' and validationName '{}' requested.", StringUtils.normalizeSpace(uuid),
+				StringUtils.normalizeSpace(validationName));
 		reportProvider.writeHtmlReport(response, uuid, validationName);
 		response.setContentType("text/html");
 	}
@@ -70,7 +71,8 @@ public class ReportController {
 	public void getZippedReport(HttpServletResponse response, @PathVariable String uuid,
 			@RequestParam(value = "validationName", required = true) String validationName,
 			@RequestParam(value = "artifacts", required = true) List<ArtifactType> artifacts) throws IOException {
-		LOG.debug("ZIP-Report for '{}' with artifacts {} requested.", uuid, artifacts);
+		LOG.debug("ZIP-Report for '{}' with artifacts {} requested.", StringUtils.normalizeSpace(uuid),
+				artifacts.stream().map(a -> a.name()).collect(Collectors.joining(",")));
 		response.setContentType("application/zip");
 		response.setHeader("Content-Disposition", "attachment; filename=\"" + validationName + "-Report.zip\"");
 
diff --git a/xplan-core/xplan-core-job/pom.xml b/xplan-core/xplan-core-job/pom.xml
index 8193f56798..a92dd3b64a 100644
--- a/xplan-core/xplan-core-job/pom.xml
+++ b/xplan-core/xplan-core-job/pom.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>de.latlon.product.xplanbox</groupId>
@@ -50,6 +51,10 @@
       <groupId>org.quartz-scheduler</groupId>
       <artifactId>quartz</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
     <!-- test -->
     <dependency>
       <groupId>org.springframework</groupId>
diff --git a/xplan-core/xplan-core-job/src/main/java/de/latlon/xplan/job/validator/memory/GmlImportJob.java b/xplan-core/xplan-core-job/src/main/java/de/latlon/xplan/job/validator/memory/GmlImportJob.java
index 13b2587dcb..85b51df7f5 100644
--- a/xplan-core/xplan-core-job/src/main/java/de/latlon/xplan/job/validator/memory/GmlImportJob.java
+++ b/xplan-core/xplan-core-job/src/main/java/de/latlon/xplan/job/validator/memory/GmlImportJob.java
@@ -20,7 +20,7 @@
  */
 package de.latlon.xplan.job.validator.memory;
 
-import org.apache.commons.io.IOUtils;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.deegree.commons.config.DeegreeWorkspace;
 import org.deegree.feature.FeatureCollection;
 import org.deegree.feature.persistence.FeatureStore;
@@ -70,6 +70,7 @@ public class GmlImportJob implements Job {
 	private DeegreeWorkspace workspace;
 
 	@Override
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	public void execute(final JobExecutionContext jobExecutionContext) throws JobExecutionException {
 		File workspaceLocation = workspace.getLocation();
 		Path path = Paths.get(workspaceLocation.toURI()).resolve("data");
@@ -109,7 +110,10 @@ public class GmlImportJob implements Job {
 		GMLStreamReader gmlStreamReader = null;
 		FeatureStoreTransaction ta = null;
 		try (InputStream inputStream = Files.newInputStream(p)) {
-			xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
+			XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+			xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+			xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+			xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream);
 			gmlStreamReader = GMLInputFactory.createGMLStreamReader(GML_32, xmlStreamReader);
 			FeatureCollection fc = gmlStreamReader.readFeatureCollection();
 			FeatureStore fs = workspace.getNewWorkspace().getResource(FeatureStoreProvider.class, MEMORY_FEATURESTORE);
diff --git a/xplan-core/xplan-core-manager/pom.xml b/xplan-core/xplan-core-manager/pom.xml
index 7201b88e31..c237b88825 100644
--- a/xplan-core/xplan-core-manager/pom.xml
+++ b/xplan-core/xplan-core-manager/pom.xml
@@ -124,6 +124,10 @@
       <groupId>com.amazonaws</groupId>
       <artifactId>aws-java-sdk-s3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
     <!-- test -->
     <dependency>
       <groupId>junit</groupId>
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/XPlanManager.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/XPlanManager.java
index 73544503a4..7a2674a6e0 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/XPlanManager.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/XPlanManager.java
@@ -56,6 +56,7 @@ import de.latlon.xplan.manager.wmsconfig.WmsWorkspaceWrapper;
 import de.latlon.xplan.manager.wmsconfig.raster.XPlanRasterManager;
 import de.latlon.xplan.manager.wmsconfig.raster.evaluation.XPlanRasterEvaluator;
 import de.latlon.xplan.manager.workspace.WorkspaceException;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.deegree.commons.utils.Pair;
 import org.deegree.commons.xml.XMLParsingException;
 import org.deegree.cs.coordinatesystems.ICRS;
@@ -154,10 +155,11 @@ public class XPlanManager {
 		managerConfigurationAnalyser.checkConfiguration();
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	public XPlanArchive analyzeArchive(String fileName) throws IOException {
-		LOG.info("- Analyse des XPlanArchivs ('" + fileName + "')...");
+		LOG.info("- Analyse des XPlanArchivs ('{}')...", fileName);
 		XPlanArchive archive = archiveCreator.createXPlanArchive(new File(fileName));
-		LOG.info("OK. " + archive);
+		LOG.info("OK. {}", archive);
 		return archive;
 	}
 
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/configuration/CoupledResourceConfiguration.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/configuration/CoupledResourceConfiguration.java
index 0f4630f685..4fe53e7cfa 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/configuration/CoupledResourceConfiguration.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/configuration/CoupledResourceConfiguration.java
@@ -22,6 +22,7 @@ package de.latlon.xplan.manager.configuration;
 
 import de.latlon.xplan.commons.XPlanType;
 import de.latlon.xplan.commons.configuration.PropertiesLoader;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -207,6 +208,7 @@ public class CoupledResourceConfiguration {
 
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private static Path getDirectoryToStoreMetadata(Properties properties) {
 		String directoryToStoreMetadata = properties.getProperty("directoryToStoreMetadata");
 		if (directoryToStoreMetadata != null)
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/internalid/InternalIdRetriever.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/internalid/InternalIdRetriever.java
index fb031df1f9..9084f338e0 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/internalid/InternalIdRetriever.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/internalid/InternalIdRetriever.java
@@ -26,6 +26,7 @@ import org.deegree.commons.config.DeegreeWorkspace;
 import org.deegree.db.ConnectionProvider;
 import org.deegree.db.ConnectionProviderProvider;
 import org.deegree.workspace.Workspace;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,6 +36,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static de.latlon.xplan.manager.database.DatabaseUtils.closeQuietly;
 
@@ -103,6 +105,7 @@ public class InternalIdRetriever {
 	 * @return prepared statement
 	 * @throws SQLException
 	 */
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "SQL Statement is read from configuration")
 	PreparedStatement retrievePreparedStatement(String matchString, String sql, Connection conn) throws SQLException {
 		PreparedStatement ps = conn.prepareStatement(sql);
 		if (matchString != null)
@@ -134,7 +137,11 @@ public class InternalIdRetriever {
 			ps = retrievePreparedStatement(matchString, sql, conn);
 			rs = retrieveResultSet(ps);
 			Map<String, String> result = collectResultSet(rs);
-			LOG.debug("Result: {}", result);
+			LOG.debug("Result: {}",
+					result.entrySet()
+						.stream()
+						.map((e) -> "InternalId: " + e.getKey() + " InternalName: " + e.getValue())
+						.collect(Collectors.joining(",")));
 			return result;
 		}
 		catch (SQLException e) {
@@ -152,7 +159,6 @@ public class InternalIdRetriever {
 		while (rs.next()) {
 			String internalId = rs.getString(configuration.getInternalIdLabel());
 			String internalName = rs.getString(configuration.getInternalNameLabel());
-			LOG.debug("adding entry: {} with value {}", internalId, internalName);
 			map.put(internalId, internalName);
 		}
 		return map;
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/log/SystemLog.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/log/SystemLog.java
index 2bcb5a54e2..9b021bfe04 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/log/SystemLog.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/log/SystemLog.java
@@ -22,6 +22,7 @@ package de.latlon.xplan.manager.log;
 
 import org.apache.xalan.Version;
 import org.apache.xalan.xslt.EnvironmentCheck;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,46 +53,47 @@ public class SystemLog {
 		LOG.info("System info");
 		LOG.info("--------------------------------------------------------------------------------");
 		LOG.info("");
-		LOG.info("- java version       " + System.getProperty("java.version") + " (" + System.getProperty("java.vendor")
-				+ ")");
-		LOG.info("- operating system   " + System.getProperty("os.name") + " (" + System.getProperty("os.version")
-				+ ", " + System.getProperty("os.arch") + ")");
-		LOG.info("- system encoding    " + Charset.defaultCharset().displayName());
-		LOG.info("- XMLOutputFactory   " + XMLOutputFactory.newInstance().getClass().getCanonicalName());
-		LOG.info("- XMLInputFactory    " + XMLInputFactory.newInstance().getClass().getCanonicalName());
+		LOG.info("- java version       {} ({})", System.getProperty("java.version"), System.getProperty("java.vendor"));
+		LOG.info("- operating system   {} ({}, {})", System.getProperty("os.name"), System.getProperty("os.version"),
+				System.getProperty("os.arch"));
+		LOG.info("- system encoding    {}", Charset.defaultCharset().displayName());
+		LOG.info("- XMLOutputFactory   {}", XMLOutputFactory.newInstance().getClass().getCanonicalName());
+		LOG.info("- XMLInputFactory    {}", XMLInputFactory.newInstance().getClass().getCanonicalName());
 		LOG.info("- xalan environment ");
-		LOG.info("    - development version: " + Version.getDevelopmentVersionNum());
-		LOG.info("    - implementation language: " + Version.getImplementationLanguage());
-		LOG.info("    - maintenance version: " + Version.getMaintenanceVersionNum());
-		LOG.info("    - major version: " + Version.getMajorVersionNum());
-		LOG.info("    - product: " + Version.getProduct());
-		LOG.info("    - release version: " + Version.getReleaseVersionNum());
-		LOG.info("    - version: " + Version.getVersion());
+		LOG.info("    - development version: {}", Version.getDevelopmentVersionNum());
+		LOG.info("    - implementation language: {}", Version.getImplementationLanguage());
+		LOG.info("    - maintenance version: {}", Version.getMaintenanceVersionNum());
+		LOG.info("    - major version: {}", Version.getMajorVersionNum());
+		LOG.info("    - product: {}", Version.getProduct());
+		LOG.info("    - release version: {}", Version.getReleaseVersionNum());
+		LOG.info("    - version: {}", Version.getVersion());
 		StringWriter envCheck = new StringWriter();
 		PrintWriter pw = new PrintWriter(envCheck, true);
 		(new EnvironmentCheck()).checkEnvironment(pw);
 		LOG.info(envCheck.toString());
 		LOG.info("- xerces environment ");
-		LOG.info("    - version: " + org.apache.xerces.impl.Version.getVersion());
+		LOG.info("    - version: {}", org.apache.xerces.impl.Version.getVersion());
 		logTransformer();
 		LOG.info("- saxon environment ");
-		LOG.info("    - product name: " + net.sf.saxon.Version.getProductName());
-		LOG.info("    - product title: " + net.sf.saxon.Version.getProductTitle());
-		LOG.info("    - product vendor: " + net.sf.saxon.Version.getProductVendor());
-		LOG.info("    - product version: " + net.sf.saxon.Version.getProductVersion());
+		LOG.info("    - product name: {}", net.sf.saxon.Version.getProductName());
+		LOG.info("    - product title: {}", net.sf.saxon.Version.getProductTitle());
+		LOG.info("    - product vendor: {}", net.sf.saxon.Version.getProductVendor());
+		LOG.info("    - product version: {}", net.sf.saxon.Version.getProductVersion());
 
 		LOG.info("--------------------------------------------------------------------------------");
 	}
 
+	@SuppressFBWarnings(value = { "XXE_DTD_TRANSFORM_FACTORY", "XXE_XSLT_TRANSFORM_FACTORY" },
+			justification = "Transformer is created only for logging purposes")
 	private static void logTransformer() {
 		try {
 			LOG.info("- transformer ");
-			LOG.info("    - system property (-Djava.xml.transform.TransformerFactory): '"
-					+ System.getProperty("java.xml.transform.TransformerFactory") + "'");
+			LOG.info("    - system property (-Djava.xml.transform.TransformerFactory): '{}'",
+					System.getProperty("java.xml.transform.TransformerFactory"));
 			TransformerFactory transformerFactory = TransformerFactory.newInstance();
-			LOG.info("    - factory " + transformerFactory.getClass());
+			LOG.info("    - factory {}", transformerFactory.getClass());
 			Transformer transformer = transformerFactory.newTransformer();
-			LOG.info("    - " + transformer.getClass());
+			LOG.info("    - {}", transformer.getClass());
 		}
 		catch (TransformerConfigurationException e) {
 			LOG.warn("An error occurred during creating a transformer instance, this may cause some "
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/metadata/ServiceMetadataDocumentWriter.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/metadata/ServiceMetadataDocumentWriter.java
index 9e3282042d..1e021570ff 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/metadata/ServiceMetadataDocumentWriter.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/metadata/ServiceMetadataDocumentWriter.java
@@ -49,7 +49,10 @@ public class ServiceMetadataDocumentWriter {
 		XMLStreamReader xmlStreamReader = null;
 		try {
 			xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
-			xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(template));
+			XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+			xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+			xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+			xmlStreamReader = xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(template));
 
 			TemplateXmlStreamWriterFilter templateWriterFilter = new TemplateXmlStreamWriterFilter(properties);
 			templateWriterFilter.setDelegate(xmlStreamWriter);
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/storage/filesystem/DeegreeRasterCacheCleaner.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/storage/filesystem/DeegreeRasterCacheCleaner.java
index 13961ed6d8..2bc58631df 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/storage/filesystem/DeegreeRasterCacheCleaner.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/storage/filesystem/DeegreeRasterCacheCleaner.java
@@ -2,6 +2,7 @@ package de.latlon.xplan.manager.storage.filesystem;
 
 import de.latlon.xplan.manager.workspace.WorkspaceReloader;
 import de.latlon.xplan.manager.workspace.WorkspaceReloaderConfiguration;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpGet;
@@ -64,6 +65,7 @@ public class DeegreeRasterCacheCleaner {
 		return isSuccessfulForAll;
 	}
 
+	@SuppressFBWarnings(value = "HTTP_PARAMETER_POLLUTION")
 	private boolean clearCache(String url, String tileStoreId) {
 		try {
 			String clearCacheUrl = retrieveDeletePlanwerkWmsUrl(url, tileStoreId);
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/XPlanEditManager.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/XPlanEditManager.java
index 0cc84699c6..3258d73446 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/XPlanEditManager.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/XPlanEditManager.java
@@ -244,7 +244,10 @@ public class XPlanEditManager extends XPlanTransactionManager {
 		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 		xPlanExporter.export(outputStream, version, modifiedFeatures, null);
 		ByteArrayInputStream originalPlan = new ByteArrayInputStream(outputStream.toByteArray());
-		XMLStreamReader originalPlanAsXmlReader = XMLInputFactory.newInstance().createXMLStreamReader(originalPlan);
+		XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+		xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+		xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+		XMLStreamReader originalPlanAsXmlReader = xmlInputFactory.createXMLStreamReader(originalPlan);
 		try {
 			return XPlanGmlParserBuilder.newBuilder().build().parseFeatureCollection(originalPlanAsXmlReader, version);
 		}
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/service/XPlanEditService.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/service/XPlanEditService.java
index 3e6b5b8a70..57e57080e8 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/service/XPlanEditService.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/transaction/service/XPlanEditService.java
@@ -27,6 +27,7 @@ import de.latlon.xplan.manager.edit.EditedArtefacts;
 import de.latlon.xplan.manager.web.shared.AdditionalPlanData;
 import de.latlon.xplan.manager.web.shared.XPlan;
 import de.latlon.xplan.manager.wmsconfig.raster.storage.StorageException;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.deegree.feature.FeatureCollection;
 
 import javax.transaction.Transactional;
@@ -61,6 +62,7 @@ public class XPlanEditService {
 		updateDocuments(planId, uploadedArtefacts, editedArtefacts);
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private void updateDocuments(int planId, List<File> uploadedArtefacts, EditedArtefacts editedArtefacts)
 			throws StorageException {
 		if (xPlanDocumentManager != null) {
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/WmsWorkspaceWrapper.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/WmsWorkspaceWrapper.java
index 09f5adca01..0276d7b125 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/WmsWorkspaceWrapper.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/WmsWorkspaceWrapper.java
@@ -21,6 +21,8 @@
 package de.latlon.xplan.manager.wmsconfig;
 
 import de.latlon.xplan.manager.configuration.ConfigurationException;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.apache.commons.io.FilenameUtils;
 import org.deegree.commons.config.DeegreeWorkspace;
 import org.deegree.commons.xml.jaxb.JAXBUtils;
 import org.deegree.theme.persistence.standard.StandardThemeProvider;
@@ -72,6 +74,7 @@ public class WmsWorkspaceWrapper {
 	/**
 	 * @return the workspace location (must not exist!), never <code>null</code>
 	 */
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	public Path getDataDirectory() {
 		return Paths.get(getLocation().toURI()).resolve(DATA_DIRECTORY);
 	}
@@ -123,7 +126,7 @@ public class WmsWorkspaceWrapper {
 	}
 
 	private File createConfig(String type) {
-		File configFile = new File(workspace.getLocation(), format("themes/%sraster.xml", type));
+		File configFile = new File(workspace.getLocation(), format("themes/%sraster.xml", FilenameUtils.getName(type)));
 		if (!configFile.isFile() || !configFile.canRead()) {
 			throw new RuntimeException("Datei '" + configFile + "' ist nicht vorhanden.");
 		}
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/raster/access/GdalRasterAdapter.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/raster/access/GdalRasterAdapter.java
index 18570fc0aa..79167d6f92 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/raster/access/GdalRasterAdapter.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/wmsconfig/raster/access/GdalRasterAdapter.java
@@ -22,6 +22,7 @@ package de.latlon.xplan.manager.wmsconfig.raster.access;
 
 import de.latlon.xplan.commons.archive.ArchiveEntry;
 import de.latlon.xplan.commons.archive.XPlanArchiveContentAccess;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.gdal.gdal.Dataset;
 import org.gdal.gdal.gdal;
@@ -79,7 +80,7 @@ public class GdalRasterAdapter {
 	 */
 	public Vector<?> getReferencedFiles(XPlanArchiveContentAccess archive, String entryName) throws IOException {
 		File zipArchiveLocation = unzipArchiveInTmpDirectory(archive);
-		File entry = new File(zipArchiveLocation, entryName);
+		File entry = new File(zipArchiveLocation, FilenameUtils.getName(entryName));
 		Dataset dataset = gdal.OpenShared(entry.getAbsolutePath());
 		if (dataset != null) {
 			return dataset.GetFileList();
@@ -113,7 +114,7 @@ public class GdalRasterAdapter {
 	private void copyToTempFile(XPlanArchiveContentAccess archive, String entryName, File archiveDirectory)
 			throws IOException {
 		InputStream content = archive.retrieveInputStreamFor(entryName);
-		File writeRasterIn = new File(archiveDirectory, entryName);
+		File writeRasterIn = new File(archiveDirectory, FilenameUtils.getName(entryName));
 		OutputStream outputStream = null;
 		try {
 			outputStream = new FileOutputStream(writeRasterIn);
diff --git a/xplan-core/xplan-core-security/pom.xml b/xplan-core/xplan-core-security/pom.xml
index ad4793d381..f93776e936 100644
--- a/xplan-core/xplan-core-security/pom.xml
+++ b/xplan-core/xplan-core-security/pom.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>xplan-core-security</artifactId>
 
@@ -18,6 +19,10 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
     <!-- logging -->
     <dependency>
       <groupId>org.slf4j</groupId>
diff --git a/xplan-core/xplan-core-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java b/xplan-core/xplan-core-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java
index 27789f34cd..cfb3e01421 100644
--- a/xplan-core/xplan-core-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java
+++ b/xplan-core/xplan-core-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java
@@ -20,6 +20,7 @@
  */
 package de.latlon.xplanbox.security.authentication;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.security.core.userdetails.User;
@@ -46,6 +47,7 @@ public class PropertiesFileUserDetailsManager implements UserDetailsManager {
 
 	private final Map<String, String> usersAndEncryptedPasswords;
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	public PropertiesFileUserDetailsManager(String userPropertiesFile, PasswordEncoder passwordEncoder)
 			throws SecurityConfigurationException {
 		try (FileInputStream inputStream = new FileInputStream(userPropertiesFile)) {
diff --git a/xplan-core/xplan-core-validator/pom.xml b/xplan-core/xplan-core-validator/pom.xml
index a9601743e5..84ad42fc1f 100644
--- a/xplan-core/xplan-core-validator/pom.xml
+++ b/xplan-core/xplan-core-validator/pom.xml
@@ -135,6 +135,10 @@
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
diff --git a/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/configuration/ValidatorConfigurationParser.java b/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/configuration/ValidatorConfigurationParser.java
index e6108da5bd..bc373f2e78 100644
--- a/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/configuration/ValidatorConfigurationParser.java
+++ b/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/configuration/ValidatorConfigurationParser.java
@@ -26,6 +26,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import de.latlon.xplan.commons.configuration.PropertiesLoader;
 import de.latlon.xplan.manager.web.shared.ConfigurationException;
 import org.apache.commons.lang3.StringUtils;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -108,6 +109,7 @@ public class ValidatorConfigurationParser {
 		}
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private Path createReportDirectory(Properties properties) throws IOException {
 		String validationReportDirectory = properties.getProperty(VALIDATION_REPORT_DIRECTORY);
 		if (validationReportDirectory == null || validationReportDirectory.isEmpty())
@@ -116,6 +118,7 @@ public class ValidatorConfigurationParser {
 			return Paths.get(validationReportDirectory);
 	}
 
+	@SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
 	private Path createRulesDirectory(Properties properties) {
 		String validationRulesDirectory = properties.getProperty(VALIDATION_RULES_DIRECTORY);
 		if (validationRulesDirectory != null && !validationRulesDirectory.isEmpty())
diff --git a/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/report/html/HtmlReportGenerator.java b/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/report/html/HtmlReportGenerator.java
index a6ccca99e5..62e9f0706b 100644
--- a/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/report/html/HtmlReportGenerator.java
+++ b/xplan-core/xplan-core-validator/src/main/java/de/latlon/xplan/validator/report/html/HtmlReportGenerator.java
@@ -23,6 +23,7 @@ package de.latlon.xplan.validator.report.html;
 import de.latlon.xplan.validator.report.ReportGenerationException;
 import de.latlon.xplan.validator.report.ValidatorReport;
 import de.latlon.xplan.validator.report.xml.XmlReportGenerator;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.commons.io.IOUtils;
 import org.slf4j.LoggerFactory;
 
@@ -31,7 +32,11 @@ import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 
 /**
  * Utility methods for generating reports
@@ -51,6 +56,8 @@ public class HtmlReportGenerator {
 	 * @throws ReportGenerationException if the generation of the XML report failed
 	 * @throws IllegalArgumentException if on of the parameters is <code>null</code>
 	 */
+	@SuppressFBWarnings(value = { "XXE_DTD_TRANSFORM_FACTORY", "XXE_XSLT_TRANSFORM_FACTORY" },
+			justification = "XML is generated, does not contain DTDs")
 	public void generateHtmlReport(ValidatorReport report, OutputStream htmlOut) throws ReportGenerationException {
 		checkParameters(report, htmlOut);
 		ByteArrayOutputStream xmlOut = writeXmlToStream(report);
diff --git a/xplan-dokumente/xplan-dokumente-api/src/main/java/de/latlon/xplanbox/api/dokumente/handler/DocumentHandler.java b/xplan-dokumente/xplan-dokumente-api/src/main/java/de/latlon/xplanbox/api/dokumente/handler/DocumentHandler.java
index 5cb8dac396..6c44603bd1 100644
--- a/xplan-dokumente/xplan-dokumente-api/src/main/java/de/latlon/xplanbox/api/dokumente/handler/DocumentHandler.java
+++ b/xplan-dokumente/xplan-dokumente-api/src/main/java/de/latlon/xplanbox/api/dokumente/handler/DocumentHandler.java
@@ -29,6 +29,7 @@ import de.latlon.xplanbox.api.dokumente.service.DocumentHeader;
 import de.latlon.xplanbox.api.dokumente.service.DocumentHeaderWithStream;
 import de.latlon.xplanbox.api.dokumente.service.DocumentService;
 import de.latlon.xplanbox.api.dokumente.v1.model.Document;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,14 +63,16 @@ public class DocumentHandler {
 	public DocumentHeader headDocument(String planId, String fileName)
 			throws InvalidPlanIdSyntax, InvalidPlanId, InvalidDocument, StorageException {
 		int planIdAsInt = checkPlanIdAndConvertIdToInt(planId);
-		LOG.debug("Retrieve header of document with filename {} of plan with id {}.", fileName, planIdAsInt);
+		LOG.debug("Retrieve header of document with filename {} of plan with id {}.",
+				StringUtils.normalizeSpace(fileName), planIdAsInt);
 		return documentService.retrieveHeader(planIdAsInt, fileName);
 	}
 
 	public DocumentHeaderWithStream getDocument(String planId, String fileName)
 			throws InvalidPlanIdSyntax, InvalidPlanId, InvalidDocument, StorageException {
 		int planIdAsInt = checkPlanIdAndConvertIdToInt(planId);
-		LOG.debug("Retrieve document with filename {} of plan with id {}.", fileName, planIdAsInt);
+		LOG.debug("Retrieve document with filename {} of plan with id {}.", StringUtils.normalizeSpace(fileName),
+				planIdAsInt);
 		return documentService.retrieveDocumentAndHeader(planIdAsInt, fileName);
 	}
 
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/EditHandler.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/EditHandler.java
index 80a6d2d9c6..f033ad1af7 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/EditHandler.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/EditHandler.java
@@ -28,6 +28,7 @@ import de.latlon.xplan.manager.web.shared.XPlan;
 import de.latlon.xplanbox.api.commons.exception.InvalidPlanId;
 import de.latlon.xplanbox.api.commons.exception.InvalidPlanIdSyntax;
 import de.latlon.xplanbox.api.manager.exception.InvalidPlanToEdit;
+import org.apache.commons.lang3.StringUtils;
 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,7 +54,7 @@ public abstract class EditHandler {
 	protected XPlanManager manager;
 
 	public XPlan findPlanById(String planId) throws Exception {
-		LOG.info("Find plan by Id '{}'", planId);
+		LOG.info("Find plan by Id '{}'", StringUtils.normalizeSpace(planId));
 		try {
 			int id = Integer.parseInt(planId);
 			return findPlanById(id);
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java
index 9d94c4647b..ded984479e 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java
@@ -41,6 +41,7 @@ import de.latlon.xplanbox.api.commons.exception.InvalidPlanIdSyntax;
 import de.latlon.xplanbox.api.commons.exception.UnsupportedParameterValue;
 import de.latlon.xplanbox.api.manager.exception.InvalidPlan;
 import de.latlon.xplanbox.api.manager.v1.model.StatusMessage;
+import org.apache.commons.lang3.StringUtils;
 import org.deegree.cs.exceptions.UnknownCRSException;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -96,7 +97,7 @@ public class PlanHandler {
 		if (!validatorReport.isReportValid()) {
 			throw new InvalidPlan(validatorReport, xFileName);
 		}
-		LOG.info("Plan is valid. Importing plan into storage for '{}'", planStatus);
+		LOG.info("Plan is valid. Importing plan into storage for '{}'", StringUtils.normalizeSpace(planStatus));
 		AdditionalPlanData metadata = createAdditionalPlanData(xPlanArchive, planStatus);
 		List<Integer> planIds = xPlanInsertManager.importPlan(xPlanArchive, null, false, true, internalId, metadata);
 		List<XPlan> plansById = findPlansById(planIds);
@@ -106,7 +107,7 @@ public class PlanHandler {
 	}
 
 	public StatusMessage deletePlan(String planId) throws Exception {
-		LOG.info("Deleting plan with Id {}", planId);
+		LOG.info("Deleting plan with Id {}", StringUtils.normalizeSpace(planId));
 		xPlanDeleteManager.delete(planId);
 		return new StatusMessage().message(String.format(DELETE_MSG, planId));
 	}
@@ -114,7 +115,7 @@ public class PlanHandler {
 	public StreamingOutput exportPlan(String planId) throws Exception {
 		try {
 			int planIdAsInt = checkIdAndConvertIdToInt(planId);
-			LOG.info("Exporting plan with Id '{}'", planId);
+			LOG.info("Exporting plan with Id '{}'", StringUtils.normalizeSpace(planId));
 			if (!xPlanDao.existsPlan(planIdAsInt)) {
 				throw new InvalidPlanId(planId);
 			}
@@ -127,25 +128,26 @@ public class PlanHandler {
 	}
 
 	public XPlan findPlanById(String planId) throws InvalidPlanIdSyntax, InvalidPlanId {
-		LOG.info("Finding plan by Id '{}'", planId);
+		LOG.info("Finding plan by Id '{}'", StringUtils.normalizeSpace(planId));
 		int id = checkIdAndConvertIdToInt(planId);
 		return findPlanById(id);
 	}
 
 	public List<XPlan> findPlansByName(String planName) {
-		LOG.info("Finding plan by name '{}'", planName);
+		LOG.info("Finding plan by name '{}'", StringUtils.normalizeSpace(planName));
 		return xPlanDao.getXPlanByName(planName);
 	}
 
 	public List<XPlan> findPlans(String planName) throws Exception {
-		LOG.info("Searching plan by name '{}'", planName);
+		LOG.info("Searching plan by name '{}'", StringUtils.normalizeSpace(planName));
 		if (planName != null)
 			return xPlanDao.getXPlansLikeName(planName);
 		return xPlanDao.getXPlanList();
 	}
 
 	public List<XPlan> findPlansById(List<Integer> planIds) throws Exception {
-		LOG.info("Finding plan by IDs '{}'", planIds);
+		LOG.info("Finding plan by IDs '{}'",
+				planIds.stream().map(planId -> Integer.toString(planId)).collect(Collectors.joining(",")));
 		List<XPlan> plans = new ArrayList<>();
 		for (int planId : planIds) {
 			XPlan planById = findPlanById(planId);
diff --git a/xplan-webservices/xplan-webservices-services/xplan-services-wms/pom.xml b/xplan-webservices/xplan-webservices-services/xplan-services-wms/pom.xml
index 2ceaf9f827..ad840b8bcf 100644
--- a/xplan-webservices/xplan-webservices-services/xplan-services-wms/pom.xml
+++ b/xplan-webservices/xplan-webservices-services/xplan-services-wms/pom.xml
@@ -111,6 +111,10 @@
       <groupId>org.locationtech.jts</groupId>
       <artifactId>jts-core</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
diff --git a/xplan-webservices/xplan-webservices-services/xplan-services-wms/src/main/java/de/latlon/xplan/wms/visibility/ValidityPeriodInspector.java b/xplan-webservices/xplan-webservices-services/xplan-services-wms/src/main/java/de/latlon/xplan/wms/visibility/ValidityPeriodInspector.java
index aa423cae53..d3f967ac39 100644
--- a/xplan-webservices/xplan-webservices-services/xplan-services-wms/src/main/java/de/latlon/xplan/wms/visibility/ValidityPeriodInspector.java
+++ b/xplan-webservices/xplan-webservices-services/xplan-services-wms/src/main/java/de/latlon/xplan/wms/visibility/ValidityPeriodInspector.java
@@ -20,6 +20,7 @@
  */
 package de.latlon.xplan.wms.visibility;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.deegree.db.ConnectionProvider;
 import org.deegree.db.ConnectionProviderProvider;
 import org.deegree.layer.metadata.LayerMetadata;
@@ -61,6 +62,7 @@ public abstract class ValidityPeriodInspector implements LayerVisibilityInspecto
 		this.schema = schema;
 	}
 
+	@SuppressFBWarnings(value = "SQL_INJECTION_JDBC", justification = "schema is a fix value")
 	public boolean isVisible(LayerMetadata layerMetadata) {
 		String layerName = layerMetadata.getName();
 		int planId = parsePlanId(layerName);
-- 
GitLab