Skip to content

Commit ae9aa7e

Browse files
committed
added day switch logic. added test. added DI for testability. added dateprovider for testability
1 parent 9fa44e3 commit ae9aa7e

File tree

14 files changed

+255
-118
lines changed

14 files changed

+255
-118
lines changed

src/main/java/de/doubleslash/keeptime/Main.java

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
import de.doubleslash.keeptime.model.Project;
2020
import de.doubleslash.keeptime.model.Settings;
2121
import de.doubleslash.keeptime.model.Work;
22-
import de.doubleslash.keeptime.model.repos.ProjectRepository;
23-
import de.doubleslash.keeptime.model.repos.SettingsRepository;
24-
import de.doubleslash.keeptime.model.repos.WorkRepository;
2522
import de.doubleslash.keeptime.view.ViewController;
2623
import de.doubleslash.keeptime.viewPopup.GlobalScreenListener;
2724
import de.doubleslash.keeptime.viewPopup.ViewControllerPopup;
@@ -44,35 +41,27 @@ public class Main extends Application {
4441
public static Stage stage;
4542
Stage popupViewStage;
4643

47-
private final Logger Log = LoggerFactory.getLogger(this.getClass());
44+
private final Logger LOG = LoggerFactory.getLogger(this.getClass());
4845

49-
public static Model model;
46+
private Model model;
5047
private Controller controller;
5148

52-
public static ProjectRepository projectRepository;
53-
54-
public static WorkRepository workRepository;
55-
public static SettingsRepository settingsRepository;
56-
5749
@Override
5850
public void init() throws Exception {
5951
springContext = SpringApplication.run(Main.class);
52+
// TODO test if everywhere is used the same model
53+
model = springContext.getBean(Model.class);
54+
controller = springContext.getBean(Controller.class);
6055
}
6156

6257
@Override
6358
public void start(final Stage primaryStage) throws Exception {
6459
stage = primaryStage;
6560

66-
Log.debug("Reading configuration");
67-
model = springContext.getBean(Model.class);
68-
69-
projectRepository = springContext.getBean(ProjectRepository.class);
70-
workRepository = springContext.getBean(WorkRepository.class);
71-
settingsRepository = springContext.getBean(SettingsRepository.class);
72-
// TODO how to do data migration for updates??
61+
LOG.debug("Reading configuration");
7362

7463
// TODO there should just be one instance of settings in the repo
75-
final List<Settings> settingsList = settingsRepository.findAll();
64+
final List<Settings> settingsList = model.settingsRepository.findAll();
7665
final Settings settings;
7766
if (settingsList.isEmpty()) {
7867
settings = new Settings();
@@ -85,7 +74,7 @@ public void start(final Stage primaryStage) throws Exception {
8574
settings.setHoverFontColor(model.hoverFontColor.get());
8675
settings.setUseHotkey(false);
8776
settings.setDisplayProjectsRight(false);
88-
settingsRepository.save(settings);
77+
model.settingsRepository.save(settings);
8978
} else {
9079
settings = settingsList.get(0);
9180
}
@@ -98,19 +87,19 @@ public void start(final Stage primaryStage) throws Exception {
9887
model.useHotkey.set(settings.isUseHotkey());
9988
model.displayProjectsRight.set(settings.isDisplayProjectsRight());
10089

101-
final List<Work> todaysWorkItems = workRepository.findByCreationDate(LocalDate.now());
102-
Log.info("Found {} past work items", todaysWorkItems.size());
90+
final List<Work> todaysWorkItems = model.workRepository.findByCreationDate(LocalDate.now());
91+
LOG.info("Found {} past work items", todaysWorkItems.size());
10392
model.pastWorkItems.addAll(todaysWorkItems);
10493

10594
// createProjects();
10695

107-
final List<Project> projects = projectRepository.findAll();
96+
final List<Project> projects = model.projectRepository.findAll();
10897

109-
Log.debug("Found '{}' projects", projects.size());
98+
LOG.debug("Found '{}' projects", projects.size());
11099
if (projects.isEmpty()) {
111-
Log.info("Adding default project");
100+
LOG.info("Adding default project");
112101
projects.add(model.DEFAULT_PROJECT);
113-
projectRepository.save(model.DEFAULT_PROJECT);
102+
model.projectRepository.save(model.DEFAULT_PROJECT);
114103
}
115104

116105
model.allProjects.addAll(projects);
@@ -121,7 +110,7 @@ public void start(final Stage primaryStage) throws Exception {
121110
final Optional<Project> findAny = projects.stream().filter(p -> p.isDefault()).findAny();
122111
if (findAny.isPresent()) {
123112
model.idleProject = findAny.get();
124-
Log.debug("Using project '{}' as default project.", model.idleProject);
113+
LOG.debug("Using project '{}' as default project.", model.idleProject);
125114
}
126115

127116
primaryStage.setOnHiding((we) -> {
@@ -185,7 +174,7 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
185174
}
186175

187176
private void shutdown() {
188-
Log.info("Shutting down");
177+
LOG.info("Shutting down");
189178
// viewController.changeProject(model.idleProject, 0); // TODO not so nice (view has the comments for the current
190179
// // job)
191180
controller.shutdown();
@@ -216,7 +205,7 @@ private void initialiseUI(final Stage primaryStage) {
216205
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
217206
@Override
218207
public void handle(final WindowEvent event) {
219-
Log.info("On close request");
208+
LOG.info("On close request");
220209
// shutdown();
221210
// Platform.exit();
222211
}
@@ -226,14 +215,14 @@ public void handle(final WindowEvent event) {
226215
// Give the controller access to the main app.
227216
viewController.setStage(primaryStage);
228217

229-
controller = springContext.getBean(Controller.class, model);
218+
// controller = springContext.getBean(Controller.class, model, new RealDateProvider());
230219

231220
viewController.setController(controller, model);
232221

233222
primaryStage.show();
234223

235224
} catch (final Exception e) {
236-
Log.error("Error: " + e.toString(), e);
225+
LOG.error("Error: " + e.toString(), e);
237226
e.printStackTrace();
238227
}
239228
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package de.doubleslash.keeptime.common;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
6+
public interface DateProvider {
7+
8+
LocalDateTime dateTimeNow();
9+
10+
LocalDate dateNow();
11+
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package de.doubleslash.keeptime.common;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
6+
import org.springframework.stereotype.Component;
7+
8+
@Component
9+
public class RealDateProvider implements DateProvider {
10+
@Override
11+
public LocalDateTime dateTimeNow() {
12+
return LocalDateTime.now();
13+
}
14+
15+
@Override
16+
public LocalDate dateNow() {
17+
return LocalDate.now();
18+
}
19+
}

src/main/java/de/doubleslash/keeptime/controller/Controller.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010

1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
13+
import org.springframework.beans.factory.annotation.Autowired;
1314
import org.springframework.stereotype.Service;
1415

15-
import de.doubleslash.keeptime.Main;
1616
import de.doubleslash.keeptime.common.DateFormatter;
17+
import de.doubleslash.keeptime.common.DateProvider;
1718
import de.doubleslash.keeptime.model.Model;
1819
import de.doubleslash.keeptime.model.Project;
1920
import de.doubleslash.keeptime.model.Settings;
@@ -27,9 +28,12 @@ public class Controller {
2728

2829
private final Model model;
2930

30-
public Controller(final Model model) {
31-
this.model = model;
31+
private final DateProvider dateProvider;
3232

33+
@Autowired
34+
public Controller(final Model model, final DateProvider dateProvider) {
35+
this.model = model;
36+
this.dateProvider = dateProvider;
3337
}
3438

3539
public void changeProject(final Project newProject) {
@@ -41,7 +45,7 @@ public void changeProject(final Project newProject, final long minusSeconds) {
4145

4246
final Work currentWork = model.activeWorkItem.get();
4347

44-
final LocalDateTime now = LocalDateTime.now().minusSeconds(minusSeconds);
48+
final LocalDateTime now = dateProvider.dateTimeNow().minusSeconds(minusSeconds);
4549
if (currentWork != null) {
4650
currentWork.setEndTime(now);
4751
// currentWork.setNotes(notes);
@@ -55,13 +59,16 @@ public void changeProject(final Project newProject, final long minusSeconds) {
5559
currentWork.getEndTime(), time, currentWork.getProject().getName(), currentWork.getNotes());
5660

5761
// Save in db
58-
Main.workRepository.save(currentWork);
62+
model.workRepository.save(currentWork);
5963
}
6064

6165
// Start new work
62-
final Work work = new Work(now, now.plusSeconds(minusSeconds), newProject, "");
66+
final Work work = new Work(dateProvider.dateNow(), now, now.plusSeconds(minusSeconds), newProject, "");
6367
model.pastWorkItems.add(work);
64-
68+
if (currentWork != null && !currentWork.getCreationDate().isEqual(work.getCreationDate())) {
69+
Log.info("Removing projects from the other daya then today from list.");
70+
model.pastWorkItems.removeIf(w -> !w.getCreationDate().isEqual(work.getCreationDate()));
71+
}
6572
model.activeWorkItem.set(work);
6673
}
6774

@@ -74,14 +81,14 @@ public void addNewProject(final String projectName, final boolean isWork, final
7481
final List<Project> changedProjects = resortProjectIndexes(model.availableProjects, project,
7582
model.availableProjects.size(), index);
7683
changedProjects.add(project);
77-
Main.projectRepository.saveAll(changedProjects);
84+
model.projectRepository.saveAll(changedProjects);
7885
}
7986

8087
public void updateSettings(final Color hoverBackgroundColor, final Color hoverFontColor,
8188
final Color defaultBackgroundColor, final Color defaultFontColor, final Color taskBarColor,
8289
final boolean useHotkey, final boolean displayProjectsRight) {
8390
// TODO create holder for all the properties (or reuse Settings.class?)
84-
final Settings settings = Main.settingsRepository.findAll().get(0);
91+
final Settings settings = model.settingsRepository.findAll().get(0);
8592
settings.setTaskBarColor(taskBarColor);
8693

8794
settings.setDefaultBackgroundColor(defaultBackgroundColor);
@@ -92,7 +99,7 @@ public void updateSettings(final Color hoverBackgroundColor, final Color hoverFo
9299
settings.setUseHotkey(useHotkey);
93100
settings.setDisplayProjectsRight(displayProjectsRight);
94101

95-
Main.settingsRepository.save(settings);
102+
model.settingsRepository.save(settings);
96103

97104
model.defaultBackgroundColor.set(settings.getDefaultBackgroundColor());
98105
model.defaultFontColor.set(settings.getDefaultFontColor());
@@ -125,7 +132,7 @@ public void deleteProject(final Project p) {
125132
final List<Project> changedProjects = adaptProjectIndexesAfterRemoving(model.availableProjects, indexToRemove);
126133

127134
changedProjects.add(p);
128-
Main.projectRepository.saveAll(changedProjects);
135+
model.projectRepository.saveAll(changedProjects);
129136
}
130137

131138
public void editProject(final Project p, final String newName, final Color newColor, final boolean isWork,
@@ -142,7 +149,7 @@ public void editProject(final Project p, final String newName, final Color newCo
142149
changedProjects.add(p);
143150

144151
// save all projects which changed index
145-
Main.projectRepository.saveAll(changedProjects);
152+
model.projectRepository.saveAll(changedProjects);
146153
}
147154

148155
/**
@@ -221,8 +228,7 @@ List<Project> adaptProjectIndexesAfterRemoving(final List<Project> originalList,
221228
public void setComment(final String notes) {
222229
final Work work = model.activeWorkItem.get();
223230
work.setNotes(notes);
224-
// TODO when to save to repo??
225-
// Main.workRepository.save(work);
231+
// TODO when to save to repo?
226232
}
227233

228234
/**

src/main/java/de/doubleslash/keeptime/model/Model.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
import java.util.Comparator;
44

5+
import org.springframework.beans.factory.annotation.Autowired;
56
import org.springframework.stereotype.Component;
67

8+
import de.doubleslash.keeptime.model.repos.ProjectRepository;
9+
import de.doubleslash.keeptime.model.repos.SettingsRepository;
10+
import de.doubleslash.keeptime.model.repos.WorkRepository;
711
import javafx.beans.property.ObjectProperty;
812
import javafx.beans.property.SimpleObjectProperty;
913
import javafx.collections.FXCollections;
@@ -13,6 +17,19 @@
1317

1418
@Component
1519
public class Model {
20+
public ProjectRepository projectRepository;
21+
public WorkRepository workRepository;
22+
public SettingsRepository settingsRepository;
23+
24+
@Autowired
25+
public Model(final ProjectRepository projectRepository, final WorkRepository workRepository,
26+
final SettingsRepository settingsRepository) {
27+
super();
28+
this.projectRepository = projectRepository;
29+
this.workRepository = workRepository;
30+
this.settingsRepository = settingsRepository;
31+
}
32+
1633
public static final Color originalHoverBackgroundColor = new Color(54 / 255., 143 / 255., 179 / 255., .1);
1734
public static final Color originalHoverFontColor = Color.BLACK;
1835
public static final Color originalDefaultBackgroundColor = new Color(54 / 255., 143 / 255., 179 / 255., 0.01);

src/main/java/de/doubleslash/keeptime/model/Work.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ public class Work {
3131

3232
public Work() {}
3333

34-
public Work(final LocalDateTime startTime, final LocalDateTime endTime, final Project project, final String notes) {
34+
public Work(final LocalDate creationDate, final LocalDateTime startTime, final LocalDateTime endTime,
35+
final Project project, final String notes) {
3536
super();
36-
this.creationDate = LocalDate.now();
37+
this.creationDate = creationDate;
3738
this.startTime = startTime;
3839
this.endTime = endTime;
3940
this.project = project;

0 commit comments

Comments
 (0)