Há alguns dias coloquei um post que explicava um pouco do funcionamento de bancos de dados orientados a objetos. Hoje vou colocar o pequeno projeto que desenvolvi em Java, na segunda unidade da disciplina Laboratório em Banco de Dados, e utiliza o db4o.

O estudo de caso, modelo de dados e funcionalidades foram retirados do material do prof. Fábio Soares. Qualquer uso do material deve ser reportado a ele, através do email fabsoasilva em yahoo ponto com ponto br.

Estudo de caso:

Este estudo de caso propõe a implementação de um sistema para controlar, de forma simples, a agenda de compromissos dos funcionários de uma empresa. Para isso, o sistema deve basicamente permitir aos seus usuários armazenar os dados de seus contatos, bem como sua agenda de compromissos.
O sistema deve permitir que os vários usuários possam utilizar os seus recursos para controlar sua agenda particular, sendo que os contatos cadastrados podem ser compartilhados entre eles. Uma funcionalidade importantíssima para o sistema é a validação do choque de horários dos compromissos agendados para os vários funcionários ou contatos.
Para garantir privacidade, cada usuário deve possuir uma senha que lhe permitirá acessar o sistema. Cada usuário pode ser do tipo “Administrador”, que pode criar outros usuários, ou “Normal”, que apenas possui acesso aos recursos da agenda e dos contatos.
Os contatos cadastrados pelo sistema podem ser de dois tipos: empresas ou pessoas físicas. Cada usuário tem associado a ele o seu conjunto particular de contatos. Não há restrição quanto ao fato de um contato está associado a mais de um usuário.
Além de armazenar os contatos, cada usuário poderá agendar os seus compromissos no sistema. Se o compromisso for vinculado a um ou mais contatos, o sistema deve garantir que todos eles pertencem ao conjunto de contatos do usuário.

O modelo proposto para o diagrama de classes foi o seguinte (clique na imagem para ampliá-la):

Além disso, as funcionalidades a seguir tiveram que ser implementadas:

  • Listagem dos compromissos de um usuário em uma determinada data;
  • Listagem dos contatos empresariais de um usuário;
  • Listagem de todos os participantes de uma determinada reunião;
  • Listagem da quantidade de compromissos de um usuário em cada dia de um mês passado como parâmetro.

A título de exemplo, segue a implementação da classe Usuario:

package br.unit.bd.modelo;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;

/**
 *
 * @author junior
 */

public class Usuario extends Pessoa {

    private String tipo;
    private String senha;
    private HashSet<contato> contatos;
    private HashSet<compromisso> agenda;

    public Usuario(Long codigo, Long cpf, String tipo, String senha) {
        super(codigo, cpf);

        this.tipo = tipo;
        this.senha = senha;
        this.contatos = new HashSet<contato>();
        this.agenda = new HashSet<compromisso>();
    }

    public String getTipo() {
        return this.tipo;
    }

    public String getSenha() {
        return this.senha;
    }

    public void setUsuario(String tipo, String senha) {
        if (tipo != null) {
            this.tipo = tipo;
        }

        if (senha != null) {
            this.senha = senha;
        }
    }

    public boolean addContato(Contato contato) {
        return this.contatos.add(contato);
    }

    public boolean delContato(Contato contato) {
        return this.contatos.remove(contato);
    }

    public Vector<contato> getContatos() {
        boolean inicio = true;
        Vector</contato><contato> resultado = null;
        Iterator</contato><contato> iterador = this.contatos.iterator();

        while (iterador.hasNext()) {
            if (inicio) {
                inicio = false;
                resultado = new Vector</contato><contato>();
            }
            resultado.add(iterador.next());
        }

        return resultado;
    }

    public void clrContatos() {
        this.contatos.clear();
    }

    public boolean addCompromisso(Compromisso compromisso) {
        return this.agenda.add(compromisso);
    }

    public boolean delCompromisso(Compromisso compromisso) {
        return this.agenda.remove(compromisso);
    }

    public Vector<compromisso> getAgenda() {
        boolean inicio = true;
        Vector</compromisso><compromisso> resultado = null;
        Iterator</compromisso><compromisso> iterador = this.agenda.iterator();

        while (iterador.hasNext()) {
            if (inicio) {
                inicio = false;
                resultado = new Vector</compromisso><compromisso>();
            }
            resultado.add(iterador.next());
        }

        return resultado;
    }

    public void clrAgenda() {
        this.agenda.clear();
    }

    @Override
    public String toString() {
        String cont = "", compromissos = "", saida = "";
        Vector listaContatos = getContatos(), listaCompromissos = getAgenda();

        if (listaContatos != null) {
            for (int i = 0; i < listaContatos.size(); i++) {
                cont += listaContatos.get(i);
            }
            if (!cont.equals("")) {
                saida += "\n\nContatos:\n\n" + cont;
            }
        }

        if (listaCompromissos != null) {
            for (int i = 0; i < listaCompromissos.size(); i++) {
                compromissos += listaCompromissos.get(i);
            }

            if (!compromissos.equals("")) {
                saida += "\n\nCompromissos:\n\n" + compromissos;
            }
        }

        return super.toString() + "\n" +
                "Tipo     : " + this.tipo + "\n" +
                "Senha    : " + this.senha +
                saida;
    }
}

O desenvolvimento de uma interface gráfica para cadastro/pesquisa/exclusão e emissão de relatórios não foi uma exigência do projeto. Foi realizada apenas a implementação dos métodos necessários para as funcionalidades descritas acima e uma classe que executasse tais métodos, comprovando o funcionamento correto dos mesmos. Esta classe se chama br.unit.bd.App.

O código fonte do projeto, desenvolvido no Netbeans 6.1, se encontra em http://repositorio.zaeel.org/projetos/ProjetoLab.tar.gz.

Sugestões, críticas e quaisquer mensagens são bem-vindas.

Veja também