de.tshw.worktracker.controller.WorkTrackerController.java Source code

Java tutorial

Introduction

Here is the source code for de.tshw.worktracker.controller.WorkTrackerController.java

Source

/******************************************************************************
 * This file is part of WorkTracker, Copyright (c) 2015 Till Helge Helwig.    *
 *                                                                            *
 * WorkTracker is distributed under the MIT License, so feel free to do       *
 * whatever you want with application or code. You may notify the author      *
 * about bugs via http://github.com/Tar-Minyatur/WorkTracker/issues, but      *
 * be aware that he is not (legally) obligated to provide support. You are    *
 * using this software at your own risk.                                      *
 ******************************************************************************/

package de.tshw.worktracker.controller;

import de.tshw.worktracker.dao.ProjectDAO;
import de.tshw.worktracker.dao.WorkLogEntryDAO;
import de.tshw.worktracker.model.Project;
import de.tshw.worktracker.model.WorkLogEntry;
import de.tshw.worktracker.model.WorkTracker;
import de.tshw.worktracker.view.WorkTrackerView;
import org.joda.time.LocalDate;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class WorkTrackerController {

    private WorkTracker workTracker;
    private ProjectDAO projectDAO;
    private WorkLogEntryDAO workLogEntryDAO;
    private boolean stopTimer;
    private Set<WorkTrackerView> views;

    public WorkTrackerController(WorkTracker workTracker, ProjectDAO projectDAO, WorkLogEntryDAO workLogEntryDAO) {
        this.workTracker = workTracker;
        this.projectDAO = projectDAO;
        this.workLogEntryDAO = workLogEntryDAO;
        this.views = new HashSet<>();
        findProjects();
        findTodaysEntries();
        findUnfinishedEntries();
        startTimer();
    }

    private void findProjects() {
        projectDAO.getAll().forEach(workTracker::addProject);
    }

    private void findTodaysEntries() {
        List<WorkLogEntry> entries = workLogEntryDAO.findByDay(LocalDate.now());
        entries.forEach(workTracker::addWorkLogEntry);

    }

    private void findUnfinishedEntries() {
        List<WorkLogEntry> entries = workLogEntryDAO.findWithoutEndDate();
        entries.forEach(workTracker::addUnfinishedLogEntries);
    }

    private void startTimer() {
        this.stopTimer = false;
        new Thread(() -> {
            try {
                while (!stopTimer) {
                    Thread.sleep(1000);
                    this.tick();
                }
            } catch (InterruptedException ex) {
                System.err.println("Timer thread was interrupted while sleeping. (Error: " + ex.getMessage() + ")");
            }
        }).start();
    }

    void tick() {
        for (WorkTrackerView view : views) {
            view.update(workTracker);
        }
    }

    public Project addProject(String name) {
        Project project = projectDAO.findByName(name);
        if (project == null) {
            project = new Project(name);
            projectDAO.save(project);
        }
        workTracker.addProject(project);
        tick();
        return project;
    }

    public void switchProject(Project project) {
        WorkLogEntry entry = workTracker.getCurrentLogEntry();
        if (project != entry.getProject()) {
            entry.stop();
            if (entry.getTimeElapsed().getSeconds() < 1) {
                workLogEntryDAO.delete(entry);
                workTracker.removeWorkLogEntry(entry);
            } else {
                workLogEntryDAO.save(entry);
            }
            if (!workTracker.getProjects().contains(project)) {
                workTracker.addProject(project);
            }
            entry = new WorkLogEntry(project);
            workLogEntryDAO.save(entry);
            workTracker.setCurrentLogEntry(entry);
        }
        tick();
    }

    public void changeComment(String comment) {
        workTracker.getCurrentLogEntry().setComment(comment);
        workLogEntryDAO.save(workTracker.getCurrentLogEntry());
        tick();
    }

    public void registerView(WorkTrackerView view) {
        views.add(view);
    }

    public void quit() {
        stopTimer = true;
        WorkLogEntry currentLogEntry = workTracker.getCurrentLogEntry();
        currentLogEntry.stop();
        workLogEntryDAO.save(currentLogEntry);
    }
}