Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package agendapoo.Control; import agendapoo.DAO.ARQUIVO.AtividadeDAOarquivo; import agendapoo.DAO.JDBC.AtividadeDAOjdbc; import agendapoo.DAO.IAtividadeDAO; import agendapoo.Exceptions.InvalidTimeRangeException; import agendapoo.Exceptions.TimeInterferenceException; import agendapoo.Model.Atividade; import agendapoo.Model.TipoAtividade; import agendapoo.Model.Usuario; import java.io.IOException; import java.sql.SQLException; import java.time.LocalDate; import java.time.LocalTime; import java.time.Period; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.mail.EmailException; /** * Classe que ter a implementao de todos os mtodos de AtividadeController e mais alguns que se faro necessrio para * operaes com Atividade. * EmailSender - Interface com o mtodo de enviar Email * IAtividadeDAO - Interface com os mtodos para manipulao de Atividades no banco de dados ou arquivo * @author kieckegard */ public class ControlAtividade implements AtividadeController { private final EmailSender sender; private final IAtividadeDAO dao; public ControlAtividade() { dao = new AtividadeDAOarquivo(); sender = new ControlEmail(); } /** * Mtodo responsvel por construir um objeto de Atividade e logo em seguida, Cadastra-lo no banco, seja usando arquivo ou um sgbd. * @param descricao - A descrio da atividade * @param local - O local em que a atividade ser realizada * @param data - A data que a atividade ser realizada * @param horaInicio - O horrio que a atividade comea. * @param horaFim - O horrio que a atividade termina. * @param convidados - Os convidados que participaro da atividade e sero notificados por e-mail sobre a atividade. * @param tipo - O tipo da atividade, podendo ser PROFISSIONAL, ACADEMICO ou PESSOAL. * @param u - O Usurio que est cadastrando a atividade. * @throws SQLException * @throws IOException * @throws ClassNotFoundException * @throws InvalidTimeRangeException - A exceo lanada caso o horrio inicial da atividade seja maior que o horrio final. * @throws TimeInterferenceException - A exceo lanado caso o horrio da atividade entre em conflito com outras atividades cadastradas. * @throws EmailException - A exceo lanada caso no consiga enviar os e-mails para os convidados da atividade. */ @Override public void cadastraAtividade(String descricao, String local, String data, String horaInicio, String horaFim, List<String> convidados, TipoAtividade tipo, Usuario u) throws SQLException, IOException, ClassNotFoundException, TimeInterferenceException, InvalidTimeRangeException, EmailException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy"); LocalDate data_aux = LocalDate.parse(data, dtf); LocalTime start = LocalTime.parse(horaInicio); LocalTime end = LocalTime.parse(horaFim); if (start.compareTo(end) == 0) throw new TimeInterferenceException("U, sua atividade vai durar 0 minutos? Por favor, ajeita isso!"); if (!isTimeRangeValid(start, end)) throw new InvalidTimeRangeException( "U, sua atividade vai durar um tempo negativo? Por favor, ajeita isso!"); if (isValidTimeByUser(data_aux, start, end, u)) { Atividade a = new Atividade(descricao, local, data_aux, start, end, tipo, u); a.setConvidados(convidados); if (!convidados.isEmpty()) sender.sendEmail(a, a.getUsuario(), TipoEmail.CREATE); dao.add(a); } else throw new TimeInterferenceException( "Houve um choque de horrio com outras atividades cadastradas. \nPor favor, selecione um outro horrio!"); } /** * Remove a atividade passada por parmetro do Banco de dados ou arquivo. * @param atividade - Objeto de Atividade * @throws SQLException * @throws IOException * @throws ClassNotFoundException * @throws EmailException - A exceo lanada caso o controlador no consiga enviar a mensagem aos convidados avisando sobre a remoro da atividade. */ @Override public void deletaAtividade(Atividade atividade) throws SQLException, IOException, ClassNotFoundException, EmailException { if (!atividade.getConvidados().isEmpty()) sender.sendEmail(atividade, atividade.getUsuario(), TipoEmail.DELETE); dao.delete(atividade); } /** * Atualiza os atributos de atividade no banco de dados ou arquivo. * @param atividade - Objeto de Atividade * @throws SQLException * @throws IOException * @throws ClassNotFoundException * @throws InvalidTimeRangeException - A exceo lanada caso o horrio inicial da atividade seja maior que o horrio final. * @throws TimeInterferenceException - A exceo lanado caso o horrio da atividade entre em conflito com outras atividades cadastradas. * @throws EmailException - A exceo lanada caso no consiga enviar os e-mails para os convidados avisando sobre a atualizao da atividade. */ @Override public void atualizaAtividade(Atividade atividade) throws SQLException, IOException, ClassNotFoundException, TimeInterferenceException, EmailException, InvalidTimeRangeException { if (atividade.getHoraInicio().compareTo(atividade.getHoraFim()) == 0) throw new TimeInterferenceException("U, sua atividade vai durar 0 minutos? Por favor, ajeita isso!"); if (!isTimeRangeValid(atividade.getHoraInicio(), atividade.getHoraFim())) throw new InvalidTimeRangeException( "U, sua atividade vai durar um tempo negativo? Por favor, ajeita isso!"); if (isValidTimeUpdate(atividade)) { if (!atividade.getConvidados().isEmpty()) sender.sendEmail(atividade, atividade.getUsuario(), TipoEmail.UPDATE); dao.update(atividade); } else throw new TimeInterferenceException( "Houve um choque de horrio com outras atividades cadastradas. \nPor favor, selecione um outro horrio!"); } /** * Verifica se o horrio inserido aps uma atualizao vlido, ou seja, se entra em conflito * com outras atividades, caso entre em conflito com outras atividades retornar False, caso contrrio, * True, Como uma atualizao nesse mtodo a verificao ignorar o horrio que tiver no banco dessa mesma atividade. * @param current - Atividade que foi atualizada e que ter seu horrio verificado. * @return - valor booleano indicando se o horrio vlido ou no. * @throws SQLException * @throws IOException * @throws ClassNotFoundException */ private boolean isValidTimeUpdate(Atividade current) throws SQLException, IOException, ClassNotFoundException { boolean isValid = false; List<Atividade> atividades = dao.list(current.getUsuario()); List<Atividade> sameDay = new ArrayList<>(); LocalTime start = current.getHoraInicio(); LocalTime end = current.getHoraFim(); atividades.stream().forEach((a) -> { Period p = Period.between(a.getData(), current.getData()); if ((p.getDays() == 0) && (!a.getId().equals(current.getId()))) { sameDay.add(a); } }); if (!sameDay.isEmpty()) { for (Atividade a : sameDay) if ((start.isBefore(a.getHoraInicio()) && end.isBefore(a.getHoraInicio())) || (start.isAfter(a.getHoraFim()) && end.isAfter(a.getHoraFim()))) isValid = true; else { isValid = false; break; } return isValid; } return true; } /** * Verifica se o horrio inserido aps uma insero vlido, ou seja, se entra em conflito * com outras atividades, caso entre em conflito com outras atividades retornar False, caso contrrio, * @param start - LocalTime contendo o horrio inicial da atividade * @param end - LocalTime contendo o horrio final da atividade * @return - valor booleano indicando se o horrio inicial maior ou no que o horrio final. * @throws InvalidTimeRangeException */ private boolean isTimeRangeValid(LocalTime start, LocalTime end) throws InvalidTimeRangeException { return !start.isAfter(end); } /** * Verifica se o horrio inserido aps uma insero vlido, ou seja, se entra em conflito * com outras atividades, caso entre em conflito com outras atividades retornar False, caso contrrio, * retornar True. * @param data - LocalDate contendo a data da atividade * @param start - LocalTime contendo o horrio inicial da atividade * @param end - LocalTime contendo o horrio final da atividade * @param u - Usurio que est adicionando a atividade (faz-se necessrio por verificar se o horrio vlido apenas considerando as atividades * daquele usurio) * @return - valor booleano indicando se o horrio definido para atividade vlido ou no. * @throws SQLException * @throws IOException * @throws ClassNotFoundException */ private boolean isValidTimeByUser(LocalDate data, LocalTime start, LocalTime end, Usuario u) throws SQLException, IOException, ClassNotFoundException { boolean isValid = false; List<Atividade> atividades = dao.list(u); List<Atividade> sameDay = new ArrayList<>(); atividades.stream().forEach((a) -> { Period p = Period.between(a.getData(), data); if (p.getDays() == 0) { sameDay.add(a); } }); if (!sameDay.isEmpty()) { for (Atividade a : sameDay) if ((start.isBefore(a.getHoraInicio()) && end.isBefore(a.getHoraInicio())) || (start.isAfter(a.getHoraFim()) && end.isAfter(a.getHoraFim()))) isValid = true; else { isValid = false; break; } return isValid; } return true; } /** * Procura uma atividade no banco de dados ou arquivo que contenha a Id passada por parmetro, o usurio faz-se necessrio para poder * filtrar logo pelas atividades do usurio e em seguida procurar na lista de atividades do usurio a Id passada por parmetro. * @param usuario - usuario logado no sistema * @param id - identificao da atividade * @return - Objeto de Atividade ou nulo, caso no encontre nenhuma atividade com o Id especificado. * @throws SQLException * @throws IOException * @throws ClassNotFoundException */ public Atividade getAtividadeById(Usuario usuario, String id) throws SQLException, IOException, ClassNotFoundException { List<Atividade> atividades = dao.list(usuario); for (Atividade a : atividades) { if (a.getId().equals(id)) return a; } return null; } /** * Retorna uma Lista contendo todas as atividades cadastradas no banco de dados ou arquivo referente ao Usurio passado por parmetro. * @param u * @return Lista de Objetos Atividade * @throws SQLException * @throws IOException * @throws ClassNotFoundException */ @Override public List<Atividade> getAtividadesByUser(Usuario u) throws SQLException, IOException, ClassNotFoundException { List<Atividade> list = dao.list(u); Collections.sort(list); return list; } }