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

Java tutorial

Introduction

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

import br.edu.ifes.bd2hibernate.cdp.Jogador;
import br.edu.ifes.bd2hibernate.cdp.Time;
import br.edu.ifes.bd2hibernate.cgd.HibernateUtil;
import br.edu.ifes.bd2hibernate.datafactory.JogadorData;
import br.edu.ifes.bd2hibernate.datafactory.TimeData;
import br.edu.ifes.bd2hibernate.util.DateValidator;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
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<String, String>();
    DataFactory df = new DataFactory();
    JogadorData jogadorData = new JogadorData();
    TimeData timeData = new TimeData();

    public Menu() {
        //Inicializa o Hibernate
        HibernateUtil.getSession();
        //Limpa o log de inicializao
        FuncaozinhaIradaPraLimparATelaNoMelhorEstiloJavaDeSer();

        this.messages.put("NOME", "Nome: ");
        this.messages.put("ID", "Id: ");
        this.messages.put("DATACRIACAO", "Data (dd/MM/yyyy): ");
        this.messages.put("DATANASCIMENTO", "Data (dd/MM/yyyy): ");
        this.messages.put("ENDERECO", "Endereco: ");
        this.messages.put("MENSALIDADESOCIO", "Mensalidade (Ex: 1.99): ");

        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");
        this.messages.put("TIME_REQUIRIDO", "\nEscolha um dos seguintes times:\n");
    }

    public void load() {
        Scanner menuEntrada = new Scanner(System.in);
        int menu = -1;
        while (menu != 0) {
            System.out.println("\n\n1 - Cadastrar Jogador");
            System.out.println("2 - Cadastrar Time");
            System.out.println("3 - Listar Times");
            System.out.println("4 - Listar Jogadores");
            System.out.println("5 - Buscar Jogador");
            System.out.println("6 - Buscar Time");
            System.out.println("7 - Buscar Jogadores do Time");
            System.out.println("8 - Popular Banco");
            System.out.println("0 - Sair");

            menu = menuEntrada.nextInt();
            switch (menu) {
            case 1:
                cadastrarJogador(lerJogador());
                imprimeMensagem("Jogador", "inserir");
                break;
            case 2:
                cadastrarTime(lerTime());
                imprimeMensagem("Time", "inserir");
                break;
            case 3:
                listar(buscarTodosTimes());
                break;
            case 4:
                listar(buscarTodosJogadores());
                break;
            case 5:
                System.out.println(new Jogador().selecionar(lerInt()));
                break;
            case 6:
                System.out.println(new Time().selecionar(lerInt()));
                break;
            case 7:
                listarJogadoresDoTime();
                break;
            case 8:
                popularBanco();
                break;
            case 0:
                HibernateUtil.shutdown();
                return;
            }
        }
    }

    private void popularBanco() {
        System.out.println(this.messages.get("INICIANDO_POPULACAO"));
        timeData.criaTimeRandom(df, 10);
        jogadorData.criaJogadorRandom(df, 10);
        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));
    }

    private void listarJogadoresDoTime() {
        listar(buscarTodosTimes());
        System.out.println("Informe o time desejado:");
        int idTime = lerInt();
        Time t = new Time().selecionar(idTime);

        List<Jogador> jogadores = new Jogador().selecionar(t.getNome());
        listar(jogadores);
    }

    private int lerInt() {
        System.out.println(this.messages.get("ID"));
        Scanner sc = new Scanner(System.in);
        int id = sc.nextInt();
        return id;
    }

    private List<Jogador> buscarTodosJogadores() {
        return new Jogador().selecionarTodos();
    }

    private List<Time> buscarTodosTimes() {
        return new Time().selecionarTodos();
    }

    public void FuncaozinhaIradaPraLimparATelaNoMelhorEstiloJavaDeSer() {
        for (int i = 0; i < 100; i++) {
            System.out.println();
        }
    }

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

    private void cadastrarJogador(Jogador jogador) {
        jogador.inserir(jogador);
    }

    private Jogador lerJogador() {

        System.out.println(this.messages.get("TIME_REQUIRIDO"));
        listar(buscarTodosTimes());
        int idTime = lerInt();
        Time time = new Time().selecionar(idTime);

        Jogador j = new Jogador();
        setValue("nome", j);
        setValue("dataNascimento", j);
        setValue("endereco", j);
        j.setTime(time);
        return j;
    }

    private void cadastrarTime(Time time) {
        time.inserir(time);
    }

    private Time lerTime() {
        Time t = new Time();
        setValue("nome", t);
        setValue("dataCriacao", t);
        setValue("mensalidadeSocio", t);
        return t;
    }

    //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 "DATE":
                String date = sc.nextLine();
                valid = this.dateValidator.validate(date);
                if (valid)
                    value = convertStringToDate(date);
                break;
            case "INT":
                value = sc.nextInt();
                valid = true;
                break;
            case "FLOAT":
                value = sc.nextFloat();
                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));
    }

    private Date convertStringToDate(String dataRecebida) {

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

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