diff --git a/pom.xml b/pom.xml index f99f3290b76cb60571f66abc0a4336518781970f..afe7b06d94a6de14ebe7a912d27e1859898f09b9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <groupId>de.deadlocker8</groupId> <artifactId>BudgetMaster</artifactId> - <version>2.0.0</version> + <version>2.0.0-SNAPSHOT</version> <name>BudgetMaster</name> <repositories> @@ -118,6 +118,18 @@ <artifactId>libStorage</artifactId> </dependency> + <dependency> + <groupId>de.thecodelabs.versionizer</groupId> + <artifactId>api</artifactId> + <version>${versionizer.version}</version> + <exclusions> + <exclusion> + <groupId>de.thecodelabs</groupId> + <artifactId>libLogger-slf4j</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> @@ -184,4 +196,17 @@ </plugin> </plugins> </build> + + <distributionManagement> + <repository> + <id>release</id> + <name>TheCodeLabs-releases</name> + <url>https://maven.thecodelabs.de/artifactory/TheCodeLabs-release</url> + </repository> + <snapshotRepository> + <id>snapshots</id> + <name>TheCodeLabs-snapshots</name> + <url>https://maven.thecodelabs.de/artifactory/TheCodeLabs-snapshots</url> + </snapshotRepository> + </distributionManagement> </project> \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/Main.java b/src/main/java/de/deadlocker8/budgetmaster/Main.java index 5630058e1b84feb2eb4796bf5ac575a4996bcd34..c937115a1f71d6f1e59b48fd91abe37da5ec6c6c 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/Main.java +++ b/src/main/java/de/deadlocker8/budgetmaster/Main.java @@ -9,6 +9,7 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; import java.io.IOException; import java.nio.file.Files; @@ -18,6 +19,7 @@ import java.util.Arrays; import java.util.Locale; +@EnableScheduling @SpringBootApplication public class Main implements ApplicationRunner { @@ -81,7 +83,8 @@ public class Main implements ApplicationRunner LOGGER.info("============================="); } - private static void logAppInfo(String appName, String versionName, String versionCode, String versionDate) { + private static void logAppInfo(String appName, String versionName, String versionCode, String versionDate) + { LOGGER.info(appName + " - v" + versionName + " - (versioncode: " + versionCode + ") from " + versionDate + ")"); } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java index 6ecc1b1605ff60276df1352989242ccc770474c8..b8c07fabfceb5fcaec843dc2ce8690be9af1f5f6 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java @@ -11,6 +11,7 @@ import de.deadlocker8.budgetmaster.repositories.SettingsRepository; import de.deadlocker8.budgetmaster.services.DatabaseService; import de.deadlocker8.budgetmaster.services.HelpersService; import de.deadlocker8.budgetmaster.services.ImportService; +import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService; import de.deadlocker8.budgetmaster.utils.LanguageType; import de.deadlocker8.budgetmaster.utils.Strings; import de.thecodelabs.utils.util.Localization; @@ -60,6 +61,9 @@ public class SettingsController extends BaseController @Autowired private ImportService importService; + @Autowired + private BudgetMasterUpdateService budgetMasterUpdateService; + private final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @RequestMapping("/settings") @@ -67,6 +71,7 @@ public class SettingsController extends BaseController { model.addAttribute("settings", settingsRepository.findOne(0)); request.removeAttribute("database", WebRequest.SCOPE_SESSION); + model.addAttribute("availableVersion", budgetMasterUpdateService.getAvailableVersion()); return "settings"; } @@ -241,4 +246,11 @@ public class SettingsController extends BaseController request.removeAttribute("database", RequestAttributes.SCOPE_SESSION); return "settings"; } + + @RequestMapping("/updateSearch") + public String updateSearch() + { + budgetMasterUpdateService.getUpdateService().fetchCurrentVersion(); + return "redirect:/settings"; + } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java index 97e4210bc1a125f6aa35ce6f103cecbb2bf9f41f..45f2071ee5f1c184a579c234b7b5fcaf1275817d 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java @@ -1,5 +1,6 @@ package de.deadlocker8.budgetmaster.services; +import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService; import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch; import de.deadlocker8.budgetmaster.entities.*; import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierType; @@ -48,6 +49,9 @@ public class HelpersService @Autowired private CategoryRepository categoryRepository; + @Autowired + private BudgetMasterUpdateService budgetMasterUpdateService; + public String getCurrencyString(int amount) { return getCurrencyString(amount / 100.0); @@ -283,6 +287,13 @@ public class HelpersService public boolean isUpdateAvailable() { - return true; + try + { + return budgetMasterUpdateService.getUpdateService().isUpdateAvailable(); + } + catch(NullPointerException e) + { + return false; + } } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java new file mode 100644 index 0000000000000000000000000000000000000000..b101a7a9fd38c1f4fd3cd5b230c5fcea7c9aefcd --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java @@ -0,0 +1,117 @@ +package de.deadlocker8.budgetmaster.update; + +import de.deadlocker8.budgetmaster.Main; +import de.deadlocker8.budgetmaster.services.SettingsService; +import de.thecodelabs.storage.settings.Storage; +import de.thecodelabs.storage.settings.StorageTypes; +import de.thecodelabs.versionizer.VersionizerItem; +import de.thecodelabs.versionizer.config.Artifact; +import de.thecodelabs.versionizer.config.Repository; +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.ApplicationHome; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.io.File; + +@Service +public class BudgetMasterUpdateService +{ + private final static Logger LOGGER = LoggerFactory.getLogger(Main.class); + + @Autowired + private Artifact artifact; + + @Autowired + private UpdateService updateService; + + @Autowired + private SettingsService settingsService; + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + + @Scheduled(cron = "${versionizer.service.cron}") + public void updateSearchTask() + { + if(settingsService.getSettings().isAutoUpdateCheckEnabled()) + { + updateService.fetchCurrentVersion(); + if(updateService.isUpdateAvailable()) + { + UpdateAvailableEvent customSpringEvent = new UpdateAvailableEvent(this, updateService); + applicationEventPublisher.publishEvent(customSpringEvent); + } + } + } + + @Bean + public Artifact artifact() + { + Artifact artifact = new Artifact(); +// artifact.setVersion(Build.getInstance().getVersionName()); + artifact.setVersion("0.0.0"); + artifact.setGroupId("de.deadlocker8"); + artifact.setArtifactId("BudgetMaster"); + return artifact; + } + + @Bean + public UpdateService updateService() + { + ClassLoader classLoader = Main.class.getClassLoader(); + Repository repository = Storage.load(classLoader.getResourceAsStream("repositories.json"), StorageTypes.JSON, Repository.class); + + File source = new ApplicationHome().getSource(); + String executablePath = null; + if(source == null) + { + LOGGER.debug("Running from source code: Skipping update check"); + } + else + { + executablePath = source.getAbsolutePath(); + } + + VersionizerItem versionizerItem = new VersionizerItem(repository, artifact, executablePath); + return UpdateService.startVersionizer(versionizerItem, UpdateService.Strategy.JAR, UpdateService.InteractionType.HEADLESS); + } + + @Component + public class UpdateEventListener implements ApplicationListener<UpdateAvailableEvent> + { + @Override + public void onApplicationEvent(UpdateAvailableEvent updateAvailableEvent) + { + UpdateService updateService = updateAvailableEvent.getUpdateService(); + Version version = updateService.getRemoteVersionForArtifact(artifact); + + System.out.println(version); + } + } + + public UpdateService getUpdateService() + { + return updateService; + } + + public String getAvailableVersion() + { + if(updateService.getRemoteVersionForArtifact(artifact) == null) + { + return "-"; + } + else + { + return "v" + updateService.getRemoteVersionForArtifact(artifact).toVersionString(); + } + } +} diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/UpdateAvailableEvent.java b/src/main/java/de/deadlocker8/budgetmaster/update/UpdateAvailableEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..06884c9b4b3cf898e785ab1b707472f7dcbbee28 --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/update/UpdateAvailableEvent.java @@ -0,0 +1,20 @@ +package de.deadlocker8.budgetmaster.update; + +import de.thecodelabs.versionizer.service.UpdateService; +import org.springframework.context.ApplicationEvent; + +public class UpdateAvailableEvent extends ApplicationEvent +{ + private final UpdateService updateService; + + UpdateAvailableEvent(Object source, UpdateService updateService) + { + super(source); + this.updateService = updateService; + } + + public UpdateService getUpdateService() + { + return updateService; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ab0d8a40513bf2c8cccdd737d1602d9988e68031..84bbccc4e060d6c3258198943168595f751acd53 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,6 +12,8 @@ logging.level.root=INFO logging.level.de.deadlocker8=DEBUG +versionizer.service.cron=* * * */1 * * + app.name=@project.artifactId@ app.version.code=@app.versionCode@ app.version.name=@project.version@ diff --git a/src/main/resources/repositories.json b/src/main/resources/repositories.json new file mode 100644 index 0000000000000000000000000000000000000000..9104987630b717df8e883af69cec7d777753fd62 --- /dev/null +++ b/src/main/resources/repositories.json @@ -0,0 +1,5 @@ +{ + "url": "https://maven.thecodelabs.de/artifactory", + "repository.releases": "TheCodeLabs-release", + "repository.snapshots": "TheCodeLabs-snapshots" +} \ No newline at end of file diff --git a/src/main/resources/templates/settings.ftl b/src/main/resources/templates/settings.ftl index 52d9703b225a5a416900edccb40dd32fe0350497..91a5aa084973bfcc2e14d4238b068b9ccb7c38c3 100644 --- a/src/main/resources/templates/settings.ftl +++ b/src/main/resources/templates/settings.ftl @@ -101,22 +101,22 @@ <div class="switch"> <label> ${locale.getString("settings.updates.automatic.deactivated")} - <input type="checkbox" name="autoUpdateCheckEnabled" <#if settings.isUseDarkTheme()>checked</#if>> + <input type="checkbox" name="autoUpdateCheckEnabled" <#if settings.isAutoUpdateCheckEnabled()>checked</#if>> <span class="lever"></span> ${locale.getString("settings.updates.automatic.activated")} </label> </div> </td> <td>${locale.getString("settings.updates.current.version")}</td> - <td>v${build.getVersionName()} (${build.getVersionCode()})</td> + <td>v${build.getVersionName()}</td> </tr> <tr> <td>${locale.getString("settings.updates.latest.version")}</td> - <td>v2.0.0</td> + <td>${availableVersion}</td> </tr> <tr> <td colspan="2"> - <a href="/updateSearch" class="waves-effect waves-light btn budgetmaster-blue-light"><i class="material-icons left">refresh</i>${locale.getString("settings.updates.search")}</a> + <a href="/updateSearch" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">refresh</i>${locale.getString("settings.updates.search")}</a> </td> </tr> </table>