From 961fd2b7bef8e6bdb134edebf1aad2cb547de8b7 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 6 May 2021 23:11:58 +0200
Subject: [PATCH] refactoring: fixed sonarlint warnings

---
 .../de/deadlocker8/budgetmaster/Main.java     |  4 +-
 .../budgetmaster/advices/SettingsAdvice.java  |  3 +-
 .../budgetmaster/backup/GitHelper.java        |  8 ++--
 .../budgetmaster/backup/LocalBackupTask.java  |  5 +--
 .../backup/LocalGitBackupTask.java            |  5 +--
 .../categories/CategoryController.java        |  2 +-
 .../categories/CategoryService.java           |  3 +-
 .../budgetmaster/charts/ChartController.java  |  7 +---
 .../controller/DatePickerController.java      | 16 ++++----
 .../database/DatabaseParser_v3.java           |  8 ++--
 .../database/DatabaseService.java             |  2 +-
 .../database/legacy/LegacyParser.java         | 18 ++++-----
 .../filter/FilterConfiguration.java           |  4 +-
 .../budgetmaster/filter/FilterController.java |  5 ++-
 .../budgetmaster/images/Image.java            |  8 ++--
 .../reports/ReportGeneratorService.java       | 25 +++++++-----
 .../settings/ReportSettingsService.java       |  5 +--
 .../settings/SettingsService.java             |  6 +--
 .../TransactionSpecifications.java            |  4 +-
 .../unit/TransactionSpecificationsTest.java   | 40 +++++++++----------
 20 files changed, 88 insertions(+), 90 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/Main.java b/src/main/java/de/deadlocker8/budgetmaster/Main.java
index 8065eeebe..f459cd307 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/Main.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/Main.java
@@ -114,12 +114,12 @@ public class Main extends SpringBootServletInitializer implements ApplicationRun
 			}
 			else
 			{
-				LOGGER.error(MessageFormat.format("Ignoring option --customFolder: provided path ''{0}'' is not absolute", customFolder.toString()));
+				LOGGER.error(MessageFormat.format("Ignoring option --customFolder: provided path ''{0}'' is not absolute", customFolder));
 			}
 		}
 
 		savePath = determineFolder(savePath);
-		LOGGER.info(MessageFormat.format("Used save path: {0}", savePath.toString()));
+		LOGGER.info(MessageFormat.format("Used save path: {0}", savePath));
 		return savePath;
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java b/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java
index 0efdbd813..f6e28ea29 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java
@@ -14,12 +14,11 @@ public class SettingsAdvice
 	@Autowired
 	private SettingsRepository settingsRepository;
 
-	@SuppressWarnings("OptionalGetWithoutIsPresent")
 	@ModelAttribute("settings")
 	public Settings getSettings()
 	{
 		Optional<Settings> settingsOptional = settingsRepository.findById(0);
-		return settingsOptional.get();
+		return settingsOptional.orElseThrow();
 	}
 }
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/GitHelper.java b/src/main/java/de/deadlocker8/budgetmaster/backup/GitHelper.java
index bf4d2dbf5..faebf2606 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/GitHelper.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/GitHelper.java
@@ -19,6 +19,8 @@ import java.util.Set;
 
 public class GitHelper
 {
+	private static final String REMOTE_NAME = "origin";
+
 	static class PullException extends Exception
 	{
 		public PullException(String message)
@@ -57,15 +59,15 @@ public class GitHelper
 
 	public static void replaceRemote(Git git, String remote) throws URISyntaxException, GitAPIException
 	{
-		git.remoteRemove().setRemoteName("origin").call();
-		git.remoteAdd().setName("origin").setUri(new URIish(remote)).call();
+		git.remoteRemove().setRemoteName(REMOTE_NAME).call();
+		git.remoteAdd().setName(REMOTE_NAME).setUri(new URIish(remote)).call();
 	}
 
 	public static void pullLatestChanges(Git git, CredentialsProvider credentialsProvider, String branchName) throws GitAPIException, PullException
 	{
 		final PullResult result = git.pull()
 				.setCredentialsProvider(credentialsProvider)
-				.setRemote("origin")
+				.setRemote(REMOTE_NAME)
 				.setRemoteBranchName(branchName)
 				.call();
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java
index d2e4e3b78..ce03de717 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalBackupTask.java
@@ -32,10 +32,7 @@ public class LocalBackupTask extends BackupTask
 	@Override
 	public void cleanup(Settings previousSettings, Settings newSettings)
 	{
-		if(!needsCleanup(previousSettings, newSettings))
-		{
-			return;
-		}
+		// nothing to cleanup that could interfere with future backup executions
 	}
 
 	@Override
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java
index 12d206fb7..991e3720c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/LocalGitBackupTask.java
@@ -62,10 +62,7 @@ public class LocalGitBackupTask extends GitBackupTask
 	@Override
 	public void cleanup(Settings previousSettings, Settings newSettings)
 	{
-		if(!needsCleanup(previousSettings, newSettings))
-		{
-			return;
-		}
+		// nothing to cleanup that could interfere with future backup executions
 	}
 
 	@Override
diff --git a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java
index 805ec044d..7a85cdf15 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java
@@ -57,7 +57,7 @@ public class CategoryController extends BaseController
 		model.addAttribute("availableCategories", availableCategories);
 		model.addAttribute("preselectedCategory", categoryService.findByType(CategoryType.NONE));
 
-		model.addAttribute("currentCategory", categoryService.findById(ID).get());
+		model.addAttribute("currentCategory", categoryService.findById(ID).orElseThrow());
 		return "categories/categories";
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java
index 5a93b1167..7632a5bbe 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java
@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 
 @Service
@@ -48,7 +49,7 @@ public class CategoryService implements Resetable, AccessAllEntities<Category>
 		Optional<Category> categoryOptional = categoryRepository.findById(ID);
 		if(categoryOptional.isEmpty())
 		{
-			throw new RuntimeException("Can't delete non-existing category with ID: " + ID);
+			throw new NoSuchElementException("Can't delete non-existing category with ID: " + ID);
 		}
 
 		Category categoryToDelete = categoryOptional.get();
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
index 3cd8f9431..cebdce507 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
@@ -146,12 +146,9 @@ public class ChartController extends BaseController
 		{
 			// reject editing of default chart
 			Optional<Chart> existingChartOptional = chartService.getRepository().findById(chart.getID());
-			if(existingChartOptional.isPresent())
+			if(existingChartOptional.isPresent() && existingChartOptional.get().getType() != ChartType.CUSTOM)
 			{
-				if(existingChartOptional.get().getType() != ChartType.CUSTOM)
-				{
-					return "error/400";
-				}
+				return "error/400";
 			}
 		}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java
index 0afe5aea1..31ea8bea5 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java
@@ -19,6 +19,8 @@ import javax.servlet.http.HttpServletResponse;
 @Controller
 public class DatePickerController extends BaseController
 {
+	private static final String COOKIE_NAME = "currentDate";
+
 	private final SettingsService settingsService;
 	private final DateService dateService;
 
@@ -30,34 +32,34 @@ public class DatePickerController extends BaseController
 	}
 
 	@RequestMapping(value = "/previousMonth")
-	public String previousMonth(HttpServletResponse response, @CookieValue("currentDate") String date, @RequestParam("target") String target)
+	public String previousMonth(HttpServletResponse response, @CookieValue(COOKIE_NAME) String date, @RequestParam("target") String target)
 	{
 		Settings settings = settingsService.getSettings();
 		DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
 		currentDate = currentDate.minusMonths(1);
 
-		response.addCookie(new Cookie("currentDate", dateService.getDateStringNormal(currentDate)));
+		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
 		return "redirect:" + target;
 	}
 
 	@RequestMapping(value = "/nextMonth")
-	public String nextMonth(HttpServletResponse response, @CookieValue("currentDate") String date, @RequestParam("target") String target)
+	public String nextMonth(HttpServletResponse response, @CookieValue(COOKIE_NAME) String date, @RequestParam("target") String target)
 	{
 		Settings settings = settingsService.getSettings();
 		DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
 		currentDate = currentDate.plusMonths(1);
 
-		response.addCookie(new Cookie("currentDate", dateService.getDateStringNormal(currentDate)));
+		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
 		return "redirect:" + target;
 	}
 
 	@RequestMapping(value = "/setDate")
-	public String setDate(HttpServletResponse response, @CookieValue("currentDate") String date, @RequestParam("target") String target)
+	public String setDate(HttpServletResponse response, @CookieValue(COOKIE_NAME) String date, @RequestParam("target") String target)
 	{
 		Settings settings = settingsService.getSettings();
 		DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
 
-		response.addCookie(new Cookie("currentDate", dateService.getDateStringNormal(currentDate)));
+		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
 		return "redirect:" + target;
 	}
 
@@ -65,7 +67,7 @@ public class DatePickerController extends BaseController
 	public String today(HttpServletResponse response, @RequestParam("target") String target)
 	{
 		DateTime currentDate = DateTime.now();
-		response.addCookie(new Cookie("currentDate", dateService.getDateStringNormal(currentDate)));
+		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
 		return "redirect:" + target;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
index 30791b1fb..8254b2fd7 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
@@ -45,8 +45,8 @@ public class DatabaseParser_v3
 	protected List<Category> parseCategories(JsonObject root)
 	{
 		List<Category> parsedCategories = new ArrayList<>();
-		JsonArray categories = root.get("categories").getAsJsonArray();
-		for(JsonElement currentCategory : categories)
+		JsonArray jsonCategories = root.get("categories").getAsJsonArray();
+		for(JsonElement currentCategory : jsonCategories)
 		{
 			Category parsedCategory = new Gson().fromJson(currentCategory, Category.class);
 			parsedCategories.add(parsedCategory);
@@ -58,8 +58,8 @@ public class DatabaseParser_v3
 	protected List<Account> parseAccounts(JsonObject root)
 	{
 		List<Account> parsedAccounts = new ArrayList<>();
-		JsonArray accounts = root.get("accounts").getAsJsonArray();
-		for(JsonElement currentAccount : accounts)
+		JsonArray jsonAccounts = root.get("accounts").getAsJsonArray();
+		for(JsonElement currentAccount : jsonAccounts)
 		{
 			final JsonObject accountObject = currentAccount.getAsJsonObject();
 			Integer ID = accountObject.get("ID").getAsInt();
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
index 9cf1e4263..eb87c103b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
@@ -180,7 +180,7 @@ public class DatabaseService
 		for(int i = 0; i < allowedNumberOfFiles; i++)
 		{
 			final Path oldBackup = Paths.get(existingBackups.get(i));
-			LOGGER.debug(MessageFormat.format("Schedule old backup for deletion: {0}", oldBackup.toString()));
+			LOGGER.debug(MessageFormat.format("Schedule old backup for deletion: {0}", oldBackup));
 			filesToDelete.add(oldBackup);
 		}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
index c109f5976..372c8ccd3 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
@@ -59,8 +59,8 @@ public class LegacyParser
 	private Set<Category> parseCategories(JsonObject root)
 	{
 		Set<Category> parsedCategories = new HashSet<>();
-		JsonArray categories = root.get("categories").getAsJsonArray();
-		for(JsonElement currentCategory : categories)
+		JsonArray jsonCategories = root.get("categories").getAsJsonArray();
+		for(JsonElement currentCategory : jsonCategories)
 		{
 			int ID = currentCategory.getAsJsonObject().get("ID").getAsInt();
 			String name = currentCategory.getAsJsonObject().get("name").getAsString();
@@ -82,8 +82,8 @@ public class LegacyParser
 	private List<Tag> parseTags(JsonObject root)
 	{
 		List<Tag> parsedTags = new ArrayList<>();
-		JsonArray tags = root.get("tags").getAsJsonArray();
-		for(JsonElement currentTag : tags)
+		JsonArray jsonTags = root.get("tags").getAsJsonArray();
+		for(JsonElement currentTag : jsonTags)
 		{
 			int ID = currentTag.getAsJsonObject().get("ID").getAsInt();
 			String name = currentTag.getAsJsonObject().get("name").getAsString();
@@ -97,8 +97,8 @@ public class LegacyParser
 	private List<TagMatch> parseTagMatches(JsonObject root)
 	{
 		List<TagMatch> parsedTagMatches = new ArrayList<>();
-		JsonArray tagMatches = root.get("tagMatches").getAsJsonArray();
-		for(JsonElement currentTagMatch : tagMatches)
+		JsonArray jsonTagMatches = root.get("tagMatches").getAsJsonArray();
+		for(JsonElement currentTagMatch : jsonTagMatches)
 		{
 			int tagID = currentTagMatch.getAsJsonObject().get("tagID").getAsInt();
 			int paymentID = currentTagMatch.getAsJsonObject().get("paymentID").getAsInt();
@@ -241,15 +241,15 @@ public class LegacyParser
 
 	private List<de.deadlocker8.budgetmaster.tags.Tag> getTagsByPaymentID(int paymentID)
 	{
-		List<de.deadlocker8.budgetmaster.tags.Tag> tags = new ArrayList<>();
+		List<de.deadlocker8.budgetmaster.tags.Tag> paymentTags = new ArrayList<>();
 		for(TagMatch tagMatch : tagMatches)
 		{
 			if(tagMatch.getPaymentID() == paymentID)
 			{
-				tags.add(new de.deadlocker8.budgetmaster.tags.Tag(tagMatch.getTagName()));
+				paymentTags.add(new de.deadlocker8.budgetmaster.tags.Tag(tagMatch.getTagName()));
 			}
 		}
 
-		return tags;
+		return paymentTags;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java
index 6a11a4342..970cfaf73 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java
@@ -125,7 +125,7 @@ public class FilterConfiguration
 	{
 		if(objects == null)
 		{
-			return null;
+			return new ArrayList<>();
 		}
 
 		List<Integer> includedIDs = new ArrayList<>();
@@ -139,7 +139,7 @@ public class FilterConfiguration
 
 		if(includedIDs.size() == objects.size())
 		{
-			return null;
+			return new ArrayList<>();
 		}
 
 		return includedIDs;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterController.java b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterController.java
index 88fcb674c..3799eaa7e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterController.java
@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.WebRequest;
 
 
@@ -26,7 +27,7 @@ public class FilterController extends BaseController
 	@PostMapping(value = "/apply")
 	public String post(WebRequest request, @ModelAttribute("NewFilterConfiguration") FilterConfiguration filterConfiguration)
 	{
-		request.setAttribute("filterConfiguration", filterConfiguration, WebRequest.SCOPE_SESSION);
+		request.setAttribute("filterConfiguration", filterConfiguration, RequestAttributes.SCOPE_SESSION);
 		return "redirect:" + request.getHeader("Referer");
 	}
 
@@ -36,7 +37,7 @@ public class FilterController extends BaseController
 		FilterConfiguration filterConfiguration = FilterConfiguration.DEFAULT;
 		filterConfiguration.setFilterCategories(filterHelpers.getFilterCategories());
 		filterConfiguration.setFilterTags(filterHelpers.getFilterTags());
-		request.setAttribute("filterConfiguration", filterConfiguration, WebRequest.SCOPE_SESSION);
+		request.setAttribute("filterConfiguration", filterConfiguration, RequestAttributes.SCOPE_SESSION);
 		return "redirect:" + request.getHeader("Referer");
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/images/Image.java b/src/main/java/de/deadlocker8/budgetmaster/images/Image.java
index eff5eb5a7..fdcdc2739 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/images/Image.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/images/Image.java
@@ -115,10 +115,10 @@ public class Image
 	{
 		if(this == o) return true;
 		if(o == null || getClass() != o.getClass()) return false;
-		Image image = (Image) o;
-		return Objects.equals(ID, image.ID) &&
-				Objects.equals(fileName, image.fileName) &&
-				Objects.equals(fileExtension, image.fileExtension);
+		Image other = (Image) o;
+		return Objects.equals(ID, other.ID) &&
+				Objects.equals(fileName, other.fileName) &&
+				Objects.equals(fileExtension, other.fileExtension);
 	}
 
 	@Override
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java
index 0c2fcd118..665fd68bd 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java
@@ -21,6 +21,9 @@ import java.util.List;
 import java.util.Locale;
 import java.util.stream.Collectors;
 
+import static com.itextpdf.text.BaseColor.BLACK;
+import static com.itextpdf.text.BaseColor.LIGHT_GRAY;
+
 @Service
 public class ReportGeneratorService
 {
@@ -39,13 +42,13 @@ public class ReportGeneratorService
 
 	private Chapter generateHeader(ReportConfiguration reportConfiguration)
 	{
-		Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 16, Font.BOLDITALIC, BaseColor.BLACK);
+		Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 16, Font.BOLDITALIC, BLACK);
 		Locale locale = settingsService.getSettings().getLanguage().getLocale();
 		Chunk chunk = new Chunk(Localization.getString(Strings.REPORT_HEADLINE, reportConfiguration.getReportSettings().getDate().toString("MMMM yyyy", locale)), font);
 		Chapter chapter = new Chapter(new Paragraph(chunk), 1);
 		chapter.setNumberDepth(0);
 
-		Font fontAccount = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 14, Font.BOLD, BaseColor.BLACK);
+		Font fontAccount = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 14, Font.BOLD, BLACK);
 		Chunk chunkAccount = new Chunk(Localization.getString(Strings.REPORT_HEADLINE_ACCOUNT, reportConfiguration.getAccountName()), fontAccount);
 		chapter.add(chunkAccount);
 		chapter.add(Chunk.NEWLINE);
@@ -69,8 +72,8 @@ public class ReportGeneratorService
 
 			PdfPTable table = new PdfPTable(proportions);
 			table.setWidthPercentage(tableWidth);
-			Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8, Font.NORMAL, GrayColor.BLACK);
-			Font fontBold = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8, Font.BOLD, GrayColor.BLACK);
+			Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8, Font.NORMAL, BLACK);
+			Font fontBold = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8, Font.BOLD, BLACK);
 
 			// add table header
 			for(ReportColumn column : columns)
@@ -78,7 +81,7 @@ public class ReportGeneratorService
 				ColumnType columnType = ColumnType.getByName(column.getKey());
 
 				PdfPCell cell = new PdfPCell(new Phrase(columnType.getName(), font));
-				cell.setBackgroundColor(GrayColor.LIGHT_GRAY);
+				cell.setBackgroundColor(LIGHT_GRAY);
 				cell.setHorizontalAlignment(Element.ALIGN_CENTER);
 				cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
 				table.addCell(cell);
@@ -153,8 +156,8 @@ public class ReportGeneratorService
 		writer.setPageEvent(new HeaderFooterPageEvent());
 		document.open();
 		document.setMargins(50, 45, 25, 70);
-		Font headerFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 14, Font.BOLD, BaseColor.BLACK);
-		Font smallHeaderFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12, Font.BOLD, BaseColor.BLACK);
+		Font headerFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 14, Font.BOLD, BLACK);
+		Font smallHeaderFont = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12, Font.BOLD, BLACK);
 
 		document.add(generateHeader(reportConfiguration));
 		document.add(Chunk.NEWLINE);
@@ -163,7 +166,7 @@ public class ReportGeneratorService
 		{
 			Font fontGreen = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12, Font.NORMAL, new BaseColor(36, 122, 45));
 			Font fontRed = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12, Font.NORMAL, BaseColor.RED);
-			Font fontBlack = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12, Font.BOLD, BaseColor.BLACK);
+			Font fontBlack = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12, Font.BOLD, BLACK);
 
 			Budget budget = reportConfiguration.getBudget();
 
@@ -237,15 +240,15 @@ public class ReportGeneratorService
 	{
 		PdfPTable table = new PdfPTable(2);
 		table.setWidthPercentage(100);
-		Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8, Font.NORMAL, BaseColor.BLACK);
+		Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8, Font.NORMAL, BLACK);
 
 		//header cells
 		PdfPCell cellHeaderCategory = new PdfPCell(new Phrase(Localization.getString(Strings.REPORT_CATEGORY), font));
-		cellHeaderCategory.setBackgroundColor(GrayColor.LIGHT_GRAY);
+		cellHeaderCategory.setBackgroundColor(LIGHT_GRAY);
 		cellHeaderCategory.setHorizontalAlignment(Element.ALIGN_CENTER);
 		table.addCell(cellHeaderCategory);
 		PdfPCell cellHeaderAmount = new PdfPCell(new Phrase(Localization.getString(Strings.REPORT_AMOUNT), font));
-		cellHeaderAmount.setBackgroundColor(GrayColor.LIGHT_GRAY);
+		cellHeaderAmount.setBackgroundColor(LIGHT_GRAY);
 		cellHeaderAmount.setHorizontalAlignment(Element.ALIGN_CENTER);
 		table.addCell(cellHeaderAmount);
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettingsService.java b/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettingsService.java
index 8d6356736..26d341da3 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettingsService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettingsService.java
@@ -48,7 +48,7 @@ public class ReportSettingsService
 		}
 
 		reportSettingsOptional = reportSettingsRepository.findById(0);
-		if(!reportSettingsOptional.isPresent())
+		if(reportSettingsOptional.isEmpty())
 		{
 			throw new ResourceNotFoundException();
 		}
@@ -56,9 +56,8 @@ public class ReportSettingsService
 		reportColumnService.createDefaultsWithReportSettings(reportSettingsOptional.get());
 	}
 
-	@SuppressWarnings("OptionalGetWithoutIsPresent")
 	public ReportSettings getReportSettings()
 	{
-		return reportSettingsRepository.findById(0).get();
+		return reportSettingsRepository.findById(0).orElseThrow();
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java
index eaf8fee43..6277fb882 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java
@@ -14,6 +14,7 @@ import org.springframework.validation.FieldError;
 
 import javax.annotation.PostConstruct;
 import java.lang.reflect.Field;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 
 @Service
@@ -54,7 +55,7 @@ public class SettingsService
 		Optional<Settings> settingsOptional = settingsRepository.findById(0);
 		if(settingsOptional.isEmpty())
 		{
-			throw new RuntimeException("Missing Settings in database");
+			throw new NoSuchElementException("Missing Settings in database");
 		}
 
 		Settings settings = settingsOptional.get();
@@ -120,10 +121,9 @@ public class SettingsService
 		}
 	}
 
-	@SuppressWarnings("OptionalGetWithoutIsPresent")
 	public Settings getSettings()
 	{
-		return settingsRepository.findById(0).get();
+		return settingsRepository.findById(0).orElseThrow();
 	}
 
 	@Transactional
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java
index 27896d426..38bfda8fb 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java
@@ -69,12 +69,12 @@ public class TransactionSpecifications
 				predicates.add(builder.isNull(transaction.get(Transaction_.transferAccount)));
 			}
 
-			if(categoryIDs != null)
+			if(!categoryIDs.isEmpty())
 			{
 				predicates.add(transaction.get(Transaction_.category).get("ID").in(categoryIDs));
 			}
 
-			if(tagIDs != null)
+			if(!tagIDs.isEmpty())
 			{
 				Join<Transaction, Tag> join = transaction.join(Transaction_.tags);
 				Predicate tagPredicate = builder.disjunction();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java
index 41e402218..1867c4d66 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java
@@ -153,7 +153,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getIncomesAndExpendituresAndTransfers()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(4)
@@ -166,7 +166,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getIncomesAndExpenditures()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, false, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(3)
@@ -178,7 +178,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getIncomes()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, false, false, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, false, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -188,7 +188,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getExpenditures()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, false, true, false, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, false, true, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -199,7 +199,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getTransfers()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, false, false, true, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, false, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -209,7 +209,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void incomesAndExpendituresFalse()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, false, false, false, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, false, false, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(3)
@@ -221,7 +221,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getTransferBackReferences_NoReferences()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, false, true, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -231,7 +231,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getTransferBackReferences()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account2, false, false, true, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account2, false, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -243,7 +243,7 @@ public class TransactionSpecificationsTest
 	public void getTransferBackReferences_WithStartDate()
 	{
 		DateTime startDate2019 = new DateTime(2019, 1, 1, 12, 0, 0, 0);
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate2019, DateTime.now(), account2, false, false, true, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate2019, DateTime.now(), account2, false, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).isEmpty();
@@ -252,7 +252,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getRepeating()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, false, true, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, false, true, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -262,7 +262,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void noRepeating()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, false, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, false, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(3)
@@ -276,7 +276,7 @@ public class TransactionSpecificationsTest
 	{
 		List<Integer> categoryIDs = new ArrayList<>();
 		categoryIDs.add(categoryUnused.getID());
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, categoryIDs, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, categoryIDs, List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).isEmpty();
@@ -287,7 +287,7 @@ public class TransactionSpecificationsTest
 	{
 		List<Integer> categoryIDs = new ArrayList<>();
 		categoryIDs.add(category1.getID());
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, categoryIDs, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, categoryIDs, List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -298,7 +298,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getByFullName()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, null, null, "Repeating");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, List.of(), List.of(), "Repeating");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -308,7 +308,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getByPartialName()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, null, null, "tin");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, List.of(), List.of(), "tin");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -318,7 +318,7 @@ public class TransactionSpecificationsTest
 	@Test
 	public void getByPartialName_ExcludeTransfersWithWrongAccount()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account2, true, true, true, null, null, null, "tion");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account2, true, true, true, null, List.of(), List.of(), "tion");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -331,7 +331,7 @@ public class TransactionSpecificationsTest
 		List<Integer> tagIDs = new ArrayList<>();
 		tagIDs.add(tag1.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, null, tagIDs, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, List.of(), tagIDs, null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -345,7 +345,7 @@ public class TransactionSpecificationsTest
 		tagIDs.add(tag1.getID());
 		tagIDs.add(tag2.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true,null, null, tagIDs, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true,null, List.of(), tagIDs, null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -360,7 +360,7 @@ public class TransactionSpecificationsTest
 		List<Integer> tagIDs = new ArrayList<>();
 		tagIDs.add(tagUnused.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, null, tagIDs, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateTime.now(), account, true, true, true, null, List.of(), tagIDs, null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).isEmpty();
@@ -387,7 +387,7 @@ public class TransactionSpecificationsTest
 	public void getFromAllAccountsExceptTransfersWithSpecificEndDateOrWithHiddenAccount()
 	{
 		DateTime endDate = new DateTime(2018, 11, 30, 12, 0, 0, 0);
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, null, true, true, false, null, null, null, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, null, true, true, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
-- 
GitLab