Subversion Repositories bacoAlunos

Rev

Rev 1545 | Rev 1547 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.questionarios.pedagogico;

import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;

import java.util.HashMap;
import java.util.List;


/**
 * Created by jorgemachado on 22/03/16.
 */

public class OlapGenerationProcessor extends ServiceJob
{

    //int unidadesNaoUtilizadas = 0;


    private static 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(OlapGenerationProcessor.class);

    int unidadesNaoUtilizadas = 0;
    int unidadesUtilizadas = 0;
    //int unidadesMarcadas = 0;
    //int unidadesNaoVistasProf = 0;
    //int unidadesNaoVistasAlunos = 0;
    int cursosUtilizados = 0;
    //int respostasRequisitadas = 0;
    int cursosSemDepartamento = 0;


    /**
     * #############  JOB TASK ############
     * #############  JOB TASK ############
     * @return
     * @throws Throwable
     */

    @1.5.0/docs/api/java/lang/Override.html">Override
    protected ILogMessages runJobServiceTask() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable
    {


        long questionarioId = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
        DefaultLogMessages logMessages = new DefaultLogMessages();

        //unidadesNaoUtilizadas = 0;

        unidadesNaoUtilizadas = 0;
        unidadesUtilizadas = 0;
        //unidadesMarcadas = 0;
        //unidadesNaoVistasProf = 0;
        //unidadesNaoVistasAlunos = 0;
        cursosUtilizados = 0;
        //respostasRequisitadas = 0;

        cursosSemDepartamento = 0;



        QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
        try{

        AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionarioAnswer.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
        AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionario.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();

        AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioUser.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
        AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioCurso.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
        AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioUnidade.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
        AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioPergunta.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
        AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioTipologia.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();




        List<OlapEntityQuestionario> questionarios = AbstractDao.getCurrentSession().createQuery("select x from x in class " + OlapEntityQuestionario.class.getName() + " where x.questionario.id = " + questionarioId).list();
        OlapEntityQuestionario olapEntityQuestionario;
        OlapHistoryDimension olapHistoryDimension;
        if(questionarios.size() > 0)
        {
            olapEntityQuestionario = questionarios.get(0);
            updateOlapQuestionario(olapEntityQuestionario, q);
            List<OlapHistoryDimension> histories = AbstractDao.getCurrentSession().createQuery("select x from x in class " + OlapHistoryDimension.class.getName() + " where x.questionario.id = " + questionarioId).list();
            olapHistoryDimension = histories.get(0);
        }
        else
        {
            //+++++++ todo CRIANDO OLAP Questionario
            olapEntityQuestionario = createQuestionarioOlap(q);
            olapHistoryDimension = new OlapHistoryDimension();
            olapHistoryDimension.setQuestionario(q);
            //+++++++ todo CRIANDO OLAP History
            DaoFactory.getOlapHistoryDimensionDaoImpl().save(olapHistoryDimension);
        }
        olapHistoryDimension.setNome(q.getQuestionarioHistoryDrive().getCodeName());
        olapHistoryDimension.setDescricao(q.getQuestionarioHistoryDrive().getDescription());


        //Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre

        /**logging**/
        1.5.0/docs/api/java/lang/String.html">String msg = "Starting running service OLAP GENERATION generation for questionario: " + q.getId() + " - " + q.getiAnswersProcessorClass().getTitle();
        serviceLogInfo(msg);
        logger.info(msg);

        List<Long> cursosAfetosIds = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().findCursosAfetosIds(questionarioId);
        int count = 0;
        int size=cursosAfetosIds.size();


        //+++++++ todo CRIANDO OLAP Perguntas
        HashMap<String,Long> mapaIdsPerguntasPersistentes = createOlapQuestionarioPergunta(q);


        for(1.5.0/docs/api/java/lang/Long.html">Long cursoAfetoId : cursosAfetosIds)
        {
            count++;

            /** COMMIT OPERATION **/
            setProgress((int)((((float)count)/((float)size))*100.0f));
            commitPartially();
            q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
            /** COMMIT OPERATION **/



            QuestionarioPedagogicoCursoAfeto cu = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().get(cursoAfetoId);
            msg = "(+) Iniciando geração OLAP para o curso " + cu.getNome() + " (" + cu.getCodigoCurso() + ") escola " + cu.getNomeInstituicao() + "(" + cu.getCodigoInstituicao() + ")";
            logger.info(msg);
            serviceLogInfo(msg);

            //+++++++ todo CRIANDO OLAP Curso
            OlapEntityQuestionarioCurso questionarioCurso = createQuestionarioCursoOlap(logMessages, q, cu);

            int unidades;
            if(cu.getUnidadesAfetas() != null)
            {
                unidades = cu.getUnidadesAfetas().size();
                int countUnidades = 0;
                for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
                {
                    countUnidades++;
                    msg = unidadeCurricularAfeta.isUsar() ? "(+)" : "(----IGNORADA-----)";
                    msg += "(" + countUnidades + "/" + unidades + ") Iniciando OLAP de Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome();
                    logger.info(msg);
                    serviceLogInfo(msg);


                    if(!unidadeCurricularAfeta.isUsar() || !unidadeCurricularAfeta.isUsarOlap())
                    {
                        unidadesNaoUtilizadas++;
                        msg = "!!! A unidade está marcada para NÃO SER UTILIZADA, passando à próxima";
                        serviceLogWarn(msg);
                        logger.warn(msg);
                        logMessages.addMessage(new DefaultLogMessage("questionario.olap", LogMessageTypeEnum.WARNING,msg));
                    }
                    else
                    {
                        CourseUnitImpl cuImpl = (CourseUnitImpl) DaoFactory.getCourseUnitDaoImpl().narrow(unidadeCurricularAfeta.getCourseUnit());
                        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(unidadeCurricularAfeta.getCourseUnit().getCourse());

                        //TODO CRIAR ENTIDADE OLAP UNIDADE

                        unidadesUtilizadas++;
                        List<CourseUnitImpl.Tipologia> tipologias;


                        for(QuestionarioPedagogicoTipologiaRequisitada tipologiaRequisitada: unidadeCurricularAfeta.getTipologiasRequisitadas())
                        {
                            msg ="Iniciando OLAP de Tipologia Requisitada " + tipologiaRequisitada.getDsTipologia() + " " + tipologiaRequisitada.getCdTipologia()
                                    + " docente: " + tipologiaRequisitada.getCdDocente() + "(" + tipologiaRequisitada.getNomeDocente() + ")"
                                    + " turma: " + tipologiaRequisitada.getCdTurma();
                            serviceLogInfo(msg);
                            logger.info(msg);
                            //TODO CRIAR ENTIDADE OLAP TIPOLOGIA

                            for(QuestionarioPedagogicoAlunoRequisitado alunoRequisitado: tipologiaRequisitada.getAlunosRequisitados())
                            {
                                QuestionarioRespostaRequisitada respostaRequisitada = alunoRequisitado.getRespostaRequisitada();

                                //TODO CRIAR/PROCURAR NESTE QUESTIONARIO ENTIDADE PERFIL UTILIZADOR
                                //TODO CRIAR ENTIDADE FACTO RESPOSTA RESPONDIDA/NAO RESPONDIDA

                                QuestionarioResposta resposta = respostaRequisitada.getResposta();

                                //TODO USAR ENTIDADES RESPOSTAPERGUNTA COM BASE NO QUESTIONARIO EM QUESTAO



                                if(respostaRequisitada.getResposta() != null)
                                {
                                    //TODO CRIAR FACTOS RESPOSTA COM BASE NA RESPOSTA
                                }
                            }


                        }
                    }
                }
            }
        }

        /** COMMIT OPERATION **/
        setProgress(100);
        commitPartially();
        DaoFactory.getQuestionarioDaoImpl().update(q);
        /** COMMIT OPERATION **/

        msg = "Set courses state as " + QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.OLAP.name();
        serviceLogInfo(msg);
        logger.info(msg);
        q.setStateClass(QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.OLAP);
        commitPartially();


        serviceLogInfo("######################################");
        serviceLogInfo("######################################");


        logger.info("######################################");
        logger.info("######################################");
        }
        catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            logger.error(e,e);
            q.setStateClass(QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.CLOSED);
            throw e;
        }
        return logMessages;
    }



    private OlapEntityQuestionarioCurso createQuestionarioCursoOlap(DefaultLogMessages logMessages, QuestionarioImpl q, QuestionarioPedagogicoCursoAfeto cu) {
        OlapEntityQuestionarioCurso questionarioCurso;
        1.5.0/docs/api/java/lang/String.html">String msg;
        questionarioCurso = new OlapEntityQuestionarioCurso();
        questionarioCurso.setQuestionario(q);
        questionarioCurso.setCodigoCurso(cu.getCodigoCurso());
        questionarioCurso.setDegree(cu.getCourse().getDegree());
        if(cu.getCourse().getDepartment() == null)
        {
            msg = "Curso sem departamento corrigir situação: " + cu.getNome();
            logger.warn(msg);
            serviceLogWarn(msg);
            logMessages.addMessage(new DefaultLogMessage("questionario.olap", LogMessageTypeEnum.WARNING,msg));
        }
        else
        {
            cursosSemDepartamento++;
            questionarioCurso.setDepartament(cu.getCourse().getDepartment().getSigla());
        }
        questionarioCurso.setNomeCurso(cu.getNome());
        questionarioCurso.setNomeInstituicao(cu.getNomeInstituicao());
        questionarioCurso.setCodigoInstituicao(cu.getCodigoInstituicao());
        DaoFactory.getOlapEntityQuestionarioCursoDaoImpl().save(questionarioCurso);
        return questionarioCurso;
    }
    private OlapEntityQuestionario createQuestionarioUnidadeOlap(QuestionarioImpl q)
    {

        return null;
    }
    private OlapEntityQuestionario createQuestionarioOlap(QuestionarioImpl q)
    {
        OlapEntityQuestionario olapEntityQuestionario = new OlapEntityQuestionario();
        DaoFactory.getOlapEntityQuestionarioDaoImpl().save(olapEntityQuestionario);
        return updateOlapQuestionario(olapEntityQuestionario, q);
    }

    private OlapEntityQuestionario updateOlapQuestionario(OlapEntityQuestionario olapEntityQuestionario, QuestionarioImpl q)
    {
        olapEntityQuestionario.setQuestionario(q);
        olapEntityQuestionario.setAno(q.getYear());
        olapEntityQuestionario.setSemestre(q.getSemestre());
        return olapEntityQuestionario;
    }

    /**
     * Return a map of ID's given the question number
     * @param q
     * @return
     */

    private HashMap<String,Long> createOlapQuestionarioPergunta(QuestionarioImpl q)
    {

        HashMap<String,Long> mapaIdsPerguntasPersistentes = new HashMap<String, Long>();

        for(int i = 1; i < 40;i++)
        {
            OlapEntityQuestionarioPergunta pergunta = new OlapEntityQuestionarioPergunta();
            pergunta.setNumero("" + i);
            pergunta.setPergunta(q.getPergunta("" + i));
            if(pergunta.getPergunta() == null || pergunta.getPergunta().trim().length() == 0)
                continue;
            pergunta.setGrupoCode(q.getGrupoCode("" + i));
            if(pergunta.getGrupoCode() == null || pergunta.getGrupoCode().trim().length() == 0)
                continue;
            pergunta.setGrupoTitle(q.getGrupoTitle("" + i));
            pergunta.setQuestionario(q);

            DaoFactory.getOlapEntityQuestionarioPerguntaDaoImpl().save(pergunta);

            mapaIdsPerguntasPersistentes.put("" + i,pergunta.getId());

            1.5.0/docs/api/java/lang/System.html">System.out.println("Pergunta OLAP Entity " + i);
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getNumero());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getPergunta());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getGrupoCode());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getGrupoTitle());


        }

        return mapaIdsPerguntasPersistentes;


    }


}