com.jogo.dao.RepositorioDao.java Source code

Java tutorial

Introduction

Here is the source code for com.jogo.dao.RepositorioDao.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 com.jogo.dao;

import com.jogo.entity.Perguntas;
import com.jogo.entity.Usuario;
import java.io.*;
import java.util.*;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 *
 * @author mizae
 */
public class RepositorioDao implements IRepositorioDao {

    //Caminho para buscar os dados no excel.
    private static String PATH = "C://Jogo//Jogo.xlsx";

    //Workbook criar o excel
    Workbook wb;

    //caminho do arquivo do excel 
    private final File patch = new File(PATH);

    //IMPORTAR OS USUARIOS DA FOLHA 1 DO EXCEL
    @Override
    public List importar() {

        //arry de usuario para armazenar os meus usuarios que pega do excel na folha 1
        List<Usuario> usuarios = new ArrayList<>();

        //CAPTURA OS DADOS DO USUARIO NO EXCEL
        try {
            //capturando o excel para meu wb
            wb = WorkbookFactory.create(new FileInputStream(patch));

            //CAPTURAR A PRIMEIRA FOLHA DO EXCEL 
            Sheet folha = wb.getSheetAt(0);

            //criO um iterator para interagir com as linhas
            Iterator filaIterator = folha.rowIterator();

            //ENQUANTO HOUVER LINHAS O ITERATOR ME TRAZ.
            while (filaIterator.hasNext()) {

                //CAPTURO A LINHA DO EXCEL
                Row linha = (Row) filaIterator.next();

                //CRIO UM INTERATOR PARA INTERAGIR COM AS COLUNAS
                Iterator colunaIterator = linha.cellIterator();

                //CRIOU A CLASSE DE USUARIO E ADD DENTRO DO MEU ARRAY
                Usuario user = new Usuario();
                usuarios.add(user);

                //ENAUQNTO HOUVER COLUNAS O INTERATOR ME TRAZ.
                while (colunaIterator.hasNext()) {

                    //COM A LINHA E A COLUNA JA POSSO CRIAR UMA CELULA.
                    Cell celula = (Cell) colunaIterator.next();

                    //APOS CAPTURAR O VALOR NA CELULA, SETO PARA MINHA CLASSE USUARIO QUE CRIEI LOGO ACIMA.
                    if (celula != null) {
                        //CAPTURO O TIPO DA CELULA, NESSE CASO E STRING E NUMERICO(INT)
                        switch (celula.getCellType()) {
                        case Cell.CELL_TYPE_NUMERIC:
                            //CONVERTENDO O VALOR PARA INTEIRO.
                            user.setPontuacao((int) Math.round(celula.getNumericCellValue()));
                            break;
                        case Cell.CELL_TYPE_STRING:
                            user.setNome(celula.getStringCellValue());
                            break;

                        }

                    }

                }

            }

        } catch (IOException | InvalidFormatException | EncryptedDocumentException e) {
        }
        return usuarios;
    }

    //IMPORTAR AS PERGUNTAS(O INDEX SIGNIFICA A FOLHA,
    //PARA SABER QUE TIPO DE CATEGORIA QUERO BUSCAR).
    @Override
    public List importarPerguntas(int index) {

        //CRIO UM ARRAY DE PERGUNTAS PARA ARMAZENAR AS PERGUNTAS BUSCAS DO EXCEL.
        List<Perguntas> perguntas = new ArrayList<>();

        try {

            //CAPTURANDO O EXCEL PARA MEU WB.    
            wb = WorkbookFactory.create(new FileInputStream(patch));

            //CAPTURO A FOLHA DO EXCEL PASSANDO O INDEX
            Sheet folha = wb.getSheetAt(index);

            //CRIO UM ITERATOR PARA INTERAGIR COM AS LINHAS.
            Iterator filaIterator = folha.rowIterator();

            //ENQUANTO HOUVER INTERAO PEGA UMA LINHA.
            while (filaIterator.hasNext()) {

                //CAPTURO A LINHA DO EXCEL
                Row linha = (Row) filaIterator.next();
                //CRIO UM ITERATOR PARA PEGAR AS COLUNAS
                Iterator colunaIterator = linha.cellIterator();

                //AQUI DIGO QUE MINHAS COLUNAS NO PODE PASSAR DE 6, COMO TA A MINHA ESTRUTURA PARA O EXCEL
                //1 - PERGUNTA, 2- ALTERNATIVA, 3- ALTERNATIVA, 4- ATLTERNATIVA, 5- ALTERNATIVA, 6- RESPOSTA
                //CHEGOU MAIOR QUE 6 SAIU DO LOOP DE COLUNAS.
                if (linha.getLastCellNum() > 6) {
                    break;
                }

                //CRIOU A CLASSE DE PERGUNTAS E ADD DENTRO DO MEU ARRAY
                Perguntas per = new Perguntas();
                perguntas.add(per);

                //INTERAGIR COM AS COLUNAS, PEGAR AS COLUNAS DO EXCEL
                while (colunaIterator.hasNext()) {

                    //TENDO A LINHA E COLUNA JA POSSO TER UMA CELULA.
                    Cell celula = (Cell) colunaIterator.next();

                    //APOS CAPTURAR O VALOR NA CELULA, SETO PARA MINHA CLASSE PERGUNTAS QUE CRIEI LOGO ACIMA.
                    if (celula != null) {
                        //CAPTURAR O TIPO DA CELULA, NO CASO TODAS AS PERGUNTAS E ALTERNATIVAS SO STRINGS.
                        //OBS: OLHE QUE NESSE CASO S POSSO TRAZER STRING'S CASO CONTRARIO NO IR? FUNCIONAR.:/
                        switch (celula.getCellType()) {
                        case Cell.CELL_TYPE_STRING:
                            switch (celula.getColumnIndex()) {
                            case 0:
                                per.setPergunta(celula.getStringCellValue());
                                break;
                            case 1:
                                per.setAlt1(celula.getStringCellValue());
                                break;
                            case 2:
                                per.setAlt2(celula.getStringCellValue());
                                break;
                            case 3:
                                per.setAlt3(celula.getStringCellValue());
                                break;
                            case 4:
                                per.setAlt4(celula.getStringCellValue());
                                break;
                            case 5:
                                per.setResposta(celula.getStringCellValue());
                                break;
                            default:
                                break;
                            }
                        }

                    }

                }
            }
        } catch (IOException | InvalidFormatException | EncryptedDocumentException e) {
        }
        return perguntas;
    }

    //SALVAR O EXCEL COM OS USUARIOS E PERGUNTAS.
    //PASSANDO TODO QUE CAPTUREI DO EXCEL NO IMPORTE E TODAS AS FOLHAS PASSANDO DE UMA S VEZ, PARA SALVAR TODOS JUNTOS.
    public void exportar(File arquivo, List<Usuario> Usuario, List<Perguntas> capAmerica,
            List<Perguntas> oSenhorAneis, List<Perguntas> batmam, List<Perguntas> veloFur,
            List<Perguntas> harryPotter, List<Perguntas> instrMortais, List<Perguntas> cronicNarnia,
            List<Perguntas> varios) {
        //CRIO MEU ARQUIVO DE EXCEL. INSTANCIOANDO DE XSSFWorkbook
        wb = new XSSFWorkbook();

        try {

            //SALVAR A FOLHA 1 ONDE ESTO OS USUARIOS.    
            Sheet folha = wb.createSheet("USUARIO");
            int contador = 0;

            //CRIO UM FORACH DE ARRAY LIST DE USUARIO
            for (Usuario u : Usuario) {

                //CRIO A LINHA PASSANDO O CONTADOR(INDEX DA LINHA) E CAPTURO A LINHA
                Row fila = folha.createRow(contador);

                //ENCREMENTO O CONTADOR PARA IR PARA A PROXIMA LINHA.
                contador++;

                //AGORA USO UM FOR PARA PEGAR AS COLUNAS, QUE SO DUAS COLUNAS.
                for (int coluna = 0; coluna < 2; coluna++) {

                    //TENDO A LINHA E COLUNA JA POSSO TER MINHA CELULA.
                    Cell celula = fila.createCell(coluna);
                    //SE A COLUNA FOR A 0 EU ADD O NOME NELA, SENAO ADD A PONTUAO.
                    //FICARIA COLUNA 1 - NOME , COLUNA 2 - PONTUAO.
                    if (coluna == 0) {
                        celula.setCellValue(u.getNome());
                    } else {
                        celula.setCellValue(u.getPontuacao());
                    }
                    //SE O ARQUIVO NO EXISTIR ELE CRIAR E SE J? EXISTIR ELE SUBSTITUI.
                    //NESSE CASO O ARQUIVO SEMPRE EXISTIRAR, PIS  NELE QUE EST? AS PERGUNTAS SALVAS.
                    if (!arquivo.exists()) {
                        wb.write(new FileOutputStream(arquivo));
                    } else {
                        wb.write(new FileOutputStream(arquivo));
                    }

                }
            }
            //CHAMANDO O METODO E PASSANDO O INDEX PARA CADA FOLHA ONDE SERA SALVA.
            exportarPergunta(1, capAmerica);
            exportarPergunta(2, oSenhorAneis);
            exportarPergunta(3, batmam);
            exportarPergunta(4, veloFur);
            exportarPergunta(5, harryPotter);
            exportarPergunta(6, instrMortais);
            exportarPergunta(7, cronicNarnia);
            exportarPergunta(8, varios);
            wb.write(new FileOutputStream(arquivo));
        } catch (Exception e) {
        }
    }

    //ESSE METODO SERVE PARA EXPORTAR VARIAS PERGUNTAS.
    public void exportarPergunta(int index, List<Perguntas> perguntas) {
        //NOMEAR AS FOLHAS NO EXCEL COM O NOME DA CATEGORIA.
        String nome = "";
        switch (index) {
        case 1:
            nome = "CAPITO AMERICA";
            break;
        case 2:
            nome = "O SENHOR DOS ANIS";
            break;
        case 3:
            nome = "BATMAN";
            break;
        case 4:
            nome = "VELOZES E FURIOSOS";
            break;
        case 5:
            nome = "HARRY POTTER";
            break;
        case 6:
            nome = "OS INSTRUMENTOS MORTAIS";
            break;
        case 7:
            nome = "AS CRONICAS DE NARNIA";
            break;
        case 8:
            nome = "VARIOS FILMES";
            break;
        }

        //IGUAL AO PASSO DO USUARIO, AGORA SENDO COM AS PERGUNTAS.
        Sheet folha2 = wb.createSheet(nome);
        int contador2 = 0;
        for (Perguntas p : perguntas) {

            Row fila2 = folha2.createRow(contador2);
            contador2++;
            for (int coluna2 = 0; coluna2 < 6; coluna2++) {
                Cell celula2 = fila2.createCell(coluna2);

                switch (coluna2) {
                case 0:
                    celula2.setCellValue(p.getPergunta());
                    break;
                case 1:
                    celula2.setCellValue(p.getAlt1());
                    break;
                case 2:
                    celula2.setCellValue(p.getAlt2());
                    break;
                case 3:
                    celula2.setCellValue(p.getAlt3());
                    break;
                case 4:
                    celula2.setCellValue(p.getAlt4());
                    break;
                case 5:
                    celula2.setCellValue(p.getResposta());
                    break;
                default:
                    break;
                }
            }
        }

    }

    //INSERIR USUARIOS NA FOLHA 1 DO EXCEL.
    //PRECISO CAPTUDO TUDO DO MEU EXCEL, ADD O QUE QUERO E SALVAR TUDO NOVAMENTE.
    @Override
    public int cadastro(Usuario usuario) {

        List<Usuario> usuarios = importar();

        //PRECISO IMPORTAR TUDO DO EXCEL, ADD O QUE QUERO E SALVO NOVAMENTE.
        List<Perguntas> capAmerica = importarPerguntas(1);
        List<Perguntas> oSenhorAneis = importarPerguntas(2);
        List<Perguntas> batmam = importarPerguntas(3);
        List<Perguntas> veloFur = importarPerguntas(4);
        List<Perguntas> harryPotter = importarPerguntas(5);
        List<Perguntas> instrMortais = importarPerguntas(6);
        List<Perguntas> cronicNarnia = importarPerguntas(7);
        List<Perguntas> varios = importarPerguntas(8);

        //CHAMAR O METODO VERIFICAR PARA SABER SE O NOME DO USUARIO J? EXISTE.
        if (verificar(usuario, usuarios) == true) {
            return 0;
        } else {
            usuarios.add(usuario);
            //DEPOIS DE IMPORTAR TUDO DO EXCEL E ADD, SALVO ELE.
            ////EXPORTO TUDO PARA MEU EXCEL NOVAMENTE.
            exportar(new File(PATH), usuarios, capAmerica, oSenhorAneis, batmam, veloFur, harryPotter, instrMortais,
                    cronicNarnia, varios);
        }
        return 1;
    }

    //ATUALIZAR AS PONTUAES AO FINAL DA PARTIDA.
    //PRECISO TRAZER TUDO DO EXCEL, ALTERAR O QUE QUERO E SALVAR TODOS NOVAMENTE.
    @Override
    public void update(Usuario usuario) {
        File file = new File(PATH);
        List<Usuario> usuarios = importar();
        //PRECISO IMPORTAR TUDO DO EXCEL, ADD O QUE QUERO E SALVO NOVAMENTE.
        List<Perguntas> capAmerica = importarPerguntas(1);
        List<Perguntas> oSenhorAneis = importarPerguntas(2);
        List<Perguntas> batmam = importarPerguntas(3);
        List<Perguntas> veloFur = importarPerguntas(4);
        List<Perguntas> harryPotter = importarPerguntas(5);
        List<Perguntas> instrMortais = importarPerguntas(6);
        List<Perguntas> cronicNarnia = importarPerguntas(7);
        List<Perguntas> varios = importarPerguntas(8);
        for (Usuario u : usuarios) {
            if (u.getNome().equalsIgnoreCase(usuario.getNome()) && usuario.getPontuacao() > u.getPontuacao()) {
                u.setPontuacao(usuario.getPontuacao());
                break;

            }
        }
        //DEPOIS DE IMPORTAR TUDO DO EXCEL E ATUALIZAR, SALVO ELE.
        //EXPORTO TUDO PARA MEU EXCEL NOVAMENTE.
        exportar(new File(PATH), usuarios, capAmerica, oSenhorAneis, batmam, veloFur, harryPotter, instrMortais,
                cronicNarnia, varios);

    }

    //METODO VERIFICAR PARA SABER SE O USUARIO JA EXISTE, CASO EXISTA RETORNA TRUE.
    public boolean verificar(Usuario usuario, List<Usuario> usuarios) {
        for (Usuario u : usuarios) {
            if (u.getNome().equalsIgnoreCase(usuario.getNome())) {
                return true;
            }
        }
        return false;
    }
}