br.edu.unifesspa.lcc.indexer.GerarIndice.java Source code

Java tutorial

Introduction

Here is the source code for br.edu.unifesspa.lcc.indexer.GerarIndice.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.unifesspa.lcc.indexer;

import br.edu.unifesspa.lcc.db.DatabaseDao;
import br.edu.unifesspa.lcc.calculo.EstatisticaUtil;
import static br.edu.unifesspa.lcc.indexer.Processar.mongo;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import domain.Input_presenteDTO;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

/**
 *
 * @author HansGuido
 */
public class GerarIndice implements Runnable {
    //Lista com os indicadores que devem ser processados 

    private List<Integer> list = new ArrayList<>();
    //Assunto
    private Long assunto = null;
    private DB dbAssunto;
    private Long procId;
    //Para o processamento
    private DatabaseDao datadao = new DatabaseDao();
    private EstatisticaUtil est = new EstatisticaUtil();

    public GerarIndice(List<Integer> list, Long assunto, Long procId) {
        this.list = list;
        this.assunto = assunto;
        this.dbAssunto = mongo.getDB(assunto.toString());
        this.procId = procId;
        System.out.println("Assunto: " + assunto);
        System.out.println("Lista: " + this.list);
        System.out.println("ID do processamento: " + procId);

    }

    @Override
    public void run() {
        if (!list.isEmpty()) {

            //Foi identificado um problema quando h poucos processamentos agendados,
            // ocorre de processar mais que uma vez, ao mesmo tempo, o mesmo Processamento Id, portando,  necessario remover o
            //processamento_indice do banco,quando comear o processamento
            //Fazer download da demanda----
            try {
                DownloadInfo();
            } catch (InterruptedException ex) {
                // Logger.getLogger(GerarIndice.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
            //Fim de Fazer download da demada----

            //Insere em um banco, especificando qual assunto, a demanda est utilizando
            BasicDBObject search = new BasicDBObject();
            DB aux = mongo.getDB("demandas");
            DBCollection colDemandaAtiva = aux.getCollection("demandas_ativas");
            search.append("demanda", assunto.toString());
            search.append("Processamento_indiceId", procId);
            System.out.println("Inseriu na demanda_ativa");
            colDemandaAtiva.insert(search);
            //Fim inserir no banco, a demanda ativa

            //Aqui itera sobre a lista de indicadores que devem ser processados
            System.out.println("Est para entrar no forit e a lista : " + list);
            for (Integer integer : list) {
                try {
                    System.out.println("Processando indicador: " + integer);
                    est.getIndicador(integer, dbAssunto); //Gera o indicador
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            //Depois de processar todos os indices, remove do banco das demandas_ativas, o assunto que foi processado.
            colDemandaAtiva.remove(search);
            System.out.println("REMOVEU");
            search.clear();

            //Se no tiver mais nenhuma demanda utilizando o assunto, dropa-se o banco da demanda
            search.append("demanda", assunto.toString());
            DBCursor cursor = colDemandaAtiva.find(search);
            if (cursor.size() == 0) {
                //dbAssunto.dropDatabase();
                System.out.println("DROPOU");

            }
        }
    }

    private void DownloadInfo() throws InterruptedException {
        //Verifica se j existe um banco de demanda criado no Mongo
        List<String> dbs = mongo.getDatabaseNames();
        if (!dbs.contains(assunto.toString())) {//Se o banco no existe, faz o download

            RestTemplate rt = new RestTemplate();
            DB territorios = mongo.getDB("territorios");
            DBCollection colTerritorios = territorios.getCollection("territorio");
            HttpEntity<String> entity = new HttpEntity<>("parameters", Processar.headers);
            BasicDBObject insert = new BasicDBObject();

            BasicDBObject insertDemanda = new BasicDBObject();

            DBCollection colDaDemanda = dbAssunto.getCollection(assunto.toString());

            System.out.println("db =" + dbAssunto);
            DBCollection k_classe = dbAssunto.getCollection("k");
            //K_CLASSES  -----------------------------------------------------------------------------------------------
            try {

                ResponseEntity<domain.K_classes[]> kClasse = rt.exchange(
                        "http://xingu.lcc.unifesspa.edu.br:8080/api/k_classess?idassunto=" + assunto,
                        HttpMethod.GET, entity, domain.K_classes[].class);
                System.out.println("K-classe tamanho: " + kClasse.getBody().length);
                //System.out.println("Tamanho body:" + kClasse.getBody().length);
                for (domain.K_classes k : kClasse.getBody()) {
                    insert.append("k_ordem", k.getk_ordem());
                    insert.append("k_classes_id", k.getId());
                    insert.append("ck", Integer.parseInt(k.getk_codigo()));
                    insert.append("dk", k.getk_descricao());

                    k_classe.insert(insert);
                    insert.clear();

                }
                System.out.println("DEVERIA TER INSERIDO O K");
            } catch (Exception e) {
                e.printStackTrace();
                insert.clear();
            }
            //FIM K-CLASSES E COMEO INPUT_PRESENTES --------------------------------------------------------------------------------------------------------
            BasicDBObject insertCI = new BasicDBObject();
            try {
                System.out.println("Comeando a inserir os Inputs do assunto: " + assunto);
                ResponseEntity<domain.Input_presenteDTO[]> input = rt.exchange(
                        "http://xingu.lcc.unifesspa.edu.br:8080/api/input_presentes/getInputPresenteByAssantoId/"
                                + assunto,
                        HttpMethod.GET, entity, Input_presenteDTO[].class);
                System.out.println("Fez o download do assunto: " + assunto);
                System.out.println("Tamano input: " + input.getBody().length + "  Assunto: " + assunto);
                DBCollection colInput_presente = dbAssunto.getCollection("i"); // inserir assunto na base
                BasicDBObject search2 = new BasicDBObject();

                //    int cont = 0;
                for (Input_presenteDTO Input2 : input.getBody()) {
                    //       System.out.println("Entrou");
                    //Para a coleo "i"
                    search2.append("ci", Integer.parseInt(Input2.getCodigo()));
                    DBObject aux = colInput_presente.findOne(search2);
                    if (aux != null) {
                        search2.clear();
                        // System.out.println("ja tem esse territorio inserido");
                    } else {

                        DBCursor cursor = colTerritorios.find(search2);
                        while (cursor.hasNext()) {

                            aux = cursor.next();
                            // System.out.println("AUX: " + aux.toString());
                            if (Integer.parseInt(aux.get("ci").toString()) == Integer.parseInt(Input2.getCodigo())
                                    && Integer.parseInt(aux.get("ano").toString()) == Integer
                                            .parseInt(Input2.getAno_ref())) {
                                // insertCI.append("uf_sigla", aux.get("uf_sigla"));
                                insertCI.append("longitude", Double.parseDouble(aux.get("longitude").toString()));
                                insertCI.append("latitude", Double.parseDouble(aux.get("latitude").toString()));
                                // System.out.println("Achou Territorio");
                            }

                        }
                        insertCI.append("ci", Integer.parseInt(Input2.getI_codigo_amc()));
                        insertCI.append("di", Input2.getTerritorio_nome());
                        insertCI.append("ano_ref", Integer.parseInt(aux.get("ano").toString()));
                        search2.clear();
                        colInput_presente.insert(insertCI);
                        insertCI.clear();
                    }

                    //Para a coleo com o mesmo nome da base
                    insertDemanda.append("ci", Integer.parseInt(Input2.getI_codigo_amc()));
                    insertDemanda.append("di", Input2.getTerritorio_nome());
                    insertDemanda.append("ck", Integer.parseInt(Input2.getK_classesK_codigo()));
                    insertDemanda.append("quant_valor", Double.parseDouble(Input2.getX_valor()));
                    insertDemanda.append("ano", Integer.parseInt(Input2.getAno_ref()));

                    //Aqui se acha a descrio da K-Classe envolvida, atravs do "k_classesK_codigo"                       
                    search2.append("ck", Integer.parseInt(Input2.getK_classesK_codigo()));

                    aux = k_classe.findOne(search2);
                    insertDemanda.append("dk", (String) aux.get("dk"));
                    search2.clear();

                    //                    
                    colDaDemanda.insert(insertDemanda);

                    insertDemanda.clear();

                    //   cont++;
                    //   System.out.println(cont);
                }
                System.out.println("Inseriu input_presente do assunto: " + assunto);
                //Preparar banco------------------
                System.out.println("Preparando o assunto: " + assunto);
                datadao.prepareDatabase(false, dbAssunto);
                System.out.println("Fim preparar banco do assunto: " + assunto);
                //Fim preparar Banco----------
            } catch (Exception e) {
                e.printStackTrace();

                insert.clear();
                insertCI.clear();
            }

        } else {
            BasicDBObject search = new BasicDBObject();
            DB aux = mongo.getDB("demandas");
            DBCollection colDemandaAtiva = aux.getCollection("demandas_ativas");
            search.append("demanda", assunto.toString());
            boolean situacao = false;
            while (situacao == false) {

                DBCursor demanAtiva = colDemandaAtiva.find(search);
                if (demanAtiva.size() >= 1) {

                    situacao = true;
                }
                Thread.currentThread().sleep(5000);
            }

        }

    }

}