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");