diff --git a/.github/workflows/mavenCi.yml b/.github/workflows/mavenCi.yml index 88e6ec69..3a018441 100644 --- a/.github/workflows/mavenCi.yml +++ b/.github/workflows/mavenCi.yml @@ -19,20 +19,20 @@ jobs: runs-on: ubuntu-latest env: - version: 1.3.${{ github.run_number }} + version: 2.0.${{ github.run_number }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Set up JDK 11 - uses: actions/setup-java@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'corretto' cache: maven - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: 'java' @@ -40,7 +40,7 @@ jobs: run: mvn -V -B clean package org.jacoco:jacoco-maven-plugin:0.8.7:prepare-agent org.jacoco:jacoco-maven-plugin:0.8.7:report -Pcoverage -Dproject.version=${{ env.version }}-SNAPSHOT - name: Upload Build Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: KeepTime-${{ env.version }} path: /home/runner/work/KeepTime/KeepTime/target/*-bin.zip @@ -49,27 +49,22 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: mvn -V -B sonar:sonar - -Dsonar.host.url=${{ secrets.HOST_URL }} - -Dsonar.organization=${{ secrets.ORGANIZATION_NAME }} - -Dsonar.projectKey=${{ secrets.PROJECT_KEY }} - -Dsonar.java.binaries=. - -Dsonar.qualitygate.wait=false + run: mvn -V -B sonar:sonar -Dsonar.host.url=${{ secrets.HOST_URL }} -Dsonar.organization=${{ secrets.ORGANIZATION_NAME }} -Dsonar.projectKey=${{ secrets.PROJECT_KEY }} -Dsonar.java.binaries=. -Dsonar.qualitygate.wait=false - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 dependency-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Set up JDK 11 - uses: actions/setup-java@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'corretto' cache: maven diff --git a/README.md b/README.md index 451ce521..5e431633 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,8 @@ You should put the .jar in an extra folder as a *logs* and a *db* folder will be 7. To see the changes just start the new KeepTime again ## Requirements - -* Windows 7, 10 -* Linux (tested on Ubuntu 18.04) -* Java 11 +* Operating System + * Windows 7, 10, 11 + * Linux (tested on Ubuntu 18.04) + * Mac (tested on MacBook M2 Pro (ARM based CPU)) +* Java 17 diff --git a/pom.xml b/pom.xml index 650ecd4c..3499e9ba 100644 --- a/pom.xml +++ b/pom.xml @@ -1,16 +1,29 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.1.10 + + + de.doubleslash keeptime ${project.version} - jar + jar KeepTime + Time tracker + + doubleSlash Net-Business GmbH + https://www.doubleslash.de/ + + GNU General Public License (GPL) version 3.0 @@ -19,26 +32,14 @@ - - doubleSlash Net-Business GmbH - https://www.doubleslash.de/ - - - - org.springframework.boot - spring-boot-starter-parent - 2.7.5 - - - - 1.3.0-SNAPSHOT + 2.0.0-SNAPSHOT UTF-8 UTF-8 - 11 - 11 + 17 + 22 - 8.0.2 + 9.1.0 ALL true @@ -50,34 +51,45 @@ org.openjfx javafx-controls - 11.0.2 + ${javafx.version} org.openjfx javafx-fxml - 11.0.2 + ${javafx.version} org.openjfx javafx-swing - 11 + ${javafx.version} org.openjfx javafx-graphics - 11.0.2 + ${javafx.version} win org.openjfx javafx-graphics - 11.0.2 + ${javafx.version} linux + + org.openjfx + javafx-graphics + ${javafx.version} + mac-aarch64 + org.springframework.boot spring-boot-starter-data-jpa + + org.glassfish.jaxb + jaxb-runtime + provided + com.h2database @@ -105,55 +117,23 @@ org.apache.maven.plugins maven-assembly-plugin - 3.4.2 + 3.7.1 maven-plugin org.sonarsource.scanner.maven sonar-maven-plugin - 3.9.1.2184 + 3.11.0.3922 org.hamcrest hamcrest-library - 2.2 test - - - coverage - - - - org.jacoco - jacoco-maven-plugin - 0.8.7 - - - prepare-agent - - prepare-agent - - - - report - - report - - - - XML - - - - - - - - - + keeptime-${project.version} + org.springframework.boot @@ -161,8 +141,8 @@ - pl.project13.maven - git-commit-id-plugin + io.github.git-commit-id + git-commit-id-maven-plugin false @@ -181,7 +161,6 @@ ./assembly.xml - keeptime-${project.version} @@ -207,16 +186,15 @@ dependency-check-report_suppressions.xml - - - check - - + + + check + + - @@ -242,4 +220,38 @@ - \ No newline at end of file + + + + coverage + + + + org.jacoco + jacoco-maven-plugin + 0.8.7 + + + prepare-agent + + prepare-agent + + + + report + + report + + + + XML + + + + + + + + + + diff --git a/src/main/java/de/doubleslash/keeptime/App.java b/src/main/java/de/doubleslash/keeptime/App.java index 9eaa5182..bc742dd9 100644 --- a/src/main/java/de/doubleslash/keeptime/App.java +++ b/src/main/java/de/doubleslash/keeptime/App.java @@ -95,6 +95,7 @@ public void init() throws Exception { model = springContext.getBean(Model.class); controller = springContext.getBean(Controller.class); + controller.enableAutoSave(); model.setSpringContext(springContext); } @@ -144,6 +145,7 @@ private void initialiseApplication(final Stage primaryStage) throws Exception { readSettings(); final List todaysWorkItems = model.getWorkRepository().findByStartDateOrderByStartTimeAsc(LocalDate.now()); + LOG.info("Found {} past work items", todaysWorkItems.size()); model.getPastWorkItems().addAll(todaysWorkItems); @@ -184,6 +186,7 @@ private void readSettings() { final List settingsList = model.getSettingsRepository().findAll(); final Settings settings; if (settingsList.isEmpty()) { + LOG.info("Empty settings. Set default"); settings = new Settings(); settings.setTaskBarColor(model.taskBarColor.get()); @@ -197,6 +200,7 @@ private void readSettings() { settings.setHideProjectsOnMouseExit(false); model.getSettingsRepository().save(settings); } else { + LOG.info("Got settings from database"); settings = settingsList.get(0); } @@ -239,7 +243,7 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException { final ViewControllerPopup viewControllerPopupController = loader.getController(); viewControllerPopupController.setStage(popupViewStage); - if (!OS.isLinux()) { + if (OS.isWindows()) { globalScreenListener = new GlobalScreenListener(); globalScreenListener.register(model.useHotkey.get()); globalScreenListener.setViewController(viewControllerPopupController); diff --git a/src/main/java/de/doubleslash/keeptime/common/BrowserHelper.java b/src/main/java/de/doubleslash/keeptime/common/BrowserHelper.java index 57db1d04..bea8f417 100644 --- a/src/main/java/de/doubleslash/keeptime/common/BrowserHelper.java +++ b/src/main/java/de/doubleslash/keeptime/common/BrowserHelper.java @@ -34,30 +34,43 @@ public static void openURL(final String url) { openUrlWindows(rt, url); } else if (OS.isLinux()) { openUrlLinux(rt, url); + } else if (OS.isMacOS()) { + openUrlMac(rt, url); } else { - LOG.warn("OS is not supported"); + LOG.warn("OS '{}' is not supported", OS.getOSName()); } } private static void openUrlWindows(final Runtime rt, final String url) { final String command = "rundll32 url.dll,FileProtocolHandler " + url; + executeCommand(rt, command, url); + } + + private static void openUrlLinux(final Runtime rt, final String url) { + final String[] command = {"xdg-open", url}; + executeCommand(rt, command, url); + } + + private static void openUrlMac(final Runtime rt, final String url) { + final String[] command = {"open", url}; + executeCommand(rt, command, url); + } + + private static void executeCommand(final Runtime rt, final String command, final String url) { try { LOG.debug("Executing command: {}", command); rt.exec(command); } catch (final Exception e) { - LOG.error("Could not open url '" + url + "' with command '" + command + "'.", e); + LOG.error("Could not open url '{}' with command '{}'.", url, command, e); } } - private static void openUrlLinux(final Runtime rt, final String url) { - final String[] command = { - "xdg-open", url - }; + private static void executeCommand(final Runtime rt, final String[] command, final String url) { try { LOG.debug("Executing command: {}", Arrays.toString(command)); - rt.exec(command); + rt.exec(command); } catch (final Exception e) { - LOG.error("Could not open url '" + url + "' with command '" + Arrays.toString(command) + "'.", e); + LOG.error("Could not open url '{}' with command '{}'.", url, Arrays.toString(command), e); } } } diff --git a/src/main/java/de/doubleslash/keeptime/common/FileOpenHelper.java b/src/main/java/de/doubleslash/keeptime/common/FileOpenHelper.java index 0ccfb39c..03406f2b 100644 --- a/src/main/java/de/doubleslash/keeptime/common/FileOpenHelper.java +++ b/src/main/java/de/doubleslash/keeptime/common/FileOpenHelper.java @@ -32,18 +32,19 @@ public static boolean openFile(final String filePath) { final File file = new File(filePath); final Runtime rt = Runtime.getRuntime(); - if (file.exists() && file.isFile()) { - if (OS.isWindows()) { - openFileWindows(rt, file); - } else if (OS.isLinux()) { - openFileLinux(rt, filePath); - } else { - LOG.warn("OS is not supported"); - } - return true; - } else { + if (!file.exists() || file.isFile()) { + LOG.warn("Filepath does not seem to exist or does not point to a file: '{}'.", filePath); return false; } + + if (OS.isWindows()) { + openFileWindows(rt, file); + } else if (OS.isLinux()) { + openFileLinux(rt, filePath); + } else { + LOG.warn("OS '{}' is not supported", OS.getOSName()); + } + return true; } private static void openFileWindows(final Runtime rt, final File file) { @@ -52,7 +53,7 @@ private static void openFileWindows(final Runtime rt, final File file) { LOG.debug("executing command: {}", command); rt.exec(command); } catch (final Exception e) { - LOG.error("Could not open file '" + file + "' with command '" + command + "'.", e); + LOG.error("Could not open file '{}' with command '{}'.", file, command, e); } } @@ -64,7 +65,8 @@ private static void openFileLinux(final Runtime rt, final String filePath) { LOG.debug("executing command: {}", Arrays.toString(command)); rt.exec(command); } catch (final Exception e) { - LOG.error("Could not open file '" + filePath + "' with command '" + Arrays.toString(command) + "'.", e); + LOG.error("Could not open file '{}' with command '{}'.", filePath, Arrays.toString(command), + e); } } } diff --git a/src/main/java/de/doubleslash/keeptime/common/OS.java b/src/main/java/de/doubleslash/keeptime/common/OS.java index e161bb06..5ad13a24 100644 --- a/src/main/java/de/doubleslash/keeptime/common/OS.java +++ b/src/main/java/de/doubleslash/keeptime/common/OS.java @@ -19,29 +19,26 @@ public class OS { private static final String OS_PROPERTY = "os.name"; + private static final String OS_NAME = System.getProperty(OS_PROPERTY).toLowerCase(); private OS() { // prevent instance creation } public static boolean isWindows() { - if (System.getProperty(OS_PROPERTY).toLowerCase().contains("windows")) { - return true; - } - - return false; + return OS_NAME.contains("windows"); } public static boolean isLinux() { - if (System.getProperty(OS_PROPERTY).toLowerCase().contains("linux")) { - return true; - } + return OS_NAME.contains("linux"); + } - return false; + public static String getOSName() { + return OS_NAME; } - public static String getOSname() { - return System.getProperty(OS_PROPERTY); + public static boolean isMacOS() { + return OS_NAME.contains("mac os x"); } } diff --git a/src/main/java/de/doubleslash/keeptime/controller/Controller.java b/src/main/java/de/doubleslash/keeptime/controller/Controller.java index 50aadf24..b42d4f14 100644 --- a/src/main/java/de/doubleslash/keeptime/controller/Controller.java +++ b/src/main/java/de/doubleslash/keeptime/controller/Controller.java @@ -22,11 +22,8 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.PreDestroy; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.doubleslash.keeptime.common.DateFormatter; @@ -36,25 +33,33 @@ import de.doubleslash.keeptime.model.Project; import de.doubleslash.keeptime.model.Settings; import de.doubleslash.keeptime.model.Work; +import jakarta.annotation.PreDestroy; import javafx.collections.ObservableList; @Service public class Controller { - private final long QUICK_SAVE_INTERVAL = 60; private static final Logger LOG = LoggerFactory.getLogger(Controller.class); + private final long AUTO_SAVE_INTERVAL_SECONDS = 60; + private Interval autoSaveInterval; + private final Model model; private final DateProvider dateProvider; - @Autowired public Controller(final Model model, final DateProvider dateProvider) { this.model = model; this.dateProvider = dateProvider; + } - // initiate quicksaving - new Interval(QUICK_SAVE_INTERVAL).registerCallBack(() -> saveCurrentWork(dateProvider.dateTimeNow())); + public void enableAutoSave() { + LOG.info("Enabling auto save with interval '{}' seconds.", AUTO_SAVE_INTERVAL_SECONDS); + autoSaveInterval = new Interval(AUTO_SAVE_INTERVAL_SECONDS); + autoSaveInterval.registerCallBack(() -> { + LOG.debug("Auto saving current work."); + saveCurrentWork(dateProvider.dateTimeNow()); + }); } public void changeProject(final Project newProject) { @@ -181,7 +186,7 @@ public void deleteProject(final Project p) { changeProject(model.getIdleProject()); } - LOG.info("Disabeling project '{}'.", p); + LOG.info("Disabling project '{}'.", p); final int indexToRemove = p.getIndex(); p.setEnabled(false); // we don't delete it because of the referenced work @@ -320,7 +325,7 @@ public void setComment(final String notes) { } /** - * Calculate todays seconds counted as work + * Calculate today's seconds counted as work */ public long calcTodaysWorkSeconds() { final List workItems = new ArrayList<>(); @@ -341,16 +346,12 @@ public long calcTodaysWorkSeconds() { } /** - * Calculate todays present seconds (work+nonWork) + * Calculate today's present seconds (work+nonWork) */ public long calcTodaysSeconds() { return calcSeconds(model.getPastWorkItems()); } - public ObservableList getAvailableProjects() { - return model.getAvailableProjects(); - } - public long calcSeconds(final List workItems) { long seconds = 0; diff --git a/src/main/java/de/doubleslash/keeptime/model/Model.java b/src/main/java/de/doubleslash/keeptime/model/Model.java index db79a842..5d9ce501 100644 --- a/src/main/java/de/doubleslash/keeptime/model/Model.java +++ b/src/main/java/de/doubleslash/keeptime/model/Model.java @@ -16,12 +16,6 @@ package de.doubleslash.keeptime.model; -import java.util.Comparator; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.stereotype.Component; - import de.doubleslash.keeptime.model.repos.ProjectRepository; import de.doubleslash.keeptime.model.repos.SettingsRepository; import de.doubleslash.keeptime.model.repos.WorkRepository; @@ -31,6 +25,10 @@ import javafx.collections.ObservableList; import javafx.collections.transformation.SortedList; import javafx.scene.paint.Color; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.stereotype.Component; + +import java.util.Comparator; @Component public class Model { @@ -38,7 +36,6 @@ public class Model { private WorkRepository workRepository; private SettingsRepository settingsRepository; - @Autowired public Model(final ProjectRepository projectRepository, final WorkRepository workRepository, final SettingsRepository settingsRepository) { super(); diff --git a/src/main/java/de/doubleslash/keeptime/model/Project.java b/src/main/java/de/doubleslash/keeptime/model/Project.java index c6b28711..5e4db8a1 100644 --- a/src/main/java/de/doubleslash/keeptime/model/Project.java +++ b/src/main/java/de/doubleslash/keeptime/model/Project.java @@ -16,14 +16,7 @@ package de.doubleslash.keeptime.model; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; +import jakarta.persistence.*; import de.doubleslash.keeptime.model.persistenceconverter.ColorConverter; import javafx.scene.paint.Color; @@ -42,7 +35,7 @@ public class Project { @Lob private String description; - @Convert(converter = ColorConverter.class, disableConversion = false) + @Convert(converter = ColorConverter.class) private Color color; private boolean isWork; diff --git a/src/main/java/de/doubleslash/keeptime/model/Settings.java b/src/main/java/de/doubleslash/keeptime/model/Settings.java index 9bf5505e..8efb9587 100644 --- a/src/main/java/de/doubleslash/keeptime/model/Settings.java +++ b/src/main/java/de/doubleslash/keeptime/model/Settings.java @@ -16,13 +16,13 @@ package de.doubleslash.keeptime.model; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import de.doubleslash.keeptime.model.persistenceconverter.ColorConverter; import javafx.scene.paint.Color; diff --git a/src/main/java/de/doubleslash/keeptime/model/Work.java b/src/main/java/de/doubleslash/keeptime/model/Work.java index 9d53a06e..97ae32c8 100644 --- a/src/main/java/de/doubleslash/keeptime/model/Work.java +++ b/src/main/java/de/doubleslash/keeptime/model/Work.java @@ -18,14 +18,7 @@ import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.*; @Entity @Table(name = "Work") diff --git a/src/main/java/de/doubleslash/keeptime/model/persistenceconverter/ColorConverter.java b/src/main/java/de/doubleslash/keeptime/model/persistenceconverter/ColorConverter.java index 5bf1c10c..abc3c405 100644 --- a/src/main/java/de/doubleslash/keeptime/model/persistenceconverter/ColorConverter.java +++ b/src/main/java/de/doubleslash/keeptime/model/persistenceconverter/ColorConverter.java @@ -16,8 +16,7 @@ package de.doubleslash.keeptime.model.persistenceconverter; -import javax.persistence.AttributeConverter; - +import jakarta.persistence.AttributeConverter; import javafx.scene.paint.Color; public class ColorConverter implements AttributeConverter { diff --git a/src/main/java/de/doubleslash/keeptime/model/repos/WorkRepository.java b/src/main/java/de/doubleslash/keeptime/model/repos/WorkRepository.java index dcee0a4c..0064e193 100644 --- a/src/main/java/de/doubleslash/keeptime/model/repos/WorkRepository.java +++ b/src/main/java/de/doubleslash/keeptime/model/repos/WorkRepository.java @@ -28,6 +28,6 @@ @Repository public interface WorkRepository extends JpaRepository { - @Query(value = "SELECT * FROM work WHERE CAST(start_time AS DATE) = ?1 ORDER BY start_time ASC", nativeQuery = true) + @Query(value = "SELECT w FROM Work w WHERE CAST(startTime AS DATE) = ?1 ORDER BY startTime ASC") List findByStartDateOrderByStartTimeAsc(LocalDate creationDate); } diff --git a/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java b/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java index 71546dc2..fc509d0b 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java @@ -23,7 +23,6 @@ import javafx.scene.control.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import de.doubleslash.keeptime.model.Model; @@ -62,7 +61,6 @@ public class ManageProjectController { private BooleanProperty formValidProperty = new SimpleBooleanProperty(false); - @Autowired public ManageProjectController(final Model model) { this.model = model; } diff --git a/src/main/java/de/doubleslash/keeptime/view/ProjectsListViewController.java b/src/main/java/de/doubleslash/keeptime/view/ProjectsListViewController.java index 23cdbeb7..0c4b66ee 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ProjectsListViewController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ProjectsListViewController.java @@ -343,7 +343,7 @@ private String createTooltipTextForProject(final Project p) { if (p.getDescription() == null || p.getDescription().isEmpty()) { return p.getName(); } else { - return String.format("%s%n%s", p.getName(), p.getDescription()); + return "%s%n%s".formatted(p.getName(), p.getDescription()); } } diff --git a/src/main/java/de/doubleslash/keeptime/view/ReportController.java b/src/main/java/de/doubleslash/keeptime/view/ReportController.java index 840751cc..71f4e22a 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ReportController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ReportController.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import de.doubleslash.keeptime.common.DateFormatter; @@ -110,7 +109,6 @@ public class ReportController { private boolean expanded = true; - @Autowired public ReportController(final Model model, final Controller controller) { this.model = model; this.controller = controller; diff --git a/src/main/java/de/doubleslash/keeptime/view/SettingsController.java b/src/main/java/de/doubleslash/keeptime/view/SettingsController.java index b5a405c5..6e1c3e4e 100644 --- a/src/main/java/de/doubleslash/keeptime/view/SettingsController.java +++ b/src/main/java/de/doubleslash/keeptime/view/SettingsController.java @@ -167,7 +167,6 @@ public class SettingsController { @Autowired ViewController mainscreen; - @Autowired public SettingsController(final Model model, final Controller controller, ApplicationProperties applicationProperties) { this.model = model; @@ -178,13 +177,13 @@ public SettingsController(final Model model, final Controller controller, @FXML private void initialize() { LOG.debug("start init"); - LOG.info("OS: {}", OS.getOSname()); + LOG.info("OS: {}", OS.getOSName()); LOG.debug("set versionLabel text"); LOG.debug("load substages"); LOG.debug("set version label text"); - if (OS.isLinux()) { - LOG.info("Disabling unsupported settings for Linux."); + if (!OS.isWindows()) { + LOG.info("Disabling unsupported settings (hotkey) for non windows feature."); useHotkeyCheckBox.setDisable(true); hotkeyLabel.setDisable(true); globalKeyloggerLabel.setDisable(true); @@ -208,7 +207,7 @@ private void initialize() { saveButton.setOnAction(ae -> { LOG.info("Save clicked"); - if (OS.isLinux()) { + if (!OS.isWindows()) { if (hoverBackgroundColor.getValue().getOpacity() < 0.5) { hoverBackgroundColor.setValue(Color.rgb((int) (hoverBackgroundColor.getValue().getRed() * 255), (int) (hoverBackgroundColor.getValue().getGreen() * 255), @@ -218,7 +217,7 @@ private void initialize() { alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE); alert.setHeaderText("Color setting not supported!"); alert.setContentText( - "The level of opacity on your hover background is to high for Linux. Resetting it."); + "The level of opacity on your hover background is to low (<0.5) for non Windows system. Resetting it."); alert.showAndWait(); } @@ -231,7 +230,7 @@ private void initialize() { alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE); alert.setHeaderText("Color settings not supported!"); alert.setContentText( - "The level of opacity on your hover background is to high for Linux. Resetting it."); + "The level of opacity on your default background is to low (<0.5) for non Windows system. Resetting it."); alert.showAndWait(); } @@ -366,11 +365,13 @@ private void initImportButton() { confirmationAlert.setHeaderText("Do you want to Override current Data ?"); confirmationAlert.getDialogPane() .setContent(new Label( - "Import previously exported .sql file. This will overwrite the currently used database contents - all current data will be lost!\n" - + "\n" - + "If you do not have a .sql file yet you need to open the previous version of KeepTime and in the settings dialog press \"Export\".\n" - + "\n" - + "You will need to restart the application after this action. If you proceed you need to select the previous exported .sql file.")); + """ + Import previously exported .sql file. This will overwrite the currently used database contents - all current data will be lost! + + If you do not have a .sql file yet you need to open the previous version of KeepTime and in the settings dialog press "Export". + + You will need to restart the application after this action. If you proceed you need to select the previous exported .sql file.\ + """)); confirmationAlert.showAndWait(); if (confirmationAlert.getResult() == ButtonType.NO) { @@ -390,10 +391,14 @@ private void initImportButton() { final String url = applicationProperties.getSpringDataSourceUrl(); final String username = applicationProperties.getSpringDataSourceUserName(); final String password = applicationProperties.getSpringDataSourcePassword(); - // TODO: add an option at the next release to make the "FROM_1X flag" configurable. E.g. if we upgrade (in - // the release after) from H2 version 2.x to 2.x we must not set the "FROM_1X flag". - new RunScript().runTool("-url", url, "-user", username, "-password", password, "-script", file.toString(), - "-options", "FROM_1X"); + + if (file.getName().contains("H2-version-1")) { + new RunScript().runTool("-url", url, "-user", username, "-password", password, "-script", file.toString(), + "-options", "FROM_1X"); + LOG.info("FROM_1X feature is used"); + }else { + new RunScript().runTool("-url", url, "-user", username, "-password", password, "-script", file.toString()); + } Alert informationDialog = new Alert(AlertType.INFORMATION); @@ -403,8 +408,10 @@ private void initImportButton() { informationDialog.setTitle("Import done"); informationDialog.setHeaderText("The data was imported."); informationDialog.getDialogPane() - .setContent(new Label("KeepTime will now be CLOSED!\n" - + "You have to RESTART it again to see the changes")); + .setContent(new Label(""" + KeepTime will now be CLOSED! + You have to RESTART it again to see the changes\ + """)); informationDialog.showAndWait(); Platform.exit(); @@ -433,7 +440,7 @@ private void initExportButton() { final FileChooser fileChooser = new FileChooser(); fileChooser.setInitialDirectory(Paths.get(".").toFile()); - fileChooser.setInitialFileName(String.format("KeepTime_database-export_H2-version-%s.sql", h2Version)); + fileChooser.setInitialFileName("KeepTime_database-export_H2-version-%s.sql".formatted(h2Version)); fileChooser.getExtensionFilters().add(new ExtensionFilter("SQL script files.", "*.sql")); final File fileToSave = fileChooser.showSaveDialog(thisStage); if (fileToSave == null) { @@ -522,9 +529,9 @@ private void showLicense(final Licenses license) { final Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Ooops"); alert.setHeaderText("Could not find the license file"); - alert.setContentText(String.format( - "We could not find the license file at \"%s\". Did you remove it?%nPlease redownload or visit \"%s\".", - license.getPath(), license.getUrl())); + alert.setContentText( + "We could not find the license file at \"%s\". Did you remove it?%nPlease redownload or visit \"%s\".".formatted( + license.getPath(), license.getUrl())); alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE); diff --git a/src/main/java/de/doubleslash/keeptime/view/ViewController.java b/src/main/java/de/doubleslash/keeptime/view/ViewController.java index b5315a9a..aec65db1 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ViewController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ViewController.java @@ -24,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import de.doubleslash.keeptime.common.ColorHelper; @@ -160,7 +159,6 @@ private class Delta { private ProjectsListViewController projectsListViewController; - @Autowired public ViewController(final Model model, final Controller controller) { this.model = model; this.controller = controller; @@ -497,7 +495,7 @@ private GridPane setUpAddNewProjectGridPane(final Dialog dialog) { try { grid = loader.load(); } catch (final IOException e) { - throw new FXMLLoaderException(String.format("Error while loading '%s'.", RESOURCE.FXML_MANAGE_PROJECT), e); + throw new FXMLLoaderException("Error while loading '%s'.".formatted(RESOURCE.FXML_MANAGE_PROJECT), e); } dialog.getDialogPane().setContent(grid); diff --git a/src/main/java/de/doubleslash/keeptime/viewpopup/ViewControllerPopup.java b/src/main/java/de/doubleslash/keeptime/viewpopup/ViewControllerPopup.java index 6ada9c95..809f58e3 100644 --- a/src/main/java/de/doubleslash/keeptime/viewpopup/ViewControllerPopup.java +++ b/src/main/java/de/doubleslash/keeptime/viewpopup/ViewControllerPopup.java @@ -20,7 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import de.doubleslash.keeptime.common.ColorHelper; @@ -60,7 +59,6 @@ public class ViewControllerPopup { private ProjectsListViewController projectsListViewController; - @Autowired public ViewControllerPopup(final Model model, final Controller controller) { this.model = model; this.controller = controller; diff --git a/src/test/java/de/doubleslash/keeptime/common/DateFormatterTest.java b/src/test/java/de/doubleslash/keeptime/common/DateFormatterTest.java index 02e63ea3..f3f63b6f 100644 --- a/src/test/java/de/doubleslash/keeptime/common/DateFormatterTest.java +++ b/src/test/java/de/doubleslash/keeptime/common/DateFormatterTest.java @@ -25,10 +25,10 @@ import org.junit.jupiter.api.Test; @Disabled -public class DateFormatterTest { +class DateFormatterTest { @Test - public void zeroSecondsBetweenTest() { + void zeroSecondsBetweenTest() { final LocalDateTime startDate = LocalDateTime.now(); final LocalDateTime endDate = startDate.plusNanos(10000); diff --git a/src/test/java/de/doubleslash/keeptime/controller/ControllerTest.java b/src/test/java/de/doubleslash/keeptime/controller/ControllerTest.java index 34e18a22..62bd750a 100644 --- a/src/test/java/de/doubleslash/keeptime/controller/ControllerTest.java +++ b/src/test/java/de/doubleslash/keeptime/controller/ControllerTest.java @@ -31,9 +31,7 @@ import java.util.concurrent.TimeUnit; import org.hamcrest.Matchers; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.springframework.test.util.ReflectionTestUtils; @@ -47,10 +45,9 @@ import de.doubleslash.keeptime.model.repos.WorkRepository; import javafx.scene.paint.Color; -public class ControllerTest { +class ControllerTest { private static Controller testee; - private Model model; private DateProvider mockedDateProvider; @@ -66,7 +63,7 @@ void beforeTest() { } @Test - public void moveProjectFromEndToStart() { + void moveProjectFromEndToStart() { final List expectedOrderAfter = Arrays.asList(1, 2, 3, 0); @@ -94,7 +91,7 @@ public void moveProjectFromEndToStart() { } @Test - public void moveProjectFromStartToEnd() { + void moveProjectFromStartToEnd() { final List expectedOrderAfter = Arrays.asList(3, 0, 1, 2); @@ -121,7 +118,7 @@ public void moveProjectFromStartToEnd() { } @Test - public void moveProjectForward() { + void moveProjectForward() { final List expectedOrderAfter = Arrays.asList(0, 2, 1, 3); @@ -148,7 +145,7 @@ public void moveProjectForward() { } @Test - public void moveProjectBackward() { + void moveProjectBackward() { final List expectedOrderAfter = Arrays.asList(0, 2, 1, 3); @@ -174,7 +171,7 @@ public void moveProjectBackward() { } @Test - public void dontMoveProjectTest() { + void dontMoveProjectTest() { final List expectedOrderAfter = Arrays.asList(0, 1, 2, 3); @@ -199,7 +196,7 @@ public void dontMoveProjectTest() { } @Test - public void changeProjectSameDayTest() { + void changeProjectSameDayTest() { final LocalDateTime firstProjectDateTime = LocalDateTime.now(); final LocalDateTime secondProjectDateTime = LocalDateTime.now(); @@ -230,7 +227,7 @@ public void changeProjectSameDayTest() { } @Test - public void changeProjectOtherDayTest() { + void changeProjectOtherDayTest() { Mockito.when(mockedWorkRepository.save(Mockito.any(Work.class))).thenAnswer(i -> i.getArguments()[0]); final LocalDateTime firstProjectDateTime = LocalDateTime.now(); final LocalDateTime secondProjectDateTime = firstProjectDateTime.plusDays(1); // project is create the next day @@ -262,8 +259,8 @@ public void changeProjectOtherDayTest() { } @Test - public void changeProjectOtherDayWithTimeTest() { - final LocalDateTime firstProjectDateTime = LocalDateTime.of(2018, 02, 14, 14, 0); + void changeProjectOtherDayWithTimeTest() { + final LocalDateTime firstProjectDateTime = LocalDateTime.of(2018, 2, 14, 14, 0); final LocalDateTime secondProjectDateTime = firstProjectDateTime.plusDays(1); // project is create the next day Mockito.when(mockedDateProvider.dateTimeNow()).thenReturn(firstProjectDateTime); @@ -299,7 +296,7 @@ public void changeProjectOtherDayWithTimeTest() { } @Test - public void shouldCalculateSecondsCorrectlyWhenWorkItemsAreGiven() { + void shouldCalculateSecondsCorrectlyWhenWorkItemsAreGiven() { final Project workProject1 = new Project("workProject1", "Some description", Color.GREEN, true, 0); final Project workProject2 = new Project("workProject2", "A good description", Color.RED, true, 1); final Project nonworkProject1 = new Project("nonworkProject1", "An even better description", Color.RED, false, 2); @@ -332,7 +329,7 @@ public void shouldCalculateSecondsCorrectlyWhenWorkItemsAreGiven() { } @Test - public void shouldUpdateWorkItemPersistentlyWhenWorkItemIsEdited() { + void shouldUpdateWorkItemPersistentlyWhenWorkItemIsEdited() { Mockito.when(mockedDateProvider.dateTimeNow()).thenReturn(LocalDateTime.now()); Mockito.when(mockedWorkRepository.save(Mockito.any(Work.class))) .thenAnswer(invocation -> invocation.getArguments()[0]); @@ -364,7 +361,7 @@ public void shouldUpdateWorkItemPersistentlyWhenWorkItemIsEdited() { } @Test - public void shouldNotUpdateOthersWhenWorkItemIsEdited() { + void shouldNotUpdateOthersWhenWorkItemIsEdited() { Mockito.when(mockedDateProvider.dateTimeNow()).thenReturn(LocalDateTime.now()); Mockito.when(mockedWorkRepository.save(Mockito.any(Work.class))) .thenAnswer(invocation -> invocation.getArguments()[0]); @@ -402,7 +399,7 @@ public void shouldNotUpdateOthersWhenWorkItemIsEdited() { } @Test - public void shouldDeleteWorkPersistentlyWhenWorkIsDeleted() { + void shouldDeleteWorkPersistentlyWhenWorkIsDeleted() { final Project project1 = new Project("workProject1", "Some description", Color.RED, true, 0); model.getAllProjects().add(project1); @@ -422,7 +419,7 @@ public void shouldDeleteWorkPersistentlyWhenWorkIsDeleted() { } @Test - public void shouldRemoveWorkFromPastWorkItemsWhenWorkIsDeleted() { + void shouldRemoveWorkFromPastWorkItemsWhenWorkIsDeleted() { final Project project1 = new Project("workProject1", "Some description", Color.RED, true, 0); model.getAllProjects().add(project1); diff --git a/src/test/java/de/doubleslash/keeptime/view/ProjectReportTest.java b/src/test/java/de/doubleslash/keeptime/view/ProjectReportTest.java index b106b95c..da5f65d7 100644 --- a/src/test/java/de/doubleslash/keeptime/view/ProjectReportTest.java +++ b/src/test/java/de/doubleslash/keeptime/view/ProjectReportTest.java @@ -26,7 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ProjectReportTest { +class ProjectReportTest { /** The slf4j-logger for this class. */ private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -41,7 +41,7 @@ void setUp() { } @Test - public void testAppendToWorkNotes_EmptyNoteAtStart() { + void testAppendToWorkNotes_EmptyNoteAtStart() { this.uut.appendToWorkNotes(EMPTY_NOTE); this.uut.appendToWorkNotes("note 1 "); this.uut.appendToWorkNotes("note 2 "); @@ -50,7 +50,7 @@ public void testAppendToWorkNotes_EmptyNoteAtStart() { } @Test - public void testAppendToWorkNotes_EmptyNoteInTheMiddle() { + void testAppendToWorkNotes_EmptyNoteInTheMiddle() { this.uut.appendToWorkNotes("note 1 "); this.uut.appendToWorkNotes(EMPTY_NOTE); this.uut.appendToWorkNotes("note 2 "); @@ -59,7 +59,7 @@ public void testAppendToWorkNotes_EmptyNoteInTheMiddle() { } @Test - public void testAppendToWorkNotes_NoEmptyNote() { + void testAppendToWorkNotes_NoEmptyNote() { this.uut = new ProjectReport(); this.uut.appendToWorkNotes("note 1"); this.uut.appendToWorkNotes("note 2"); @@ -69,7 +69,7 @@ public void testAppendToWorkNotes_NoEmptyNote() { } @Test - public void testAppendToWorkNotes_EmptyNotesAtTheEnd() { + void testAppendToWorkNotes_EmptyNotesAtTheEnd() { this.uut = new ProjectReport(); this.uut.appendToWorkNotes("note 1"); this.uut.appendToWorkNotes("note 2"); diff --git a/src/test/java/de/doubleslash/keeptime/view/ProjectsListViewControllerTest.java b/src/test/java/de/doubleslash/keeptime/view/ProjectsListViewControllerTest.java index 076ac314..c8abff71 100644 --- a/src/test/java/de/doubleslash/keeptime/view/ProjectsListViewControllerTest.java +++ b/src/test/java/de/doubleslash/keeptime/view/ProjectsListViewControllerTest.java @@ -23,10 +23,10 @@ import de.doubleslash.keeptime.model.Project; import org.junit.jupiter.api.Test; -public class ProjectsListViewControllerTest { +class ProjectsListViewControllerTest { @Test - public void shouldMatchWhenSearchTermIsInDescription() { + void shouldMatchWhenSearchTermIsInDescription() { final Project project = new Project(); project.setName("NotSearchTerm"); @@ -36,7 +36,7 @@ public void shouldMatchWhenSearchTermIsInDescription() { } @Test - public void shouldMatchWhenSearchTermIsInName() { + void shouldMatchWhenSearchTermIsInName() { final Project project = new Project(); project.setName("SearchTerm_CZ"); @@ -46,7 +46,7 @@ public void shouldMatchWhenSearchTermIsInName() { } @Test - public void shouldMatchWhenSearchTermIsNameAndDescription() { + void shouldMatchWhenSearchTermIsNameAndDescription() { final Project project = new Project(); project.setName("SearchTerm_Peter"); @@ -56,7 +56,7 @@ public void shouldMatchWhenSearchTermIsNameAndDescription() { } @Test - public void shouldMatchWhenCaseDiffersInNameAsSearchTerm() { + void shouldMatchWhenCaseDiffersInNameAsSearchTerm() { final Project project = new Project(); project.setName("PeTerPAn"); @@ -66,7 +66,7 @@ public void shouldMatchWhenCaseDiffersInNameAsSearchTerm() { } @Test - public void shouldMatchWhenCaseDiffersInDescriptionAsSearchTerm() { + void shouldMatchWhenCaseDiffersInDescriptionAsSearchTerm() { final Project project = new Project(); project.setName(""); @@ -76,7 +76,7 @@ public void shouldMatchWhenCaseDiffersInDescriptionAsSearchTerm() { } @Test - public void shouldNotMatchWhenDescriptionAndNameAreNotMatching() { + void shouldNotMatchWhenDescriptionAndNameAreNotMatching() { final Project project = new Project(); project.setName("MyNameIsJohn");