agendapoo.Control.ControlAtividade.java Source code

Java tutorial

Introduction

Here is the source code for agendapoo.Control.ControlAtividade.java

Source

/*
 * 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;
    }

}