From 2cac9f9c98cb87644a31972d4aa73dbc21566a6a Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Sat, 12 Feb 2022 23:39:37 +0100
Subject: [PATCH] #649 - Update spring boot and fix circular dependencies

---
 pom.xml                                       |  2 +-
 .../budgetmaster/advices/ServiceAdvice.java   | 10 +--
 .../authentication/WebSecurityConfig.java     |  4 +-
 .../services/UpdateCheckService.java          | 34 -------
 .../settings/SettingsController.java          |  9 +-
 .../settings/SettingsService.java             | 11 +--
 .../budgetmaster/update/ArtifactBean.java     | 21 +++++
 .../BudgetMasterUpdateConfiguration.java      | 89 +++++++++++++++++++
 .../update/BudgetMasterUpdateService.java     | 73 ++++-----------
 .../resources/templates/helpers/navbar.ftl    |  2 +-
 .../resources/templates/settings/settings.ftl |  6 +-
 11 files changed, 146 insertions(+), 115 deletions(-)
 delete mode 100644 src/main/java/de/deadlocker8/budgetmaster/services/UpdateCheckService.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/update/ArtifactBean.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateConfiguration.java

diff --git a/pom.xml b/pom.xml
index 5db62dbb8..59af88c90 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,7 +35,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.5.6</version>
+        <version>2.6.3</version>
         <relativePath/>
     </parent>
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/advices/ServiceAdvice.java b/src/main/java/de/deadlocker8/budgetmaster/advices/ServiceAdvice.java
index f26e72102..023fe551e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/advices/ServiceAdvice.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/advices/ServiceAdvice.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmaster.advices;
 import de.deadlocker8.budgetmaster.services.CurrencyService;
 import de.deadlocker8.budgetmaster.services.DateService;
 import de.deadlocker8.budgetmaster.services.HelpersService;
-import de.deadlocker8.budgetmaster.services.UpdateCheckService;
+import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ModelAttribute;
@@ -21,7 +21,7 @@ public class ServiceAdvice
 	CurrencyService currencyService;
 
 	@Autowired
-	UpdateCheckService updateCheckService;
+	BudgetMasterUpdateService updateService;
 
 	@ModelAttribute("helpers")
 	public HelpersService getHelpers()
@@ -41,9 +41,9 @@ public class ServiceAdvice
 		return currencyService;
 	}
 
-	@ModelAttribute("updateCheckService")
-	public UpdateCheckService getUpdateCheckService()
+	@ModelAttribute("updateService")
+	public BudgetMasterUpdateService getUpdateService()
 	{
-		return updateCheckService;
+		return updateService;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/authentication/WebSecurityConfig.java b/src/main/java/de/deadlocker8/budgetmaster/authentication/WebSecurityConfig.java
index 9ee223b29..a574f32be 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/authentication/WebSecurityConfig.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/authentication/WebSecurityConfig.java
@@ -64,8 +64,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter
 				.permitAll();
 	}
 
-	@Autowired
-	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
+	@Override
+	protected void configure(AuthenticationManagerBuilder auth) throws Exception
 	{
 		auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/UpdateCheckService.java b/src/main/java/de/deadlocker8/budgetmaster/services/UpdateCheckService.java
deleted file mode 100644
index 0756936f4..000000000
--- a/src/main/java/de/deadlocker8/budgetmaster/services/UpdateCheckService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package de.deadlocker8.budgetmaster.services;
-
-import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class UpdateCheckService
-{
-	private final BudgetMasterUpdateService budgetMasterUpdateService;
-
-	@Autowired
-	public UpdateCheckService(BudgetMasterUpdateService budgetMasterUpdateService)
-	{
-		this.budgetMasterUpdateService = budgetMasterUpdateService;
-	}
-
-	public boolean isUpdateAvailable()
-	{
-		try
-		{
-			return budgetMasterUpdateService.getUpdateService().isUpdateAvailable();
-		}
-		catch(NullPointerException e)
-		{
-			return false;
-		}
-	}
-
-	public String getAvailableVersionString()
-	{
-		return budgetMasterUpdateService.getAvailableVersionString();
-	}
-}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
index 55e2c70e3..5512a051a 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
@@ -13,7 +13,6 @@ import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList;
 import de.deadlocker8.budgetmaster.database.model.BackupDatabase;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 import de.deadlocker8.budgetmaster.services.ImportService;
-import de.deadlocker8.budgetmaster.services.UpdateCheckService;
 import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService;
 import de.deadlocker8.budgetmaster.utils.LanguageType;
 import de.deadlocker8.budgetmaster.utils.Mappings;
@@ -101,13 +100,12 @@ public class SettingsController extends BaseController
 	private final CategoryService categoryService;
 	private final ImportService importService;
 	private final BudgetMasterUpdateService budgetMasterUpdateService;
-	private final UpdateCheckService updateCheckService;
 	private final BackupService backupService;
 
 	private final List<Integer> SEARCH_RESULTS_PER_PAGE_OPTIONS = Arrays.asList(10, 20, 25, 30, 50, 100);
 
 	@Autowired
-	public SettingsController(SettingsService settingsService, DatabaseService databaseService, AccountService accountService, CategoryService categoryService, ImportService importService, BudgetMasterUpdateService budgetMasterUpdateService, UpdateCheckService updateCheckService, BackupService backupService)
+	public SettingsController(SettingsService settingsService, DatabaseService databaseService, AccountService accountService, CategoryService categoryService, ImportService importService, BudgetMasterUpdateService budgetMasterUpdateService, BackupService backupService)
 	{
 		this.settingsService = settingsService;
 		this.databaseService = databaseService;
@@ -115,7 +113,6 @@ public class SettingsController extends BaseController
 		this.categoryService = categoryService;
 		this.importService = importService;
 		this.budgetMasterUpdateService = budgetMasterUpdateService;
-		this.updateCheckService = updateCheckService;
 		this.backupService = backupService;
 	}
 
@@ -422,9 +419,9 @@ public class SettingsController extends BaseController
 	{
 		budgetMasterUpdateService.getUpdateService().fetchCurrentVersion();
 
-		if(updateCheckService.isUpdateAvailable())
+		if(budgetMasterUpdateService.isUpdateAvailable())
 		{
-			WebRequestUtils.putNotification(request, new Notification(Localization.getString("notification.settings.update.available", updateCheckService.getAvailableVersionString()), NotificationType.INFO));
+			WebRequestUtils.putNotification(request, new Notification(Localization.getString("notification.settings.update.available", budgetMasterUpdateService.getAvailableVersionString()), NotificationType.INFO));
 		}
 		return ReturnValues.REDIRECT_ALL_ENTITIES;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java
index b9430d145..a56eafa39 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java
@@ -21,13 +21,9 @@ import java.util.Optional;
 public class SettingsService
 {
 	private static final Logger LOGGER = LoggerFactory.getLogger(SettingsService.class);
-	private final SettingsRepository settingsRepository;
-
-	@Autowired
-	private SettingsService settingsService;
 
-	@Autowired
-	private UserRepository userRepository;
+	private final SettingsRepository settingsRepository;
+	private final UserRepository userRepository;
 
 	@Autowired
 	public SettingsService(SettingsRepository settingsRepository, UserRepository userRepository)
@@ -37,9 +33,10 @@ public class SettingsService
 	}
 
 	@PostConstruct
+	@Transactional
 	public void postInit()
 	{
-		this.settingsService.createDefaultSettingsIfNotExists();
+		this.createDefaultSettingsIfNotExists();
 	}
 
 	@Transactional
diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/ArtifactBean.java b/src/main/java/de/deadlocker8/budgetmaster/update/ArtifactBean.java
new file mode 100644
index 000000000..836548fcb
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/update/ArtifactBean.java
@@ -0,0 +1,21 @@
+package de.deadlocker8.budgetmaster.update;
+
+import de.deadlocker8.budgetmaster.Build;
+import de.thecodelabs.versionizer.config.Artifact;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ArtifactBean
+{
+	@Bean
+	public Artifact artifact()
+	{
+		Artifact newArtifact = new Artifact();
+		newArtifact.setVersion(Build.getInstance().getVersionName());
+		newArtifact.setGroupId("de.deadlocker8");
+		newArtifact.setArtifactId("BudgetMaster");
+		newArtifact.setArtifactType(Artifact.ArtifactType.RUNTIME);
+		return newArtifact;
+	}
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateConfiguration.java b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateConfiguration.java
new file mode 100644
index 000000000..f9fa300eb
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateConfiguration.java
@@ -0,0 +1,89 @@
+package de.deadlocker8.budgetmaster.update;
+
+import de.deadlocker8.budgetmaster.Main;
+import de.thecodelabs.storage.settings.Storage;
+import de.thecodelabs.storage.settings.StorageTypes;
+import de.thecodelabs.utils.util.SystemUtils;
+import de.thecodelabs.versionizer.VersionizerItem;
+import de.thecodelabs.versionizer.config.Artifact;
+import de.thecodelabs.versionizer.config.Repository;
+import de.thecodelabs.versionizer.model.RemoteFile;
+import de.thecodelabs.versionizer.service.UpdateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.system.ApplicationHome;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.io.File;
+import java.nio.file.Paths;
+
+@Component
+public class BudgetMasterUpdateConfiguration
+{
+	private UpdateService.Strategy updateStrategy;
+	private String executablePath;
+	private RemoteFile.FileType fileType;
+	private boolean isRunningFromSource = true;
+
+	private final Artifact artifact;
+
+	@Autowired
+	public BudgetMasterUpdateConfiguration(Artifact artifact)
+	{
+		this.artifact = artifact;
+	}
+
+	@PostConstruct
+	private void postInit() {
+		final File source = new ApplicationHome().getSource();
+		executablePath = null;
+		updateStrategy = UpdateService.Strategy.JAR;
+		fileType = RemoteFile.FileType.JAR;
+
+		SystemUtils.setIsJarHook(new IsJarFileHook());
+		SystemUtils.setIsExeHook(new IsExeFileHook());
+
+		if(source != null)
+		{
+			isRunningFromSource = false;
+			executablePath = source.getAbsolutePath();
+			if(executablePath.toLowerCase().endsWith(".exe"))
+			{
+				updateStrategy = UpdateService.Strategy.EXE;
+				fileType = RemoteFile.FileType.EXE;
+			}
+		}
+	}
+
+	@Bean
+	public UpdateService updateService()
+	{
+		ClassLoader classLoader = Main.class.getClassLoader();
+		Repository repository = Storage.load(classLoader.getResourceAsStream("repositories.json"), StorageTypes.JSON, Repository.class);
+
+		VersionizerItem versionizerItem = new VersionizerItem(repository, executablePath);
+		UpdateService versionizerUpdateService = UpdateService.startVersionizer(versionizerItem, updateStrategy, UpdateService.InteractionType.HEADLESS, UpdateService.RepositoryType.RELEASE);
+		if(executablePath != null)
+		{
+			versionizerUpdateService.addArtifact(artifact, Paths.get(executablePath));
+		}
+		return versionizerUpdateService;
+	}
+
+	@Bean
+	public String executablePath() {
+		return executablePath;
+	}
+
+	@Bean
+	public RemoteFile.FileType fileType() {
+		return fileType;
+	}
+
+	@Bean
+	public boolean runningFromSource()
+	{
+		return isRunningFromSource;
+	}
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java
index 45a53aefe..d1785ae6c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java
@@ -1,28 +1,19 @@
 package de.deadlocker8.budgetmaster.update;
 
 import de.deadlocker8.budgetmaster.Build;
-import de.deadlocker8.budgetmaster.Main;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
-import de.thecodelabs.storage.settings.Storage;
-import de.thecodelabs.storage.settings.StorageTypes;
-import de.thecodelabs.utils.util.SystemUtils;
-import de.thecodelabs.versionizer.VersionizerItem;
 import de.thecodelabs.versionizer.config.Artifact;
-import de.thecodelabs.versionizer.config.Repository;
 import de.thecodelabs.versionizer.model.RemoteFile;
 import de.thecodelabs.versionizer.model.Version;
 import de.thecodelabs.versionizer.service.UpdateService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.system.ApplicationHome;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
-import java.io.File;
-import java.nio.file.Paths;
 import java.text.MessageFormat;
 
 @Service
@@ -42,32 +33,16 @@ public class BudgetMasterUpdateService
 	@Autowired
 	private ApplicationEventPublisher applicationEventPublisher;
 
-	private boolean isRunningFromSource = true;
+	@Autowired(required = false)
+	@Qualifier("executablePath")
 	private String executablePath;
-	private UpdateService.Strategy updateStrategy;
-	private RemoteFile.FileType fileType;
-
-	public BudgetMasterUpdateService()
-	{
-		File source = new ApplicationHome().getSource();
-		executablePath = null;
-		updateStrategy = UpdateService.Strategy.JAR;
-		fileType = RemoteFile.FileType.JAR;
 
-		SystemUtils.setIsJarHook(new IsJarFileHook());
-		SystemUtils.setIsExeHook(new IsExeFileHook());
+	@Autowired
+	private RemoteFile.FileType fileType;
 
-		if(source != null)
-		{
-			isRunningFromSource = false;
-			executablePath = source.getAbsolutePath();
-			if(executablePath.toLowerCase().endsWith(".exe"))
-			{
-				updateStrategy = UpdateService.Strategy.EXE;
-				fileType = RemoteFile.FileType.EXE;
-			}
-		}
-	}
+	@Autowired
+	@Qualifier("runningFromSource")
+	private boolean isRunningFromSource;
 
 	@Scheduled(cron = "${versionizer.service.cron}")
 	public void updateSearchTask()
@@ -85,35 +60,21 @@ public class BudgetMasterUpdateService
 		}
 	}
 
-	@Bean
-	public Artifact artifact()
+	public UpdateService getUpdateService()
 	{
-		Artifact newArtifact = new Artifact();
-		newArtifact.setVersion(Build.getInstance().getVersionName());
-		newArtifact.setGroupId("de.deadlocker8");
-		newArtifact.setArtifactId("BudgetMaster");
-		newArtifact.setArtifactType(Artifact.ArtifactType.RUNTIME);
-		return newArtifact;
+		return updateService;
 	}
 
-	@Bean
-	public UpdateService updateService()
+	public boolean isUpdateAvailable()
 	{
-		ClassLoader classLoader = Main.class.getClassLoader();
-		Repository repository = Storage.load(classLoader.getResourceAsStream("repositories.json"), StorageTypes.JSON, Repository.class);
-
-		VersionizerItem versionizerItem = new VersionizerItem(repository, executablePath);
-		UpdateService versionizerUpdateService = UpdateService.startVersionizer(versionizerItem, updateStrategy, UpdateService.InteractionType.HEADLESS, UpdateService.RepositoryType.RELEASE);
-		if(executablePath != null)
+		try
 		{
-			versionizerUpdateService.addArtifact(artifact, Paths.get(executablePath));
+			return updateService.isUpdateAvailable();
+		}
+		catch(NullPointerException e)
+		{
+			return false;
 		}
-		return versionizerUpdateService;
-	}
-
-	public UpdateService getUpdateService()
-	{
-		return updateService;
 	}
 
 	public String getAvailableVersionString()
diff --git a/src/main/resources/templates/helpers/navbar.ftl b/src/main/resources/templates/helpers/navbar.ftl
index 87d700e53..11d6892eb 100644
--- a/src/main/resources/templates/helpers/navbar.ftl
+++ b/src/main/resources/templates/helpers/navbar.ftl
@@ -27,7 +27,7 @@
         <@itemDivider/>
         <@itemLogout locale.getString("menu.logout") "lock"/>
 
-        <#if updateCheckService.isUpdateAvailable()>
+        <#if updateService.isUpdateAvailable()>
             <@itemDivider/>
             <@itemUpdate "/settings/update", locale.getString("menu.update"), "system_update"/>
         </#if>
diff --git a/src/main/resources/templates/settings/settings.ftl b/src/main/resources/templates/settings/settings.ftl
index 222d16ea7..b38541c90 100644
--- a/src/main/resources/templates/settings/settings.ftl
+++ b/src/main/resources/templates/settings/settings.ftl
@@ -198,14 +198,14 @@
                                         </div>
                                     </div>
                                     <div class="left-align">
-                                        <#if updateCheckService.getAvailableVersionString() == "-">
+                                        <#if updateService.getAvailableVersionString() == "-">
                                             <#if settings.isUseDarkTheme()>
                                                 <#assign bannerClasses="background-grey text-black">
                                             <#else>
                                                 <#assign bannerClasses="background-grey text-white">
                                             </#if>
                                         <#else>
-                                            <#if updateCheckService.isUpdateAvailable()>
+                                            <#if updateService.isUpdateAvailable()>
                                                 <#assign bannerClasses="background-orange text-black">
                                             <#else>
                                                 <#assign bannerClasses="background-green text-white">
@@ -213,7 +213,7 @@
                                         </#if>
 
                                         <div class="banner ${bannerClasses}">
-                                            ${updateCheckService.getAvailableVersionString()}
+                                            ${updateService.getAvailableVersionString()}
                                         </div>
                                   </div>
                                 </div>
-- 
GitLab