diff --git a/pom.xml b/pom.xml index 1a9abf990f26d4c6d2c8a30f0748409363def826..d4d43580c23a5888bb838a1048311b0e39dcf67e 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>1.5.13.RELEASE</version> + <version>2.0.9.RELEASE</version> <relativePath/> </parent> @@ -118,7 +118,7 @@ <dependency> <groupId>org.jadira.usertype</groupId> <artifactId>usertype.core</artifactId> - <version>5.0.0.GA</version> + <version>6.0.1.GA</version> </dependency> <dependency> diff --git a/src/main/java/de/deadlocker8/budgetmaster/Main.java b/src/main/java/de/deadlocker8/budgetmaster/Main.java index 2a938d2893f2c720613f80703568f5abc46930ec..5930e0199891a549192d52405c73db2dedc66d6a 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/Main.java +++ b/src/main/java/de/deadlocker8/budgetmaster/Main.java @@ -11,7 +11,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.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.scheduling.annotation.EnableScheduling; import java.io.IOException; diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java index ff9f7084e264476c07790859dbfdba1016f11529..e57054c9a9177db375814b352023642258a11b6f 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java @@ -11,6 +11,7 @@ import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.util.Optional; @Controller @@ -99,13 +100,13 @@ public class AccountController extends BaseController @RequestMapping("/accounts/{ID}/edit") public String editAccount(Model model, @PathVariable("ID") Integer ID) { - Account account = accountRepository.findOne(ID); - if(account == null) + Optional<Account> accountOptional = accountRepository.findById(ID); + if(!accountOptional.isPresent()) { throw new ResourceNotFoundException(); } - model.addAttribute("account", account); + model.addAttribute("account", accountOptional.get()); model.addAttribute("settings", settingsService.getSettings()); return "accounts/newAccount"; } @@ -141,9 +142,13 @@ public class AccountController extends BaseController else { // edit existing account - Account existingAccount = accountRepository.findOne(account.getID()); - existingAccount.setName(account.getName()); - accountRepository.save(existingAccount); + Optional<Account> existingAccountOptional = accountRepository.findById(account.getID()); + if(existingAccountOptional.isPresent()) + { + Account existingAccount = existingAccountOptional.get(); + existingAccount.setName(account.getName()); + accountRepository.save(existingAccount); + } } } diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java index 77dc5981a543faf595c31e7ad43f1a9f2b361357..82f8ab2f2fb98f034874de6e548ad237a0907946 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service public class AccountService implements Resetable @@ -46,7 +47,13 @@ public class AccountService implements Resetable public void deleteAccount(int ID) { - Account accountToDelete = accountRepository.findOne(ID); + Optional<Account> accountToDeleteOptional = accountRepository.findById(ID); + if(!accountToDeleteOptional.isPresent()) + { + return; + } + + Account accountToDelete = accountToDeleteOptional.get(); transactionService.deleteTransactionsWithAccount(accountToDelete); accountToDelete.setReferringTransactions(new ArrayList<>()); @@ -61,7 +68,7 @@ public class AccountService implements Resetable setAsDefaultAccount(accounts.get(0).getID()); } - accountRepository.delete(ID); + accountRepository.deleteById(ID); } @Override @@ -113,7 +120,13 @@ public class AccountService implements Resetable { deselectAllAccounts(); - Account accountToSelect = accountRepository.findOne(ID); + Optional<Account> accountToSelectOptional = accountRepository.findById(ID); + if(!accountToSelectOptional.isPresent()) + { + return; + } + + Account accountToSelect = accountToSelectOptional.get(); accountToSelect.setSelected(true); accountRepository.save(accountToSelect); @@ -129,7 +142,13 @@ public class AccountService implements Resetable { unsetDefaultForAllAccounts(); - Account accountToSelect = accountRepository.findOne(ID); + Optional<Account> accountToSelectOptional = accountRepository.findById(ID); + if(!accountToSelectOptional.isPresent()) + { + return; + } + + Account accountToSelect = accountToSelectOptional.get(); accountToSelect.setDefault(true); accountRepository.save(accountToSelect); } diff --git a/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java b/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java index a467906c0f39c2c0229d661986291f43238ad5ec..0efdbd81373d6d00aa7a902d59062fce67268dfe 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java +++ b/src/main/java/de/deadlocker8/budgetmaster/advices/SettingsAdvice.java @@ -6,16 +6,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ModelAttribute; +import java.util.Optional; + @ControllerAdvice public class SettingsAdvice { @Autowired private SettingsRepository settingsRepository; + @SuppressWarnings("OptionalGetWithoutIsPresent") @ModelAttribute("settings") public Settings getSettings() { - return settingsRepository.findOne(0); + Optional<Settings> settingsOptional = settingsRepository.findById(0); + return settingsOptional.get(); } } diff --git a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java index e29fb8dd40cf639fc1d422d795afaf8f8449823f..2678cf37e6c2188a2b911f5f74b90dc3076a5e56 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryController.java @@ -13,6 +13,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @@ -92,12 +93,14 @@ public class CategoryController extends BaseController @RequestMapping("/categories/{ID}/edit") public String editCategory(Model model, @PathVariable("ID") Integer ID) { - Category category = categoryService.getRepository().findOne(ID); - if(category == null) + Optional<Category> categoryOptional = categoryService.getRepository().findById(ID); + if(!categoryOptional.isPresent()) { throw new ResourceNotFoundException(); } + Category category = categoryOptional.get(); + if(helpers.getCategoryColorList().contains(category.getColor())) { model.addAttribute("customColor", WHITE); diff --git a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java index 89ee498c6ea668ca81f4005c1c0c52b3dd1ce358..91a5715c4b048ba9d7ae860602d9bf2272a95f76 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; @Service public class CategoryService implements Resetable @@ -32,7 +33,13 @@ public class CategoryService implements Resetable public void deleteCategory(int ID, Category newCategory) { - Category categoryToDelete = categoryRepository.findOne(ID); + Optional<Category> categoryOptional = categoryRepository.findById(ID); + if(!categoryOptional.isPresent()) + { + throw new RuntimeException("Can't delete non-existing category with ID: " + ID); + } + + Category categoryToDelete = categoryOptional.get(); List<Transaction> referringTransactions = categoryToDelete.getReferringTransactions(); if(referringTransactions != null) { @@ -42,7 +49,7 @@ public class CategoryService implements Resetable } } - categoryRepository.delete(ID); + categoryRepository.deleteById(ID); } @Override diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java index 50b0955c6d4b28ea2b6fabf2c644387710578155..fbc7bcd05a8b5b69583b4f42d76f299ae5ed12e1 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java @@ -21,6 +21,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Optional; import java.util.UUID; @Controller @@ -69,7 +70,11 @@ public class ChartController extends BaseController public String showChart(Model model, @ModelAttribute("NewChartSettings") ChartSettings chartSettings) { chartSettings.setFilterConfiguration(filterHelpersService.updateCategoriesAndTags(chartSettings.getFilterConfiguration())); - Chart chart = chartService.getRepository().findOne(chartSettings.getChartID()); + Optional<Chart> chartOptional = chartService.getRepository().findById(chartSettings.getChartID()); + if(!chartOptional.isPresent()) + { + throw new ResourceNotFoundException(); + } List<Transaction> transactions = transactionService.getTransactionsForAccount(helpers.getCurrentAccount(), chartSettings.getStartDate(), chartSettings.getEndDate(), chartSettings.getFilterConfiguration()); String transactionJson = GSON.toJson(transactions); @@ -77,7 +82,7 @@ public class ChartController extends BaseController model.addAttribute("chartSettings", chartSettings); model.addAttribute("charts", chartService.getRepository().findAllByOrderByNameAsc()); model.addAttribute("settings", settingsService.getSettings()); - model.addAttribute("chart", chart); + model.addAttribute("chart", chartOptional.get()); model.addAttribute("containerID", UUID.randomUUID()); model.addAttribute("transactionData", transactionJson); return "charts/charts"; @@ -103,13 +108,13 @@ public class ChartController extends BaseController @RequestMapping("/charts/{ID}/edit") public String editChart(Model model, @PathVariable("ID") Integer ID) { - Chart chart = chartService.getRepository().findOne(ID); - if(chart == null) + Optional<Chart> chartOptional = chartService.getRepository().findById(ID); + if(!chartOptional.isPresent()) { throw new ResourceNotFoundException(); } - model.addAttribute("chart", chart); + model.addAttribute("chart", chartOptional.get()); model.addAttribute("settings", settingsService.getSettings()); return "charts/newChart"; } @@ -173,15 +178,20 @@ public class ChartController extends BaseController { if(isDeletable(ID)) { - chartService.getRepository().delete(ID); + chartService.getRepository().deleteById(ID); } return "redirect:/charts/manage"; } + @SuppressWarnings("OptionalIsPresent") private boolean isDeletable(Integer ID) { - Chart chartToDelete = chartService.getRepository().getOne(ID); - return chartToDelete != null && chartToDelete.getType() == ChartType.CUSTOM; + Optional<Chart> chartOptional = chartService.getRepository().findById(ID); + if(chartOptional.isPresent()) + { + return chartOptional.get().getType() == ChartType.CUSTOM; + } + return false; } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java index b79d68949aed3cf2de336d2487c5ab253341a925..5655992fdc56544108201e723b4955d1e632a681 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java @@ -42,6 +42,7 @@ public class ChartService implements Resetable Chart currentChart = chartRepository.findByName(chart.getName()); if(currentChart == null) { + chart.setID(defaultCharts.indexOf(chart)); chartRepository.save(chart); LOGGER.debug("Created default chart '" + chart.getName() + "'"); } diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java index 3f245797cea23172e5fba3377b370b8c2cff461b..f2d82654862421dd7204af4326e6aa9f1af00dec 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java @@ -3,6 +3,7 @@ package de.deadlocker8.budgetmaster.controller; import de.deadlocker8.budgetmaster.services.DateService; import de.deadlocker8.budgetmaster.settings.Settings; import de.deadlocker8.budgetmaster.settings.SettingsRepository; +import de.deadlocker8.budgetmaster.settings.SettingsService; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Autowired; @@ -20,20 +21,20 @@ public class DatePickerController extends BaseController { private final String DATE_FORMAT = "dd.MM.yy"; - private final SettingsRepository settingsRepository; + private final SettingsService settingsService; private final DateService dateService; @Autowired - public DatePickerController(SettingsRepository settingsRepository, DateService dateService) + public DatePickerController(SettingsService settingsService, DateService dateService) { - this.settingsRepository = settingsRepository; + this.settingsService = settingsService; this.dateService = dateService; } @RequestMapping(value = "/previousMonth") public String previousMonth(HttpServletResponse response, @CookieValue("currentDate") String date, @RequestParam("target") String target) { - Settings settings = settingsRepository.findOne(0); + Settings settings = settingsService.getSettings(); DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DATE_FORMAT).withLocale(settings.getLanguage().getLocale())); currentDate = currentDate.minusMonths(1); @@ -44,7 +45,7 @@ public class DatePickerController extends BaseController @RequestMapping(value = "/nextMonth") public String nextMonth(HttpServletResponse response, @CookieValue("currentDate") String date, @RequestParam("target") String target) { - Settings settings = settingsRepository.findOne(0); + Settings settings = settingsService.getSettings(); DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DATE_FORMAT).withLocale(settings.getLanguage().getLocale())); currentDate = currentDate.plusMonths(1); @@ -55,7 +56,7 @@ public class DatePickerController extends BaseController @RequestMapping(value = "/setDate") public String setDate(HttpServletResponse response, @CookieValue("currentDate") String date, @RequestParam("target") String target) { - Settings settings = settingsRepository.findOne(0); + Settings settings = settingsService.getSettings(); DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DATE_FORMAT).withLocale(settings.getLanguage().getLocale())); response.addCookie(new Cookie("currentDate", dateService.getDateStringNormal(currentDate))); diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOptionRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOptionRepository.java index cc2ca138ca7e706dc5b5f2739c4621b93726ba6d..fa2b8ed4530eca6a5e026ed9888a78b338663878 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOptionRepository.java +++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOptionRepository.java @@ -8,6 +8,4 @@ import java.util.List; public interface RepeatingOptionRepository extends JpaRepository<RepeatingOption, Integer> { List<RepeatingOption> findAllByOrderByStartDateAsc(); - - RepeatingOption findOne(Integer ID); } \ No newline at end of file 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 9d3b3893d1fc82e4eddabd08436f40bf2e6cddd8..903ac1b73aed16d766dcedf6d4d29b1c5de71df8 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettingsService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettingsService.java @@ -2,11 +2,14 @@ package de.deadlocker8.budgetmaster.reports.settings; import de.deadlocker8.budgetmaster.reports.columns.ReportColumn; import de.deadlocker8.budgetmaster.reports.columns.ReportColumnService; +import de.deadlocker8.budgetmaster.utils.ResourceNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Optional; + @Service public class ReportSettingsService { @@ -30,7 +33,8 @@ public class ReportSettingsService private void createDefaultReportSettingsIfNotExists() { - if(reportSettingsRepository.findOne(0) == null) + Optional<ReportSettings> reportSettingsOptional = reportSettingsRepository.findById(0); + if(!reportSettingsOptional.isPresent()) { ReportSettings reportSettings = ReportSettings.getDefault(); reportSettings.setID(0); @@ -42,11 +46,19 @@ public class ReportSettingsService reportSettingsRepository.save(reportSettings); LOGGER.debug("Created default report settings"); } - reportColumnService.createDefaultsWithReportSettings(reportSettingsRepository.findOne(0)); + + reportSettingsOptional = reportSettingsRepository.findById(0); + if(!reportSettingsOptional.isPresent()) + { + throw new ResourceNotFoundException(); + } + + reportColumnService.createDefaultsWithReportSettings(reportSettingsOptional.get()); } + @SuppressWarnings("OptionalGetWithoutIsPresent") public ReportSettings getReportSettings() { - return reportSettingsRepository.findOne(0); + return reportSettingsRepository.findById(0).get(); } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java index d27a0155d69d03062dea437d323243a7a38c9d91..bad3156e9f5ec2b532054218e5fd2a5a87bd5ed6 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java @@ -27,7 +27,10 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; -import org.springframework.web.bind.annotation.*; +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.bind.annotation.RequestParam; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.WebRequest; import org.springframework.web.multipart.MultipartFile; @@ -36,8 +39,7 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; @@ -45,7 +47,7 @@ import java.util.List; @Controller public class SettingsController extends BaseController { - private final SettingsRepository settingsRepository; + private final SettingsService settingsService; private final UserRepository userRepository; private final DatabaseService databaseService; private final AccountService accountService; @@ -56,9 +58,9 @@ public class SettingsController extends BaseController private final List<Integer> SEARCH_RESULTS_PER_PAGE_OPTIONS = Arrays.asList(10, 20, 25, 30, 50, 100); @Autowired - public SettingsController(SettingsRepository settingsRepository, UserRepository userRepository, DatabaseService databaseService, AccountService accountService, CategoryService categoryService, ImportService importService, BudgetMasterUpdateService budgetMasterUpdateService) + public SettingsController(SettingsService settingsService, UserRepository userRepository, DatabaseService databaseService, AccountService accountService, CategoryService categoryService, ImportService importService, BudgetMasterUpdateService budgetMasterUpdateService) { - this.settingsRepository = settingsRepository; + this.settingsService = settingsService; this.userRepository = userRepository; this.databaseService = databaseService; this.accountService = accountService; @@ -70,7 +72,7 @@ public class SettingsController extends BaseController @RequestMapping("/settings") public String settings(WebRequest request, Model model) { - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); request.removeAttribute("database", WebRequest.SCOPE_SESSION); return "settings/settings"; @@ -95,6 +97,11 @@ public class SettingsController extends BaseController settings.setBackupReminderActivated(false); } + if(settings.getAutoBackupActivated() == null) + { + settings.setAutoBackupActivated(false); + } + if(bindingResult.hasErrors()) { model.addAttribute("error", bindingResult); @@ -113,8 +120,8 @@ public class SettingsController extends BaseController userRepository.save(user); } - settingsRepository.delete(0); - settingsRepository.save(settings); + settingsService.getRepository().deleteById(0); + settingsService.getRepository().save(settings); Localization.load(); } @@ -151,28 +158,21 @@ public class SettingsController extends BaseController { LOGGER.debug("Exporting database..."); String data = databaseService.getDatabaseAsJSON(); - try - { - byte[] dataBytes = data.getBytes("UTF8"); - String fileName = "BudgetMasterDatabase_" + DateTime.now().toString("yyyy_MM_dd") + ".json"; - response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + String fileName = "BudgetMasterDatabase_" + DateTime.now().toString("yyyy_MM_dd") + ".json"; + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); - response.setContentType("application/json; charset=UTF-8"); - response.setContentLength(dataBytes.length); - response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=UTF-8"); + response.setContentLength(dataBytes.length); + response.setCharacterEncoding("UTF-8"); - try(ServletOutputStream out = response.getOutputStream()) - { - out.write(dataBytes); - out.flush(); - LOGGER.debug("Exporting database DONE"); - } - catch(IOException e) - { - e.printStackTrace(); - } + try(ServletOutputStream out = response.getOutputStream()) + { + out.write(dataBytes); + out.flush(); + LOGGER.debug("Exporting database DONE"); } - catch(UnsupportedEncodingException e) + catch(IOException e) { e.printStackTrace(); } @@ -184,7 +184,7 @@ public class SettingsController extends BaseController String verificationCode = RandomUtils.generateRandomString(RandomUtils.RandomType.BASE_58, 4, RandomUtils.RandomStringPolicy.UPPER, RandomUtils.RandomStringPolicy.DIGIT); model.addAttribute("deleteDatabase", true); model.addAttribute("verificationCode", verificationCode); - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); return "settings/settings"; } @@ -204,7 +204,7 @@ public class SettingsController extends BaseController return "redirect:/settings/database/requestDelete"; } - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); return "settings/settings"; } @@ -213,7 +213,7 @@ public class SettingsController extends BaseController public String requestImportDatabase(Model model) { model.addAttribute("importDatabase", true); - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); return "settings/settings"; } @@ -228,7 +228,7 @@ public class SettingsController extends BaseController try { - String jsonString = new String(file.getBytes(), Charset.forName("UTF-8")); + String jsonString = new String(file.getBytes(), StandardCharsets.UTF_8); DatabaseParser importer = new DatabaseParser(jsonString, categoryService.getRepository().findByType(CategoryType.NONE)); Database database = importer.parseDatabaseFromJSON(); @@ -240,7 +240,7 @@ public class SettingsController extends BaseController e.printStackTrace(); model.addAttribute("errorImportDatabase", e.getMessage()); - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); return "settings/settings"; } @@ -251,7 +251,7 @@ public class SettingsController extends BaseController { model.addAttribute("database", request.getAttribute("database", WebRequest.SCOPE_SESSION)); model.addAttribute("availableAccounts", accountService.getAllAccountsAsc()); - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); return "settings/import"; } @@ -260,7 +260,7 @@ public class SettingsController extends BaseController { importService.importDatabase((Database) request.getAttribute("database", WebRequest.SCOPE_SESSION), accountMatchList); request.removeAttribute("database", RequestAttributes.SCOPE_SESSION); - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); return "settings/settings"; } @@ -277,7 +277,7 @@ public class SettingsController extends BaseController { model.addAttribute("performUpdate", true); model.addAttribute("updateString", Localization.getString("info.text.update", Build.getInstance().getVersionName(), budgetMasterUpdateService.getAvailableVersionString())); - model.addAttribute("settings", settingsRepository.findOne(0)); + model.addAttribute("settings", settingsService.getSettings()); model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS); return "settings/settings"; } diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java index 2b925b8ed7b8990e5ead59934cf3df47c8e14f43..e2809159dffdd20b79865a9f4efc5275641618f9 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java @@ -1,11 +1,14 @@ package de.deadlocker8.budgetmaster.settings; +import de.deadlocker8.budgetmaster.charts.ChartRepository; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Optional; + @Service public class SettingsService { @@ -21,14 +24,20 @@ public class SettingsService private void createDefaultSettingsIfNotExists() { - if(settingsRepository.findOne(0) == null) + if(!settingsRepository.findById(0).isPresent()) { settingsRepository.save(Settings.getDefault()); LOGGER.debug("Created default settings"); } Settings defaultSettings = Settings.getDefault(); - Settings settings = settingsRepository.findOne(0); + Optional<Settings> settingsOptional = settingsRepository.findById(0); + if(!settingsOptional.isPresent()) + { + throw new RuntimeException("Missing Settings in database"); + } + + Settings settings = settingsOptional.get(); if(settings.getBackupReminderActivated() == null) { settings.setBackupReminderActivated(defaultSettings.getBackupReminderActivated()); @@ -45,20 +54,26 @@ public class SettingsService { settings.setAutoBackupActivated(defaultSettings.getAutoBackupActivated()); } - settingsRepository.delete(0); + settingsRepository.deleteById(0); settingsRepository.save(settings); } + @SuppressWarnings("OptionalGetWithoutIsPresent") public Settings getSettings() { - return settingsRepository.findOne(0); + return settingsRepository.findById(0).get(); } public void updateLastBackupReminderDate() { Settings settings = getSettings(); settings.setLastBackupReminderDate(DateTime.now()); - settingsRepository.delete(0); + settingsRepository.deleteById(0); settingsRepository.save(settings); } + + public SettingsRepository getRepository() + { + return settingsRepository; + } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java index 7dbf2a1b61e8f733bf17a5e7525701ae219a3005..ff3d7c9fb58a180e5143406388daa924c7f53b03 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java @@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Controller @@ -250,12 +251,14 @@ public class TransactionController extends BaseController @RequestMapping("/transactions/{ID}/edit") public String editTransaction(Model model, @CookieValue("currentDate") String cookieDate, @PathVariable("ID") Integer ID) { - Transaction transaction = transactionService.getRepository().findOne(ID); - if(transaction == null) + Optional<Transaction> transactionOptional = transactionService.getRepository().findById(ID); + if(!transactionOptional.isPresent()) { throw new ResourceNotFoundException(); } + Transaction transaction = transactionOptional.get(); + // select first transaction in order to provide correct start date for repeating transactions if(transaction.getRepeatingOption() != null) { diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java index f88181ce190d7401dc0b6ca40481c70a235ac1ef..6a1119547d29e508ee40b06c62bd2288865f3e6d 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service public class TransactionService implements Resetable @@ -141,21 +142,22 @@ public class TransactionService implements Resetable private void deleteTransactionInRepo(Integer ID) { - Transaction transactionToDelete = transactionRepository.findOne(ID); - if(transactionToDelete == null) + Optional<Transaction> transactionOptional = transactionRepository.findById(ID); + if(!transactionOptional.isPresent()) { LOGGER.debug("Skipping already deleted transaction with ID: " + ID); return; } + Transaction transactionToDelete = transactionOptional.get(); // handle repeating transactions if(transactionToDelete.getRepeatingOption() == null) { - transactionRepository.delete(ID); + transactionRepository.deleteById(ID); } else { - repeatingOptionRepository.delete(transactionToDelete.getRepeatingOption().getID()); + repeatingOptionRepository.deleteById(transactionToDelete.getRepeatingOption().getID()); } } @@ -174,7 +176,8 @@ public class TransactionService implements Resetable } } - public void deleteTransactionsWithAccount(Account account) { + public void deleteTransactionsWithAccount(Account account) + { for(Transaction referringTransaction : account.getReferringTransactions()) { deleteTransactionInRepo(referringTransaction.getID()); diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java index ed8e5bee59d7bb98d57d3b418f3f5e0992b46430..9a18d531f7c7d36b003ee17d4063376c04498b0b 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/update/BudgetMasterUpdateService.java @@ -15,7 +15,7 @@ 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.boot.system.ApplicationHome; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.Scheduled; diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/IsExeFileHook.java b/src/main/java/de/deadlocker8/budgetmaster/update/IsExeFileHook.java index b094cca606f2a0106041c436bd84649780cebed5..7ac9aa82de57df6be3b5f4e4761cf57baa8479b7 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/update/IsExeFileHook.java +++ b/src/main/java/de/deadlocker8/budgetmaster/update/IsExeFileHook.java @@ -1,7 +1,7 @@ package de.deadlocker8.budgetmaster.update; import de.thecodelabs.utils.util.SystemUtils; -import org.springframework.boot.ApplicationHome; +import org.springframework.boot.system.ApplicationHome; import java.io.File; diff --git a/src/main/java/de/deadlocker8/budgetmaster/update/IsJarFileHook.java b/src/main/java/de/deadlocker8/budgetmaster/update/IsJarFileHook.java index 6391736b432514eb5c85ae7a25032779bf6ee719..151b78081b29f5268a6ad9ed10e896516acdb8c2 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/update/IsJarFileHook.java +++ b/src/main/java/de/deadlocker8/budgetmaster/update/IsJarFileHook.java @@ -1,7 +1,7 @@ package de.deadlocker8.budgetmaster.update; import de.thecodelabs.utils.util.SystemUtils; -import org.springframework.boot.ApplicationHome; +import org.springframework.boot.system.ApplicationHome; import java.io.File; diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java index 0ef73595148ae2c9402e664d17dc5b6897178636..4ed2efc647a422965615c6aa1e608a4725f95211 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java +++ b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java @@ -1,7 +1,7 @@ package de.deadlocker8.budgetmaster.utils; import de.deadlocker8.budgetmaster.Main; -import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java index f39acd459c3d032e00051859250d4c75e7da6ea2..b672db769dc95e3d573897b91b5c73729ec8c165 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java @@ -14,8 +14,8 @@ import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java index b3f1dbc05ae06ecd5790eb9a5e290c7eb956b07f..93a182888cd22959936e0a44369b3848528aaef8 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java @@ -18,8 +18,8 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java index 1b4b3004e421f7c9321e041e422a4b6c207a2a5a..e745054732b11fb0c07380fadfdb8d24b7fb0fe2 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java @@ -19,8 +19,8 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java index 681a449b5eb7ddfb194eea3eb33de6c9e626d188..83a579b979b126b2b23cd544475e12de1115718e 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java @@ -28,6 +28,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.junit.Assert.assertEquals; @@ -79,17 +80,29 @@ public class DatabaseImportTest } @Override - public List<Category> findAll(Iterable<Integer> iterable) + public List<Category> findAllById(Iterable<Integer> iterable) { return null; } @Override - public <S extends Category> List<S> save(Iterable<S> iterable) + public <S extends Category> List<S> saveAll(Iterable<S> iterable) { return null; } + @Override + public Optional<Category> findById(Integer integer) + { + return Optional.empty(); + } + + @Override + public boolean existsById(Integer integer) + { + return false; + } + @Override public void flush() { @@ -121,41 +134,35 @@ public class DatabaseImportTest } @Override - public <S extends Category> List<S> findAll(Example<S> example) + public <S extends Category> Optional<S> findOne(Example<S> example) { - return null; + return Optional.empty(); } @Override - public <S extends Category> List<S> findAll(Example<S> example, Sort sort) + public <S extends Category> List<S> findAll(Example<S> example) { return null; } @Override - public Page<Category> findAll(Pageable pageable) + public <S extends Category> List<S> findAll(Example<S> example, Sort sort) { return null; } @Override - public <S extends Category> S save(S s) + public Page<Category> findAll(Pageable pageable) { return null; } @Override - public Category findOne(Integer integer) + public <S extends Category> S save(S s) { return null; } - @Override - public boolean exists(Integer integer) - { - return false; - } - @Override public long count() { @@ -163,7 +170,7 @@ public class DatabaseImportTest } @Override - public void delete(Integer integer) + public void deleteById(Integer integer) { } @@ -175,9 +182,8 @@ public class DatabaseImportTest } @Override - public void delete(Iterable<? extends Category> iterable) + public void deleteAll(Iterable<? extends Category> iterable) { - } @Override @@ -186,12 +192,6 @@ public class DatabaseImportTest } - @Override - public <S extends Category> S findOne(Example<S> example) - { - return null; - } - @Override public <S extends Category> Page<S> findAll(Example<S> example, Pageable pageable) { @@ -218,9 +218,9 @@ public class DatabaseImportTest return new TransactionRepository() { @Override - public Transaction findOne(Specification<Transaction> specification) + public Optional<Transaction> findOne(Specification<Transaction> specification) { - return null; + return Optional.empty(); } @Override @@ -314,17 +314,29 @@ public class DatabaseImportTest } @Override - public List<Transaction> findAll(Iterable<Integer> iterable) + public List<Transaction> findAllById(Iterable<Integer> iterable) { return null; } @Override - public <S extends Transaction> List<S> save(Iterable<S> iterable) + public <S extends Transaction> List<S> saveAll(Iterable<S> iterable) { return null; } + @Override + public Optional<Transaction> findById(Integer integer) + { + return Optional.empty(); + } + + @Override + public boolean existsById(Integer integer) + { + return false; + } + @Override public void flush() { @@ -356,41 +368,35 @@ public class DatabaseImportTest } @Override - public <S extends Transaction> List<S> findAll(Example<S> example) + public <S extends Transaction> Optional<S> findOne(Example<S> example) { - return null; + return Optional.empty(); } @Override - public <S extends Transaction> List<S> findAll(Example<S> example, Sort sort) + public <S extends Transaction> List<S> findAll(Example<S> example) { return null; } @Override - public Page<Transaction> findAll(Pageable pageable) + public <S extends Transaction> List<S> findAll(Example<S> example, Sort sort) { return null; } @Override - public <S extends Transaction> S save(S s) + public Page<Transaction> findAll(Pageable pageable) { return null; } @Override - public Transaction findOne(Integer integer) + public <S extends Transaction> S save(S s) { return null; } - @Override - public boolean exists(Integer integer) - { - return false; - } - @Override public long count() { @@ -398,7 +404,7 @@ public class DatabaseImportTest } @Override - public void delete(Integer integer) + public void deleteById(Integer integer) { } @@ -410,7 +416,7 @@ public class DatabaseImportTest } @Override - public void delete(Iterable<? extends Transaction> iterable) + public void deleteAll(Iterable<? extends Transaction> iterable) { } @@ -421,12 +427,6 @@ public class DatabaseImportTest } - @Override - public <S extends Transaction> S findOne(Example<S> example) - { - return null; - } - @Override public <S extends Transaction> Page<S> findAll(Example<S> example, Pageable pageable) { @@ -477,17 +477,29 @@ public class DatabaseImportTest } @Override - public List<Tag> findAll(Iterable<Integer> iterable) + public List<Tag> findAllById(Iterable<Integer> iterable) { return null; } @Override - public <S extends Tag> List<S> save(Iterable<S> iterable) + public <S extends Tag> List<S> saveAll(Iterable<S> iterable) { return null; } + @Override + public Optional<Tag> findById(Integer integer) + { + return Optional.empty(); + } + + @Override + public boolean existsById(Integer integer) + { + return false; + } + @Override public void flush() { @@ -519,41 +531,35 @@ public class DatabaseImportTest } @Override - public <S extends Tag> List<S> findAll(Example<S> example) + public <S extends Tag> Optional<S> findOne(Example<S> example) { - return null; + return Optional.empty(); } @Override - public <S extends Tag> List<S> findAll(Example<S> example, Sort sort) + public <S extends Tag> List<S> findAll(Example<S> example) { return null; } @Override - public Page<Tag> findAll(Pageable pageable) + public <S extends Tag> List<S> findAll(Example<S> example, Sort sort) { return null; } @Override - public <S extends Tag> S save(S s) + public Page<Tag> findAll(Pageable pageable) { return null; } @Override - public Tag findOne(Integer integer) + public <S extends Tag> S save(S s) { return null; } - @Override - public boolean exists(Integer integer) - { - return false; - } - @Override public long count() { @@ -561,7 +567,7 @@ public class DatabaseImportTest } @Override - public void delete(Integer integer) + public void deleteById(Integer integer) { } @@ -573,7 +579,7 @@ public class DatabaseImportTest } @Override - public void delete(Iterable<? extends Tag> iterable) + public void deleteAll(Iterable<? extends Tag> iterable) { } @@ -584,12 +590,6 @@ public class DatabaseImportTest } - @Override - public <S extends Tag> S findOne(Example<S> example) - { - return null; - } - @Override public <S extends Tag> Page<S> findAll(Example<S> example, Pageable pageable) {