Subversion Repositories bacoAlunos

Rev

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

package pt.estgp.estgweb.services.courseunits;

import jomm.dao.impl.AbstractDao;
import jomm.utils.PdfUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import org.dom4j.*;
import org.hibernate.Query;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.dao.impl.CourseUnitDaoImpl;
import pt.estgp.estgweb.domain.views.CourseUnitProgramView;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.data.IRepositoryFile;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.estgp.estgweb.utils.Dom4jUtil;
import pt.estgp.estgweb.utils.StringsUtils;
import pt.estgp.estgweb.web.FtpServer;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/*
 * @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
 *
 *
 * Created at 17/Out/2003 , 23:45:24
 *
 */


/**
 * @author Jorge Machado
 *
 *
 * Created at 17/Out/2003 , 23:45:24
 *
 */

public class SaveCourseUnitProgram implements IService
{

    RepositoryService repositoryService = new RepositoryService();
    LoadCourseUnitAnnouncements loadCourseUnitAnnouncements = new LoadCourseUnitAnnouncements();

    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(SaveCourseUnitProgram.class);


    public void validate(1.5.0/docs/api/java/lang/Long.html">Long courseUnitId, UserSession usession, CourseUnitImpl clearedCourseUnit) throws ServiceException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, 1.5.0/docs/api/java/io/IOException.html">IOException, FOPException {

        if(clearedCourseUnit.isClear((UserSessionImpl) usession,CourseUnitImpl.CourseUnitClearancesOperation.PROGRAM_CAN_VALIDATE.name()))
        {
            clearedCourseUnit.setValidProgram(true);
        }

    }

    public void invalidate(1.5.0/docs/api/java/lang/Long.html">Long courseUnitId, UserSession usession, CourseUnitImpl clearedCourseUnit) throws ServiceException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, 1.5.0/docs/api/java/io/IOException.html">IOException, FOPException {

        if(clearedCourseUnit.isClear((UserSessionImpl) usession,CourseUnitImpl.CourseUnitClearancesOperation.PROGRAM_CAN_VALIDATE.name()))
        {
            clearedCourseUnit.setValidProgram(false);
        }

    }

    public CourseUnitProgramView run(CourseUnitProgramView cupv, 1.5.0/docs/api/java/lang/Long.html">Long coursUnitId, UserSession usession, CourseUnitImpl clearedCourseUnit) throws ServiceException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, 1.5.0/docs/api/java/io/IOException.html">IOException, FOPException {

        //CourseUnit cProxy = DaoFactory.getCourseUnitDaoImpl().get(coursUnitId);


        //Ja vem do filtro isto feito
        // clearedCourseUnit.initClearances((UserSessionImpl) usession,true);

        CourseUnitProgram program = clearedCourseUnit.getCourseUnitProgram();
        if(program == null)
        {
            program = new CourseUnitProgramImpl();
            DaoFactory.getCourseUnitProgramDaoImpl().save(program);
            program.setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
            DaoFactory.getCourseUnitProgramPart2DaoImpl().save(program.getCourseUnitProgramPart2());
            clearedCourseUnit.setCourseUnitProgram(program);
        }
//
        //if(usession.getUser().isSuperuserOrAdmin())

        if(clearedCourseUnit.isClear((UserSessionImpl) usession,CourseUnitImpl.CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name()))
        //if(usession.getUser() instanceof Teacher && (((Teacher)(usession.getUser())).checkIsTeacherOfCourseUnit(c.getId(),true)))
        {
            cupv.persistViewInObjectTeacher(program);
        }
        if(clearedCourseUnit.isClear((UserSessionImpl) usession,CourseUnitImpl.CourseUnitClearancesOperation.PROGRAM_COORDINATOR_PART.name()))
        {
            cupv.persistViewInObjectCoordinator(program);
            setResponsableTeacher(cupv, clearedCourseUnit);
        }

        List<String> errors = new ArrayList<String>();
        createPdf(clearedCourseUnit,errors,usession);

        if(usession.getUser() instanceof Teacher)
            DirectedCoordinatedUnitsService.sendNotificationsEditedInterestedPeople(clearedCourseUnit,usession);
        else
        {
            logger.info("Nao vai informar docentes");
        }
       
        return cupv;
    }

    private void setResponsableTeacher(CourseUnitProgramView cupv, CourseUnit c) {
        if(cupv.getResponsableId() > 0)
        {
            Teacher t = DaoFactory.getTeacherDaoImpl().load(cupv.getResponsableId());
            c.setResponsableTeacher(t);
        }
    }



    public void createPdf(CourseUnit cu, List<String> errors) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException {
        createPdf(cu,errors,null);
    }

    public void createPdf(CourseUnit cu, List<String> errors,UserSession u) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException {
        createPdf(cu,errors,null,null);
    }

    public void createPdf(CourseUnit cu, List<String> errors,UserSession u,List<String> warns) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException {


        1.5.0/docs/api/java/lang/String.html">String path = generatePdfFile(cu, errors, u);



        RepositoryService repositoryService = new RepositoryService();
        User owner;
        if(cu.getTeachers() != null && cu.getTeachers().size() > 0)
            owner = cu.getTeachers().iterator().next();
        else
            owner = DaoFactory.getUserDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(1));
        if(owner.getUsername() == null)
        {
            errors.add("Docente: " + owner.getName() + " ( " + owner.getId()  + " ) don't have username check that situation");
//            owner.setUsername("UKNOWN");
        }
        if(cu.getProgramStreamId() == null)
        {
            1.5.0/docs/api/java/lang/String.html">String identifier = repositoryService.storeRepositoryFile(new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream(path), "application/pdf", "pdf",((int) new 1.5.0/docs/api/java/io/File.html">File(path).length()), cu.getCode() + ".pdf", "courseunit.program.description" + cu.getName(), ResourceAccessControlEnum.publicDomain, null, owner);
            cu.setProgramStreamId(identifier);
        }
        else
        {
            repositoryService.updateRepositoryFile(cu.getProgramStreamId(), new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream(path),  "application/pdf", "pdf", ((int)new 1.5.0/docs/api/java/io/File.html">File(path).length()),cu.getCode() + ".pdf", "courseunit.program.description " + cu.getName(), ResourceAccessControlEnum.publicDomain);
        }
        cu.setObjectives(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getObjectivos());
        //Obrigar a ser falso

        //NOVO
        RepositoryFileImpl repoFile = repositoryService.loadView(cu.getProgramStreamId());
        sendPdfFtpIonline(cu,errors,u,path,repoFile.getLastVersion().getSaveDate(),null,warns);
    }


    public void sendPdfIonlineOnly(CourseUnit cu, List<String> errors,UserSession u,List<String> warns) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException {


        IRepositoryFile repoFileLastVersion = repositoryService.load(cu.getProgramStreamId(), null);

        FTPClient nullClient = null;
        sendPdfFtpIonline(cu, errors, u, repoFileLastVersion.getInput(), repoFileLastVersion.getSaveDate(), nullClient, warns);
    }


    public boolean sendPdfFtpIonline(CourseUnit cu, List<String> errors, UserSession u, FTPClient client, List<String> warns) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException
    {
        RepositoryService repositoryService = new RepositoryService();
        if(cu.getProgramStreamId() != null && cu.getProgramStreamId().length()> 0)
        {
            try
            {
                RepositoryFileImpl repoFile = repositoryService.loadView(cu.getProgramStreamId());
                1.5.0/docs/api/java/lang/String.html">String path = generatePdfFile(cu, errors, u);
                sendPdfFtpIonline(cu,errors,u,path,repoFile.getLastVersion().getSaveDate(),client,warns);
                return true;
            }
            catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
            {
                logger.error("Loading repository file: " + cu.getProgramStreamId() + " " + e.toString(),e);
            }
        }
        return false;
    }

    1.5.0/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat sdf = new 1.5.0/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat("yyyy_MM_dd.HH_mm_ss");

    private void sendPdfFtpIonline(CourseUnit cu, List<String> errors, UserSession u,5+0%2Fdocs%2Fapi+InputStream">InputStream pdfPath,5+0%2Fdocs%2Fapi+Date">Date versionDate,FTPClient client,List<String> warnings) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException {

        if(Globals.TEST_ENVIRONEMENT)
        {
            1.5.0/docs/api/java/lang/String.html">String warn = "System in TEST Environement - will NOT send file to ionline test.control.var.DontSendIonlineFiles = true";
            if(warnings != null)
                warnings.add(warn);
            logger.warn(warn);
            return;
        }
        FtpServer server = null;
        if(client == null)
        {
            server = FtpServer.getNewServer(Globals.FTP_IONLINE_URL,Globals.FTP_IONLINE_USER,Globals.FTP_IONLINE_PASS);
            client = server.getClient();
            if(client == null)
            {
                logger.warn("###################");
                logger.warn("################### > CANT CONNECT FTP - could be FTPTimeout: " + Globals.FTP_TIMEOUT_SECONDS);
                errors.add("################### > CANT CONNECT FTP to send program " + ((CourseUnitImpl)cu).getSigesUniqueIdentifiers());
                return;
            }
        }
        client.setFileType(FTP.BINARY_FILE_TYPE);

        1.5.0/docs/api/java/lang/String.html">String pastaFichaCurricular = Globals.FTP_IONLINE_START_PATH + cu.getPathIntranet() + "/" + Globals.INTRANET_DTP + "/" + Globals.INTRANET_DTP_FichaCurricular;
        if(!client.changeWorkingDirectory(pastaFichaCurricular))
        {
            logger.error("FTP CANT CHANGE TO PATH: " + pastaFichaCurricular);
        }
        else
        {
            if(!client.storeFile(cu.getCode() + "_" + cu.getNormalizedName() + "_v" + sdf.format(versionDate) + ".pdf",pdfPath))
            {
                errors.add("CANT store file in given time, probably timeout at " + Globals.FTP_DATA_STORE_TIMEOUT_SECONDS);
            }

            if(server != null)
            {
                client.quit();
                client.disconnect();
            }
        }
        //
    }

    private void sendPdfFtpIonline(CourseUnit cu, List<String> errors, UserSession u,1.5.0/docs/api/java/lang/String.html">String pdfPath,5+0%2Fdocs%2Fapi+Date">Date versionDate,FTPClient client,List<String> warnings) throws 1.5.0/docs/api/java/io/IOException.html">IOException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException {

        sendPdfFtpIonline(cu,errors,u,new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream(pdfPath),versionDate,client,warnings);
        //
    }

    private 1.5.0/docs/api/java/lang/String.html">String generatePdfFile(CourseUnit cu, List<String> errors, UserSession u) throws 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, 1.5.0/docs/api/java/io/IOException.html">IOException, FOPException {

        CourseUnitProgramImpl cProgram = (CourseUnitProgramImpl) DaoFactory.getCourseUnitProgramDaoImpl().narrow(cu.getCourseUnitProgram());
        cProgram.consistNullValues();

        5+0%2Fdocs%2Fapi+Document">Document responseDoc = DocumentHelper.createDocument();
        Namespace namespace = new Namespace("uc", "http://baco.estgp.pt/schemas/courseunits/program/");
        responseDoc.setXMLEncoding("ISO-8859-1");

        1.5.0/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat sdf = new 1.5.0/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat("dd-MM-yyyy");
        5+0%2Fdocs%2Fapi+Element">Element curriculum = responseDoc.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("UnidadeCurricular", namespace));
        curriculum.addAttribute(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("data",namespace),sdf.format(new java.util.5+0%2Fdocs%2Fapi+Date">Date()));

        5+0%2Fdocs%2Fapi+Element">Element curso = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("curso",namespace));
        if(cu.getCourseName() == null)
        {
            if(cu.getCourse() == null)
            {
                1.5.0/docs/api/java/lang/System.html">System.out.println("Unidade nao tem curso");
                curso.setText("Desactualizado");
            }
            else
            {
                1.5.0/docs/api/java/lang/System.html">System.out.println("Unidade nao tem nome no curso a actualizar com " + cu.getCourse().getName());
                curso.setText(cu.getCourse().getName());
                cu.setCourseName(cu.getCourse().getName());
            }
        }
        else
            curso.setText(cu.getCourseName());

        5+0%2Fdocs%2Fapi+Element">Element anoLectivo = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("anoLectivo",namespace));
        anoLectivo.setText(DatesUtils.getImportYearPrograms(cu.getImportYear()));

        5+0%2Fdocs%2Fapi+Element">Element unidadeCurricular = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("unidadeCurricular",namespace));
        unidadeCurricular.setText(cu.getName());

        if(cu.getResponsableTeacher() != null)
        {
            5+0%2Fdocs%2Fapi+Element">Element responsavel = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("responsavel",namespace));

            if(cu.getResponsableTeacher().getName()==null)
            {
                errors.add("Erro a carregar docente responsavel da unidade " + cu.getCode());
                responsavel.setText("erro");
            }
            else
                responsavel.setText(StringsUtils.getNormalizedName(cu.getResponsableTeacher().getName()));

            5+0%2Fdocs%2Fapi+Element">Element responsavelEmail = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("responsavelEmail",namespace));
            if(cu.getResponsableTeacher().getEmail()==null)
            {
                logger.warn("Teacher don't has email: " + cu.getResponsableTeacher().getSigesCode() + " - " + cu.getResponsableTeacher().getName());
                try {
                    1.5.0/docs/api/java/lang/Thread.html">Thread.sleep(3000);
                } catch (1.5.0/docs/api/java/lang/InterruptedException.html">InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
                responsavelEmail.setText("");
            }
            else
                responsavelEmail.setText(cu.getResponsableTeacher().getEmail());
        }


        5+0%2Fdocs%2Fapi+Element">Element apresentacaoObjectivos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("objetivosDaAprendizagem",namespace));
        apresentacaoObjectivos.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getObjectivos());


        int docenteNumber = 1;
        for(Teacher t : cu.getTeachers())
        {
            5+0%2Fdocs%2Fapi+Element">Element codigoSIGESDocente1 = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("codigoSIGESDocente" + docenteNumber,namespace));
            codigoSIGESDocente1.setText(t.getSigesCode()+"");
            5+0%2Fdocs%2Fapi+Element">Element outroDocente1 = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("outroDocente" + docenteNumber,namespace));
            if(t.getName()==null)
            {
                errors.add("Erro a carregar docente da unidade " + cu.getCode());
                outroDocente1.setText("erro");
            }
            else
                outroDocente1.setText(StringsUtils.getNormalizedName(t.getName()));
            5+0%2Fdocs%2Fapi+Element">Element docenteEmail1 = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("docenteEmail" + docenteNumber,namespace));

            if(t.getEmail()==null)
            {
                logger.warn("Teacher don't has email: " + t.getSigesCode() + " - " + t.getName());
                try {
                    1.5.0/docs/api/java/lang/Thread.html">Thread.sleep(3000);
                } catch (1.5.0/docs/api/java/lang/InterruptedException.html">InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
                docenteEmail1.setText("");
            }
            else
                docenteEmail1.setText(t.getEmail());

            docenteNumber++;
        }


        5+0%2Fdocs%2Fapi+Element">Element conteudosProgramaticos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("conteudosProgramaticos",namespace));
        conteudosProgramaticos.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getConteudos());

        5+0%2Fdocs%2Fapi+Element">Element demonstracaoCoerenciaConteudosObjectivos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("demonstracaoCoerenciaConteudosObjectivos",namespace));
        demonstracaoCoerenciaConteudosObjectivos.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getDemonstracaoCoerenciaConteudos());

        5+0%2Fdocs%2Fapi+Element">Element metodologiasEnsino = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("metodologiasEnsino",namespace));
        metodologiasEnsino.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getMetodologiasEnsino());

        5+0%2Fdocs%2Fapi+Element">Element alunosOrdinariosPorFrequencia = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("alunosOrdinariosPorFrequencia",namespace));
        alunosOrdinariosPorFrequencia.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getAvaliacaoOrdinariosFrequencia());

        5+0%2Fdocs%2Fapi+Element">Element alunosOrdinariosPorExame = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("alunosOrdinariosPorExame",namespace));
        alunosOrdinariosPorExame.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getAvaliacaoOrdinariosExame());

        5+0%2Fdocs%2Fapi+Element">Element alunosMobilidadeAlunosComEstatutoEspecialPorFrequencia = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("alunosMobilidadeAlunosComEstatutoEspecialPorFrequencia",namespace));
        alunosMobilidadeAlunosComEstatutoEspecialPorFrequencia.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getAvaliacaoEspeciaisFrequencia());

        5+0%2Fdocs%2Fapi+Element">Element alunosMobilidadeAlunosComEstatutoEspecialPorExame = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("alunosMobilidadeAlunosComEstatutoEspecialPorExame",namespace));
        alunosMobilidadeAlunosComEstatutoEspecialPorExame.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getAvaliacaoEspeciaissExame());


        5+0%2Fdocs%2Fapi+Element">Element demonstracaoDaCoerenciaMetodologiasObjectivos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("demonstracaoDaCoerenciaMetodologiasObjectivos",namespace));
        demonstracaoDaCoerenciaMetodologiasObjectivos.setText(cu.getCourseUnitProgram().getCourseUnitProgramPart2().getDemonstracaoObjectivosMetodologia());


        5+0%2Fdocs%2Fapi+Element">Element bibliografiaPrincipal = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("bibliografiaPrincipal",namespace));
        bibliografiaPrincipal.setText(cu.getCourseUnitProgram().getBibliografia());

        5+0%2Fdocs%2Fapi+Element">Element bibliografiaComplementar = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("bibliografiaComplementar",namespace));
        bibliografiaComplementar.setText(cu.getCourseUnitProgram().getBibliografiaComplementar());

        5+0%2Fdocs%2Fapi+Element">Element adaptacaoMetodologiasObjectivos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("adaptacaoMetodologiasObjectivos",namespace));
        adaptacaoMetodologiasObjectivos.setText(cu.getCourseUnitProgram().getAdaptacaoObjectivosMetodologia());

        5+0%2Fdocs%2Fapi+Element">Element verificacaoCargaECTS = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("verificacaoCargaECTS",namespace));
        verificacaoCargaECTS.setText(cu.getCourseUnitProgram().getDemonstracaoCargaEcts());

        5+0%2Fdocs%2Fapi+Element">Element avaliacaoFuncaoObjectivos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("avaliacaoFuncaoObjectivos",namespace));
        avaliacaoFuncaoObjectivos.setText(cu.getCourseUnitProgram().getGarantiaAvaliacaoFuncaObjectivos());

        5+0%2Fdocs%2Fapi+Element">Element metodologiasFacilitamParticipacaoCientificas = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("metodologiasFacilitamParticipacaoCientificas",namespace));
        metodologiasFacilitamParticipacaoCientificas.setText(cu.getCourseUnitProgram().getMetodologiasActividadeCientifica());

        5+0%2Fdocs%2Fapi+Element">Element ects = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("ects",namespace));
        ects.setText(cu.getCourseUnitProgram().getEcts());


        5+0%2Fdocs%2Fapi+Element">Element preRequisitos = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("preRequisitos",namespace));
        preRequisitos.setText(cu.getCourseUnitProgram().getPrerequisitos());

        5+0%2Fdocs%2Fapi+Element">Element obrigatoria = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("obrigatoria",namespace));
        obrigatoria.setText(cu.getCourseUnitProgram().getObrigatoria());

        5+0%2Fdocs%2Fapi+Element">Element lingua1 = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("lingua1",namespace));
        lingua1.setText(cu.getCourseUnitProgram().getLingua1());

        5+0%2Fdocs%2Fapi+Element">Element lingua2 = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("lingua2",namespace));
        lingua2.setText(cu.getCourseUnitProgram().getLingua2());

        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaT = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaT",namespace));
        cargaHorariaT.setText(cu.getCourseUnitProgram().getCargaHorariaT());
        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaTP = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaTP",namespace));
        cargaHorariaTP.setText(cu.getCourseUnitProgram().getCargaHorariaTP());
        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaPL = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaPL",namespace));
        cargaHorariaPL.setText(cu.getCourseUnitProgram().getCargaHorariaPL());
        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaS = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaS",namespace));
        cargaHorariaS.setText(cu.getCourseUnitProgram().getCargaHorariaS());
        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaTC = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaTC",namespace));
        cargaHorariaTC.setText(cu.getCourseUnitProgram().getCargaHorariaTC());
        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaO = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaO",namespace));
        cargaHorariaO.setText(cu.getCourseUnitProgram().getCargaHorariaO());
        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaOT = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaOT",namespace));
        cargaHorariaOT.setText(cu.getCourseUnitProgram().getCargaHorariaOT());

        5+0%2Fdocs%2Fapi+Element">Element cargaHorariaTotal = curriculum.addElement(new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName("cargaHorariaTotal",namespace));
        cargaHorariaTotal.setText(cu.getCourseUnitProgram().getCargaHorariaTotal());


//        Dom4jUtil.writeSout(responseDoc);


        1.5.0/docs/api/java/lang/String.html">String path = Globals.TMP_DIR + 1.5.0/docs/api/java/io/File.html">File.separator + cu.getCode() + "-" + cu.getNormalizedName() + ".pdf";
        1.5.0/docs/api/java/io/FileOutputStream.html">FileOutputStream out = new 1.5.0/docs/api/java/io/FileOutputStream.html">FileOutputStream(path);
        Map<String,Object> params = new HashMap<String,Object>();
        params.put("site", Globals.SITE_URL);
        if(cu.isValidProgram())
            params.put("validadoCC", "true");
        else
            params.put("validadoCC", "false");
        if(u != null && u.getUser() != null)
            params.put("revisor", u.getUser().getName());


        org.w3c.dom.5+0%2Fdocs%2Fapi+Document">Document dd = Dom4jUtil.toW3c(responseDoc);

        PdfUtils.createPdfFromXml(new 1.5.0/docs/api/javax/xml/transform/dom/DOMSource.html">DOMSource(dd), "pt/estgp/estgweb/services/courseunits/courseunitprogram.fo.xsl", out, params);
        out.flush();
        out.close();
        return path;
    }


    public void storeAllPrograms() throws 1.5.0/docs/api/java/io/IOException.html">IOException {
        CourseUnitDaoImpl dao = DaoFactory.getCourseUnitDaoImpl();
        1.5.0/docs/api/javax/management/Query.html">Query q = AbstractDao.getCurrentSession().createQuery("select c from c in class " + CourseUnit.class.getName() + " where c.importYear = ?");
        q.setString(0,DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear());
        Iterator<CourseUnit> cuIter = q.iterate();
        FtpServer server = FtpServer.getNewServer(Globals.FTP_IONLINE_URL,Globals.FTP_IONLINE_USER,Globals.FTP_IONLINE_PASS);
        FTPClient client = server.getClient();
        if(client == null)
        {
            logger.warn("###################");
            logger.warn("################### > CANT CONNECT FTP");
            return;
        }
        while (cuIter.hasNext()) {
            CourseUnit next = cuIter.next();

            try {
                List<String> errors = new ArrayList<String>();
                1.5.0/docs/api/java/lang/System.html">System.out.print("Sending " + next.getCourse().getName() + " - " + next.getSemestre() + " - " + next.getNormalizedName());
                if(sendPdfFtpIonline(next,errors,null,client,null))
                    1.5.0/docs/api/java/lang/System.html">System.out.print(" ... OK");
                else
                    1.5.0/docs/api/java/lang/System.html">System.out.print(" ... FAIL probably no StreamID");
                1.5.0/docs/api/java/lang/System.html">System.out.print("\n");
                if(errors.size()>0)
                    for(1.5.0/docs/api/java/lang/String.html">String error:errors)
                        logger.warn(error);
            } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
                logger.error(e,e);
            } catch (1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException e) {
                logger.error(e, e);
            } catch (FOPException e) {
                e.printStackTrace();
            }catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
                e.printStackTrace();
            }

            AbstractDao.getCurrentSession().evict(next);
        }
        client.quit();
        client.disconnect();

    }


        public static void main(1.5.0/docs/api/java/lang/String.html">String[] args) throws 1.5.0/docs/api/java/io/IOException.html">IOException {

            AbstractDao.getCurrentSession().beginTransaction();
            new SaveCourseUnitProgram().storeAllPrograms();
            AbstractDao.getCurrentSession().flush();
            AbstractDao.getCurrentSession().getTransaction().commit();
        }

}