Subversion Repositories bacoAlunos

Rev

Rev 1040 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.sigesimports;

import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.NonUniqueResultException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.Course;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseView;
import pt.estgp.estgweb.services.courses.CoursesService;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
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 pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.ipportalegre.siges.web.services.ArrayOfDisciplina;
import pt.ipportalegre.siges.web.services.Disciplina;
import pt.ipportalegre.siges.web.services.SiGesWEB;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import javax.xml.namespace.QName;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

/**
 * @author Jorge Machado
 */

public class ImportCourseService extends ServiceJob implements IService
{
    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(ImportCourseService.class);

    private CoursesService coursesService = new CoursesService();

    int newUnits = 0;
    int newCourses = 0;
    public ILogMessages run(1.5.0/docs/api/java/lang/String.html">String year) throws ServiceException
    {
        1.5.0/docs/api/java/lang/String.html">String msgS = "STARTING COURSES IMPORT SERVICE FOR YEAR: " + year;
        serviceLogInfo(msgS);
        logger.info(msgS);

        newUnits = 0;
        newCourses = 0;

        DefaultLogMessages logMessages = new DefaultLogMessages();
        try
        {
            logMessages.addMessage(new DefaultLogMessage("import.semestre.separated", LogMessageTypeEnum.INFO, "instituicao " + DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode()));
            serviceLogInfo(logMessages.getLastMessage());

            HashMap<String, Disciplina> disciplinasMap = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapS1 = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapS2 = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapA = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapT1 = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapT2 = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapT3 = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> disciplinasMapT4 = new HashMap<String, Disciplina>();
            HashMap<String, Disciplina> cursosMap = new HashMap<String, Disciplina>();

            /**
             * Build Course Units Maps
             */

            SiGesWEB service;
            1.5.0/docs/api/java/lang/String.html">String WSDL = DaoFactory.getConfigurationDaoImpl().getSigesWebServicesWsdl();
            try
            {
                serviceLogInfo("STARTING WEB SERVICE AT " + WSDL);
                service = new SiGesWEB(new 1.5.0/docs/api/java/net/URL.html">URL(WSDL), new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName(Globals.SIGES_WEBSERVICE_TARGET_NAMESPACE, "SiGesWEB"));
            }
            catch (1.5.0/docs/api/java/net/MalformedURLException.html">MalformedURLException e)
            {
                logger.fatal(e, e);
                logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(),"erro na configuracao do WEB Service", LogMessageTypeEnum.INFO));
                serviceLogError(logMessages.getLastMessage(), e);
                return logMessages;
            }

            importUnitsSemestre(service, "S1", year, disciplinasMap, disciplinasMapS1, cursosMap, logMessages);
            importUnitsSemestre(service, "S2", year, disciplinasMap, disciplinasMapS2, cursosMap, logMessages);
            importUnitsSemestre(service, "A", year, disciplinasMap, disciplinasMapA, cursosMap, logMessages);
            importUnitsSemestre(service, "T1", year, disciplinasMap, disciplinasMapT1, cursosMap, logMessages);
            importUnitsSemestre(service, "T2", year, disciplinasMap, disciplinasMapT2, cursosMap, logMessages);
            importUnitsSemestre(service, "T3", year, disciplinasMap, disciplinasMapT3, cursosMap, logMessages);
            importUnitsSemestre(service, "T4", year, disciplinasMap, disciplinasMapT4, cursosMap, logMessages);

            /**
             * Import Courses
             */

            logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.courses", LogMessageTypeEnum.INFO));
            serviceLogInfo("updating courses");
            logger.info("updating courses");
            Set<Map.Entry<String, Disciplina>> set2 = cursosMap.entrySet();
            for (1.5.0/docs/api/java/util/Map.html">Map.Entry<String, Disciplina> entry : set2)
            {
                Disciplina d = entry.getValue();
                CourseView c = coursesService.loadCourseByCode("" + d.getCodigoCurso().intValue(),false);

//                Course c = DaoFactory.getCourseDaoImpl().findCourseByCode("" + d.getCodigoCurso());
                if (c == null)
                {
                    c = new CourseView();
                    newCourses++;
                    serviceLogInfo("New Course Found: (" +  d.getCodigoCurso() + ") " + d.getNomeCurso());
//                    DaoFactory.getCourseDaoImpl().save(c);
                }
                c.setName(d.getNomeCurso());
                1.5.0/docs/api/java/lang/String.html">String grauBaco = ConfigProperties.getProperty("siges.degree."+d.getGrauCurso());
                if(c.getDegree() == null)
                    c.setDegree(grauBaco);
                c.setCode("" + d.getCodigoCurso().intValue());
                c.setImportYear(year);
                c.setInstitutionalCode("" + d.getCodigoInstituicao().intValue());
                coursesService.submitCourse(c,null,null,0,null,null);
            }

            /**
             * Update Course Units
             */

            updateCourseUnits(disciplinasMapS1, "S1",logMessages,year);
            updateCourseUnits(disciplinasMapS2, "S2",logMessages,year);
            updateCourseUnits(disciplinasMapA, "A",logMessages,year);
            updateCourseUnits(disciplinasMapT1, "T1",logMessages,year);
            updateCourseUnits(disciplinasMapT2, "T2",logMessages,year);
            updateCourseUnits(disciplinasMapT3, "T3",logMessages,year);
            updateCourseUnits(disciplinasMapT4, "T4",logMessages,year);

            serviceLogInfo("######################################");
            serviceLogInfo("######################################");
            serviceLogInfo("#Courses Imported:" + cursosMap.size());
            serviceLogInfo("#Units Imported S1:" + disciplinasMapS1.size());
            serviceLogInfo("#Units Imported S2:" + disciplinasMapS2.size());
            serviceLogInfo("#Units Imported A:" + disciplinasMapA.size());
            serviceLogInfo("#Units Imported T1:" + disciplinasMapT1.size());
            serviceLogInfo("#Units Imported T2:" + disciplinasMapT2.size());
            serviceLogInfo("#Units Imported T3:" + disciplinasMapT3.size());
            serviceLogInfo("#Units Imported T4:" + disciplinasMapT4.size());
            serviceLogInfo("#New Courses Found:" + newCourses);
            serviceLogInfo("#New Units Found:" + newUnits);

            logger.info("######################################");
            logger.info("######################################");
            logger.info("#Courses Imported:" + cursosMap.size());
            logger.info("#Units Imported S1:" + disciplinasMapS1.size());
            logger.info("#Units Imported S2:" + disciplinasMapS2.size());
            logger.info("#Units Imported A:" + disciplinasMapA.size());
            logger.info("#Units Imported T1:" + disciplinasMapT1.size());
            logger.info("#Units Imported T2:" + disciplinasMapT2.size());
            logger.info("#Units Imported T3:" + disciplinasMapT3.size());
            logger.info("#Units Imported T4:" + disciplinasMapT4.size());
            logger.info("#New Courses Found:" + newCourses);
            logger.info("#New Units Found:" + newUnits);


        }
        catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            logger.error(e,e);
            logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(), "see log for details", LogMessageTypeEnum.ERROR));
            serviceLogError(logMessages.getLastMessage(), e);
            1.5.0/docs/api/java/lang/String.html">String cause = e.getCause() == null ? "" : e.getCause().toString();
            sendNotificationAdmin("Erro na importacao de sumarios",cause);
        }
        logger.info("terminating course import");
        serviceLogInfo("terminating course import");
        logMessages.addMessage(new DefaultLogMessage("import.course.terminating", LogMessageTypeEnum.INFO));
        setProgress(100);
        return logMessages;
    }

    /**
     * Envio de Notificação aos operadores do CI
     * @param subject
     * @param cause
     */

    private void sendNotificationAdmin(1.5.0/docs/api/java/lang/String.html">String subject, 1.5.0/docs/api/java/lang/String.html">String cause)
    {


        List<String> emails = ConfigProperties.getListValues("admin.email");
        for(1.5.0/docs/api/java/lang/String.html">String email:emails)
        {
            serviceLogWarn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email);
            logger.warn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email);
        }
        List<String> arguments = new ArrayList<String>();
        arguments.add(cause.replace("\n","<br/>"));
        Email email = new Email(subject,emails,Globals.SYSTEM_EMAIL_BOX,"messageToAdmin_pt.txt",arguments);
        email.setHtml(true);
        try {
            new SendEmailService().sendEmail(email);
        } catch (ServiceException e) {
            e.printStackTrace();
        }

    }

    private void importUnitsSemestre(SiGesWEB service,
                                     1.5.0/docs/api/java/lang/String.html">String semestre,
                                     1.5.0/docs/api/java/lang/String.html">String year,
                                     HashMap<String, Disciplina> disciplinasMap,
                                     HashMap<String, Disciplina> disciplinasMapSemestre,
                                     HashMap<String, Disciplina> cursosMap,
                                     DefaultLogMessages logMessages)
    {
        logMessages.addMessage(new DefaultLogMessage("import.semestre.course.units." + semestre, LogMessageTypeEnum.INFO));
        serviceLogInfo("importing " + semestre + " course units");
        logger.info("importing " + semestre + " course units");
        ArrayOfDisciplina arrayOfDisciplina = service.getSiGesWEBSoap().getDisciplinasDaInstituicaoSemestre(new 1.5.0/docs/api/java/math/BigDecimal.html">BigDecimal(DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode()), year, semestre);
        List<Disciplina> disciplinas = arrayOfDisciplina.getDisciplina();
        for (Disciplina d : disciplinas)
        {
            if (disciplinasMap.get(d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + semestre) != null)
            {
                logMessages.addMessage(new DefaultLogMessage("import.semestre.repeated." + semestre, "unit: " + d.getCodigo().intValue(), "", LogMessageTypeEnum.WARNING));
                serviceLogWarn("repeated unit in " + semestre + ":" + d.getCodigo().intValue());
                logger.warn("repeated unit in " + semestre + ":" + d.getCodigo().intValue());
            }
            disciplinasMap.put(d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + semestre, d);
            disciplinasMapSemestre.put(d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + semestre, d);
            cursosMap.put(d.getCodigoCurso().intValue()+":"+year, d);
        }
    }

    private void updateCourseUnits(HashMap<String, Disciplina> disciplinasMapS, 1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages logMessages, 1.5.0/docs/api/java/lang/String.html">String year)
    {
        logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO));
        logger.info("updating " + semestre + " course units");
        serviceLogInfo("updating " + semestre + " course units");
        Set<Map.Entry<String, Disciplina>> set = disciplinasMapS.entrySet();
        for (1.5.0/docs/api/java/util/Map.html">Map.Entry<String, Disciplina> entry : set)
        {
            Disciplina d = entry.getValue();
            CourseUnit c;
            try{
                c = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + d.getCodigo(), "" + d.getCodigoCurso(), semestre, year);
            }catch(NonUniqueResultException e)
            {
                logger.fatal("Unidade Repetida: (" + d.getCodigo() + ") curso: " + d.getCodigoCurso() + " " + semestre + " " + year);
                serviceLogFatal("Unidade Repetida: (" + d.getCodigo() + ") curso: " + d.getCodigoCurso() + " " + semestre + " " + year);
                throw e;
            }
            if (c == null)
            {
                c = DomainObjectFactory.createCourseUnitImpl();
                DaoFactory.getCourseUnitDaoImpl().save(c);
                serviceLogInfo("New Unit Found: (" +  d.getCodigo() + ") " + d.getNome() + " - curso (" + d.getNomeCurso() + ") " + d.getNomeCurso());
                newUnits++;
            }
            c.setName(d.getNome());
            c.setInstitutionCode("" + DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode());
            c.setCode("" + d.getCodigo().intValue());
            c.setCourseCode("" + d.getCodigoCurso());
            c.setCourseName("" + d.getNomeCurso());
            c.setSemestre(semestre);
            c.setImportYear(year);
            Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(c.getCourseCode());
            c.setCourse(course);

        }
    }

    public static final 1.5.0/docs/api/java/lang/String.html">String JOB_importYear_KEY = "JOB_importYear_KEY";

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

        1.5.0/docs/api/java/lang/String.html">String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
        ILogMessages messages = run(importYear);
        return messages;

    }


    public static void main(1.5.0/docs/api/java/lang/String.html">String[] args) throws ServiceException
    {
        1.5.0/docs/api/java/lang/String.html">String year = DaoFactory.getConfigurationDaoImpl().getImportsDefaultImportYearCreateTransaction();
        if(args != null && args.length > 0)
            year = args[0];
        AbstractDao.getCurrentSession().beginTransaction();
        new ImportCourseService().run(year);
        AbstractDao.getCurrentSession().getTransaction().commit();
    }


}