/** * Copyright [2014] [Christian Loehnert] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.ks.idnadrev.overview; import de.ks.datasource.DataSource; import de.ks.fxcontrols.weekview.WeekHelper; import de.ks.idnadrev.entity.Context; import de.ks.idnadrev.entity.Task; import de.ks.persistence.PersistentWork; import de.ks.reflection.PropertyPath; import de.ks.scheduler.Schedule; import javax.persistence.EntityManager; import javax.persistence.criteria.*; import java.time.DayOfWeek; import java.time.LocalDate; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; public class OverviewDS implements DataSource<OverviewModel> { protected static final String KEY_SCHEDULE = PropertyPath.property(Task.class, t -> t.getSchedule()); protected static final String KEY_PROPOSEDWEEK = PropertyPath.property(Schedule.class, t -> t.getProposedWeek()); protected static final String KEY_PROPOSEDYEAR = PropertyPath.property(Schedule.class, t -> t.getProposedYear()); protected static final String KEY_SCHEDULEDDATE = PropertyPath.property(Schedule.class, t -> t.getScheduledDate()); @Override public OverviewModel loadModel(Consumer<OverviewModel> furtherProcessing) { return PersistentWork.read(em -> { OverviewModel model = new OverviewModel(); List<Context> contexts = PersistentWork.from(Context.class); model.getContexts().addAll(contexts); List<Task> scheduled = getScheduledTasks(em, LocalDate.now()); model.getScheduledTasks().addAll(scheduled); List<Task> proposedTasks = getProposedTasks(em, LocalDate.now()); model.getProposedTasks().addAll(proposedTasks); return model; }); } protected List<Task> getProposedTasks(EntityManager em, LocalDate now) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Task> query = builder.createQuery(Task.class); Root<Task> root = query.from(Task.class); Path<Schedule> schedule = root.get(KEY_SCHEDULE); WeekHelper helper = new WeekHelper(); int week = helper.getWeek(now); int year = now.getYear(); query.select(root); Predicate correctYear = builder.equal(schedule.get(KEY_PROPOSEDYEAR), year); Predicate correctWeek = builder.equal(schedule.get(KEY_PROPOSEDWEEK), week); query.where(correctWeek, correctYear); List<Task> results = em.createQuery(query).getResultList(); List<Task> retval = results.stream().filter(r -> !r.isFinished()).filter(t -> { DayOfWeek proposedWeekDay = t.getSchedule().getProposedWeekDay(); if (proposedWeekDay != null) { return proposedWeekDay.equals(now.getDayOfWeek()); } return true; }).collect(Collectors.toList()); Collections.sort(retval, Comparator.comparing(t -> t.getRemainingTime())); return retval; } protected List<Task> getScheduledTasks(EntityManager em, LocalDate now) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Task> query = builder.createQuery(Task.class); Root<Task> root = query.from(Task.class); Path<Schedule> schedule = root.get(KEY_SCHEDULE); WeekHelper helper = new WeekHelper(); query.select(root); Predicate correctDate = builder.equal(schedule.get(KEY_SCHEDULEDDATE), now); query.where(correctDate); List<Task> results = em.createQuery(query).getResultList(); List<Task> retval = results.stream().filter(r -> !r.isFinished()).collect(Collectors.toList()); return retval; } @Override public void saveModel(OverviewModel model, Consumer<OverviewModel> beforeSaving) { } }