br.edu.ifes.bd2dao.cgt.Menu.java Source code

Java tutorial

Introduction

Here is the source code for br.edu.ifes.bd2dao.cgt.Menu.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 br.edu.ifes.bd2dao.cgt;

import br.edu.ifes.bd2dao.cdp.Aluno;
import br.edu.ifes.bd2dao.cdp.Disciplina;
import br.edu.ifes.bd2dao.cdp.Genero;
import br.edu.ifes.bd2dao.cdp.Matricula;
import br.edu.ifes.bd2dao.exceptions.IdNotFoundException;
import br.edu.ifes.bd2dao.util.DateValidator;
import br.edu.ifes.bd2dao.util.datafactory.AlunoData;
import br.edu.ifes.bd2dao.util.datafactory.DisciplinaData;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import org.fluttercode.datafactory.impl.DataFactory;
import org.springframework.beans.PropertyAccessor;
import org.springframework.beans.PropertyAccessorFactory;

/**
 *
 * @author aleao
 */
public class Menu {

    DateValidator dateValidator = new DateValidator();
    HashMap<String, String> messages = new HashMap<>();
    DataFactory df = new DataFactory();
    AlunoData alunoData = new AlunoData();
    DisciplinaData disciplinaData = new DisciplinaData();
    Matricula matricula = new Matricula();

    public Menu() {
        this.messages.put("CPF", "CPF: (xxx.xxx.xxx-xx)");
        this.messages.put("NOME", "Nome: ");
        this.messages.put("ID", "Id: ");
        this.messages.put("DATANASCIMENTO", "Data de Nascimento (dd/MM/yyyy):");
        this.messages.put("GENERO", "Genero (MASCULINO, FEMININO, OUTROS):");
        this.messages.put("PERIODO", "Perodo: (YYYY/S) : ");
        this.messages.put("PROFESSOR", "Professor: ");
        this.messages.put("VAGAS", "Vagas: ");

        this.messages.put("SUCESSO_INSERIR", "\n%1$s Inserido com sucesso\n");
        this.messages.put("SUCESSO_DELETAR", "\n%1$s Excluido com sucesso\n");
        this.messages.put("SUCESSO_ATUALIZAR", "\n%1$s Atualizado com sucesso\n");
        this.messages.put("INICIANDO_POPULACAO", "Iniciando Populao do Banco...\n");
        this.messages.put("ENCERRANDO_POPULACAO",
                "...Encerrando Populao do Banco\n\nBanco Populado com Sucesso!\n");
    }

    private void popularBanco() {
        System.out.println(this.messages.get("INICIANDO_POPULACAO"));
        alunoData.criaAlunoRandom(df, 10);
        disciplinaData.criaDisciplinaRandom(df, 10);
        matricula.matriculaAlunos();
        System.out.println(this.messages.get("ENCERRANDO_POPULACAO"));
    }

    private void imprimeMensagem(String objeto, String operacao) {
        operacao = operacao.toUpperCase();
        System.out.println(String.format(this.messages.get("SUCESSO_" + operacao), objeto));
    }

    public void load() {
        Scanner menuEntrada = new Scanner(System.in);
        int menu = -1;
        while (menu != 0) {
            System.out.println("1 - Cadastrar Aluno");
            System.out.println("2 - Atualizar Aluno");
            System.out.println("3 - Deletar Aluno");
            System.out.println("4 - Buscar alunos matriculados");
            System.out.println("5 - Listar todos os alunos");
            System.out.println("6 - Cadastrar Disciplina");
            System.out.println("7 - Listar Disciplinas");
            System.out.println("8 - Buscar Disciplina");
            System.out.println("9 - Disciplinas de um aluno");
            System.out.println("10 - Popular Banco");
            System.out.println("0 - Sair");
            menu = menuEntrada.nextInt();
            switch (menu) {
            case 1:
                new Aluno().inserir(lerAluno());
                imprimeMensagem("Aluno", "inserir");
                break;
            case 2:
                atualizarAluno();
                imprimeMensagem("Aluno", "atualizar");
                break;
            case 3:
                deletarAluno();
                imprimeMensagem("Aluno", "deletar");
                break;
            case 4:
                listarMatriculados();
                break;
            case 5:
                listarAlunos();
                break;
            case 6:
                new Disciplina().inserir(lerDisciplina());
                imprimeMensagem("Disciplina", "inserir");
                break;
            case 7:
                listar(buscarDisciplinas());
                break;
            case 8:
                System.out.println(selecionarDisciplina());
            case 9:
                listarDisciplinasDeUmAluno();
                break;
            case 10:
                popularBanco();
            }
        }
    }

    private void atualizarAluno() {
        Scanner sc = new Scanner(System.in);

        listarAlunos();

        System.out.println("\nInforme um ID:");
        int id = sc.nextInt();

        Aluno a = new Aluno().selecionar(new Long(id));

        Field fields[] = Aluno.class.getDeclaredFields();
        for (Field field : fields) {
            if (!field.getName().equals("id")) {
                System.out.println("Deseja atualizar o campo (" + field.getName().toUpperCase() + ") [n/s]?");
                String opt = sc.next().toUpperCase();
                if (opt.contains("S")) {
                    setValue(field.getName(), a);
                }
            }
        }

        try {
            a.atualizar(a);
        } catch (IdNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    //TODO: Melhore num FORK
    private Object scanSpecific(String fieldName, Scanner sc, Class c) throws NoSuchFieldException {

        Field field = c.getDeclaredField(fieldName);
        boolean valid = false;
        Object value = null;

        while (!valid) {
            System.out.println(this.messages.get(fieldName.toUpperCase()));
            String type = field.getType().getSimpleName();

            switch (type.toUpperCase()) {
            case "STRING":
                value = sc.nextLine();
                valid = true;
                break;
            case "GENERO":
                String genero = sc.nextLine().toUpperCase();
                valid = Genero.exists(genero);
                if (valid)
                    value = Genero.valueOf(genero);
                break;
            case "CALENDAR":
                String date = sc.nextLine();
                valid = this.dateValidator.validate(date);
                if (valid)
                    value = convertStringToCalendar(date);
                break;
            case "INT":
                value = sc.nextInt();
                valid = true;
                break;
            }
        }

        return value;
    }

    private void setValue(String field, Object objeto) {

        PropertyAccessor propAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objeto);
        Scanner sc = new Scanner(System.in);

        Object valorModificado = null;
        Object valorAtual;

        do {
            try {
                valorModificado = scanSpecific(field, sc, objeto.getClass());
            } catch (NoSuchFieldException ex) {
                ex.printStackTrace();
            }

            propAccessor.setPropertyValue(field, valorModificado);
            valorAtual = propAccessor.getPropertyValue(field);

            if (valorAtual == null)
                valorAtual = new Object();

        } while (!valorAtual.equals(valorModificado));
    }

    public Aluno lerAluno() {
        Aluno aluno = new Aluno();
        setValue("nome", aluno);
        setValue("dataNascimento", aluno);
        setValue("genero", aluno);
        setValue("cpf", aluno);
        return aluno;
    }

    public Disciplina lerDisciplina() {
        Disciplina disciplina = new Disciplina();
        setValue("nome", disciplina);
        setValue("periodo", disciplina);
        setValue("professor", disciplina);
        setValue("vagas", disciplina);
        return disciplina;
    }

    private Calendar convertStringToCalendar(String dataRecebida) {

        Calendar dataNascimento = null;
        try {
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            Date dataNas = df.parse(dataRecebida);
            dataNascimento = Calendar.getInstance();
            dataNascimento.setTime(dataNas);

        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return dataNascimento;
    }

    public void listarAlunos() {
        listar(buscarAlunos());
    }

    private List<Aluno> buscarAlunos() {
        return new Aluno().selecionarTodos();
    }

    private void deletarAluno() {
        System.out.println("Selecione um dos alunos abaixo: \n");
        listarAlunos();
        System.out.println("Informe o id do aluno desejado: \n");
        Scanner alunoScan = new Scanner(System.in);
        int id = alunoScan.nextInt();
        new Aluno().deletar(new Long(id));
    }

    private void listarMatriculados() {
        listar(buscarMatriculados());
    }

    private void listar(List<?> objects) {
        for (Object object : objects) {
            System.out.println(object);
        }
    }

    private List<Aluno> buscarMatriculados() {
        Disciplina d = selecionarDisciplina();
        if (d == null) {
            System.out.println("Disciplina no encontrada!");
            List<Aluno> alunos = new ArrayList<>();
            return alunos;
        }

        return new Aluno().selecionarMatriculados(d.getId().intValue());
    }

    private Disciplina selecionarDisciplina() {
        System.out.println("Selecione uma das disciplinas abaixo: \n");
        listar(buscarDisciplinas());
        System.out.println("Selecionar por:\n1 - ID\n2 - Nome e Perodo");
        Scanner opc = new Scanner(System.in);
        switch (opc.nextInt()) {
        case 1:
            return buscarDisciplinaPorId();
        case 2:
            return buscarDisciplinaPorNomeEPeriodo();
        default:
            return null;
        }
    }

    private Disciplina buscarDisciplinaPorNomeEPeriodo() {
        Scanner scanId = new Scanner(System.in);
        System.out.println("Infome o nome desejado: ");
        String nome = scanId.nextLine();
        System.out.println("Infome o perodo desejado: ");
        String periodo = scanId.nextLine();
        return new Disciplina().selecionar(nome, periodo);
    }

    private Disciplina buscarDisciplinaPorId() {
        Scanner scanId = new Scanner(System.in);
        System.out.println("Infome o id do elemento desejado: ");
        int id = scanId.nextInt();
        return new Disciplina().selecionar(new Long(id));
    }

    private List<Disciplina> buscarDisciplinas() {
        return new Disciplina().selecionarTodos();
    }

    private Aluno buscarAlunoPorId() {
        Scanner scanId = new Scanner(System.in);
        listar(buscarAlunos());
        System.out.println("Infome o id do elemento desejado: ");
        int id = scanId.nextInt();
        return new Aluno().selecionar(new Long(id));
    }

    private void listarDisciplinasDeUmAluno() {
        Aluno a = buscarAlunoPorId();
        List<Disciplina> disciplinas = a.selecionarDisciplinas();
        listar(disciplinas);
    }
}