package com.encora; // Uncomment this for using a database instead. //public interface ToDosRepository extends JpaRepository{ // // Get to dos list filtered. // public List findAllWithFilter(String name, String priority, String done) throws Exception { // // Use Queries to filter your to dos. // return null; // } //} // Comment ALL of this if using a database. import org.springframework.data.domain.Example; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.FluentQuery; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; public class ToDosRepository implements JpaRepository { Integer lastId; List todos; String currentSorting; List filteredToDos; List currentFilters; // Constructor public ToDosRepository() { this.lastId = 0; this.todos = new ArrayList<>(); this.currentSorting = "id"; this.filteredToDos = new ArrayList<>(); this.currentFilters = List.of("", "All", "All"); } // Return all to dos. @Override public List findAll() { return this.todos; } // Return all to dos and sorted. @Override public List findAll(Sort sort) { List sortedList = new ArrayList<>(this.todos); try { Comparator comparator = this.getToDoComparator(sort); Collections.sort(sortedList, comparator); } catch (Exception e) { throw new RuntimeException(e); } return sortedList; } // Save new element. @Override public S save(S entity) { if (entity.getId() != null) { // If the entity has an ID, search for it in our list of to dos and // replace it. ToDos selectedToDo; for (int index = 0; index < this.todos.size(); index++) { selectedToDo = this.todos.get(index); if (Objects.equals(selectedToDo.getId(), entity.getId())) { this.todos.set(index, entity); return null; } } } else { // If entity doesn't have an ID, assign it a new one. entity.setId(++this.lastId); } // If the ID couldn't be found or the entity didn't exist, append the // entity to our list. this.todos.add(entity); return null; } // Retrieve a to do. @Override public ToDos getById(Integer integer) { ToDos selectedToDo; for (int index = 0; index < this.todos.size(); index++) { selectedToDo = this.todos.get(index); if (Objects.equals(selectedToDo.getId(), integer)) { return selectedToDo; } } return null; } // Delete a to do. @Override public void deleteById(Integer integer) { ToDos selectedToDo; for (int index = 0; index < this.todos.size(); index++) { selectedToDo = this.todos.get(index); if (Objects.equals(selectedToDo.getId(), integer)) { this.todos.remove(index); break; } } } // Get to dos list filtered. public List findAllWithFilter(String name, String priority, String done) throws Exception { List filtered = new ArrayList<>(this.todos); if (name != null && !name.equals("")) { filtered = filtered.stream() .filter(todo -> todo.getText().contains(name)) .collect(Collectors.toList()); } if (priority != null && !priority.equalsIgnoreCase("all")) { filtered = filtered.stream() .filter(todo -> Objects.equals(String.valueOf(todo.getPriority()), priority)) .collect(Collectors.toList()); } if (done != null && !done.equalsIgnoreCase("all")) { switch (done) { case "Done": filtered = filtered.stream() .filter(ToDos::isDone) .collect(Collectors.toList()); break; case "Undone": filtered = filtered.stream() .filter(todo -> !todo.isDone()) .collect(Collectors.toList()); break; default: throw new Exception("Filtering not supported on 'done'."); } } return filtered; } private Comparator getToDoComparator(Sort sort) throws Exception { // Personal function. Creates a `Comparator` based on the `sort` // parameter. This is for us to successfully sort our List without the // need of a database. String sortString = sort.toString(); // <- '{field}: {order}' String[] sortCriteria = sortString.split(": "); String field = sortCriteria[0]; String order = sortCriteria[1]; Comparator comparator = null; switch (field) { case "Id": comparator = Comparator.comparing(ToDos::getId); break; case "Priority": comparator = Comparator.comparing(ToDos::getPriority); break; case "DueDate": comparator = Comparator.comparing(ToDos::getDueDate, Comparator.nullsLast(Comparator.naturalOrder())); break; default: throw new Exception("Field sorting not implemented."); } if (order.equalsIgnoreCase("desc")) { comparator = comparator.reversed(); } return comparator; } // Filter and then sort all of our to dos. public void refreshFilteredToDos(Sort sort, String name, String priority, String done) throws Exception { try { Comparator comparator = this.getToDoComparator(sort); this.filteredToDos = this.findAllWithFilter(name, priority, done); this.filteredToDos.sort(comparator); } catch (Exception e) { throw new RuntimeException(e); } } public List getFilteredToDos() { return this.filteredToDos; } public Double getAverageCompletingTime(String priority) { List recordedTimes = new ArrayList<>(); if (priority.equalsIgnoreCase("all")) { for (ToDos todo : this.todos) { if (!todo.isDone()) { continue; } recordedTimes.add( (double) (todo.getDoneDate().getTime() - todo.getCreationDate().getTime()) ); } } else { for (ToDos todo : this.todos) { if (!todo.isDone() || !Objects.equals(String.valueOf(todo.getPriority()), priority)) { continue; } recordedTimes.add( (double) (todo.getDoneDate().getTime() - todo.getCreationDate().getTime()) ); } } if (recordedTimes.size() == 0) { return (double) 0; } Double valuesSum = (double) 0; for (Double d : recordedTimes) { valuesSum += d; } return valuesSum / (double) recordedTimes.size(); } /* * N O T Y E T D E F I N E D . */ @Override public void flush() { } @Override public S saveAndFlush(S entity) { return null; } @Override public List saveAllAndFlush(Iterable entities) { return null; } @Override public void deleteAllInBatch(Iterable entities) { } @Override public void deleteAllByIdInBatch(Iterable integers) { } @Override public void deleteAllInBatch() { } @Override public ToDos getOne(Integer integer) { return null; } @Override public ToDos getReferenceById(Integer integer) { return null; } @Override public Optional findOne(Example example) { return Optional.empty(); } @Override public List findAll(Example example) { return null; } @Override public List findAll(Example example, Sort sort) { return null; } @Override public Page findAll(Example example, Pageable pageable) { return null; } @Override public long count(Example example) { return 0; } @Override public boolean exists(Example example) { return false; } @Override public R findBy(Example example, Function, R> queryFunction) { return null; } @Override public List saveAll(Iterable entities) { return null; } @Override public Optional findById(Integer integer) { return Optional.empty(); } @Override public boolean existsById(Integer integer) { return false; } @Override public List findAllById(Iterable integers) { return null; } @Override public long count() { return 0; } @Override public void delete(ToDos entity) { } @Override public void deleteAllById(Iterable integers) { } @Override public void deleteAll(Iterable entities) { } @Override public void deleteAll() { } @Override public Page findAll(Pageable pageable) { return null; } }