Subversion Repositories bacoAlunos

Rev

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

package pt.estgp.estgweb.services.courses;

import org.apache.log4j.Logger;
import pt.estgp.estgweb.services.courses.xsd.*;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Created by jorgemachado on 17/10/16.
 */

public class StudiesPlanImporter
{
    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(StudiesPlanImporter.class);

     List<String> foundErrors = new ArrayList<String>();
     List<String> notRegularLines = new ArrayList<String>();

     boolean status = true;
     List<StudiesPlanImportLine> lines = new ArrayList<StudiesPlanImportLine>();

     1.5.0/docs/api/java/lang/String.html">String descPlanoSiges;
     1.5.0/docs/api/java/lang/String.html">String codPlanoSiges;
     1.5.0/docs/api/java/lang/String.html">String anoPlanoSiges;

     int codPos;
     int descDiscipPos;
     int asPos;
     int duracaoPos;
     int dispPos;
     int tPratPos;
     int pratPos;
     int teoPos;
     int spePos;
     int totalHorasPos;
     int ectsPos;
     int creditosPos;
     int cicloPos;
     int planoPos;
     int ramoPos;
     int getDescHrCampoPos;

    int totalUnidadesEsperadas = 0;

    1.5.0/docs/api/java/lang/String.html">String log;

    public  void initHeadersPos(1.5.0/docs/api/java/lang/String.html">String headers)
    {
        codPos = headers.indexOf("Cód.");
        descDiscipPos = headers.indexOf("Desc. Discip.");
        asPos = headers.indexOf("A/S");
        duracaoPos = headers.indexOf("Duração");
        dispPos = headers.indexOf("Disp.");
        tPratPos = headers.indexOf("T.Prát");
        pratPos = headers.indexOf("Prát ",tPratPos + "T.Prát".length());
        teoPos = headers.indexOf("Teo.");
        spePos = headers.indexOf("S/P/E");
        totalHorasPos = headers.indexOf("Tot. Horas");
        ectsPos = headers.indexOf("ECTS");
        creditosPos = headers.indexOf("Créditos");
        cicloPos = headers.indexOf("Ciclo");
        planoPos = headers.indexOf("Plano");
        ramoPos = headers.indexOf("Ramo");
        getDescHrCampoPos = headers.indexOf("Desc. Hr. Campo");

    }

    public static class StudiesPlanImportLine
    {
        int cod;
        1.5.0/docs/api/java/lang/String.html">String nomeDisciplina;
        1.5.0/docs/api/java/lang/String.html">String ano;
        1.5.0/docs/api/java/lang/String.html">String duracao; //not used
        1.5.0/docs/api/java/lang/String.html">String semestre;
        1.5.0/docs/api/java/lang/String.html">String teoricoPratica;
        1.5.0/docs/api/java/lang/String.html">String pratica;
        1.5.0/docs/api/java/lang/String.html">String teorica;
        1.5.0/docs/api/java/lang/String.html">String spe; //not used
        1.5.0/docs/api/java/lang/String.html">String totalHoras;
        1.5.0/docs/api/java/lang/String.html">String ects;
        1.5.0/docs/api/java/lang/String.html">String creditos; //not used
        1.5.0/docs/api/java/lang/String.html">String plano; //not used
        1.5.0/docs/api/java/lang/String.html">String ramo;
        boolean troncoComum;
        1.5.0/docs/api/java/lang/String.html">String descHrCampo; //not used


        public 1.5.0/docs/api/java/lang/String.html">String getCodigoDuracao()
        {
            if(semestre.equals("S1") && ano.equals("1"))
            {
                return "S1";
            }else if(semestre.equals("S2") && ano.equals("1"))
            {
                return "S2";
            }else if(semestre.equals("S1") && ano.equals("2"))
            {
                return "S3";
            }else if(semestre.equals("S2") && ano.equals("2"))
            {
                return "S4";
            }else if(semestre.equals("S1") && ano.equals("3"))
            {
                return "S5";
            }else if(semestre.equals("S2") && ano.equals("3"))
            {
                return "S6";
            }else if(semestre.equals("S1") && ano.equals("4"))
            {
                return "S7";
            }else if(semestre.equals("S2") && ano.equals("4"))
            {
                return "S8";
            }else if(semestre.equals("T1") && ano.equals("1"))
            {
                return "T1";
            }else if(semestre.equals("T2") && ano.equals("1"))
            {
                return "T2";
            }else if(semestre.equals("T3") && ano.equals("1"))
            {
                return "T3";
            }else if(semestre.equals("T4") && ano.equals("1"))
            {
                return "T4";
            }else if(semestre.equals("T1") && ano.equals("2"))
            {
                return "T5";
            }else if(semestre.equals("T2") && ano.equals("2"))
            {
                return "T6";
            }else if(semestre.equals("T3") && ano.equals("2"))
            {
                return "T7";
            }else if(semestre.equals("T4") && ano.equals("2"))
            {
                return "T8";
            }else if(semestre.equals("A") && ano.equals("1"))
            {
                return "A1";
            }else if(semestre.equals("A") && ano.equals("2"))
            {
                return "A2";
            }else if(semestre.equals("A") && ano.equals("3"))
            {
                return "A3";
            }else if(semestre.equals("A") && ano.equals("4"))
            {
                return "A4";
            }
            return "?";
        }

        @1.5.0/docs/api/java/lang/Override.html">Override
        public 1.5.0/docs/api/java/lang/String.html">String toString() {
            return "StudiesPlanImportLine{" +
                    "cod=" + cod +
                    ", nomeDisciplina='" + nomeDisciplina + '\'' +
                    ", ano='" + ano + '\'' +
                    ", duracao='" + duracao + '\'' +
                    ", semestre='" + semestre + '\'' +
                    ", codDuracaoGen='" + getCodigoDuracao()  + '\'' +
                    ", teoricoPratica='" + teoricoPratica + '\'' +
                    ", pratica='" + pratica + '\'' +
                    ", teorica='" + teorica + '\'' +
                    ", spe='" + spe + '\'' +
                    ", totalHoras='" + totalHoras + '\'' +
                    ", ects='" + ects + '\'' +
                    ", creditos='" + creditos + '\'' +
                    ", plano='" + plano + '\'' +
                    ", ramo='" + ramo + '\'' +
                    ", troncoComum=" + troncoComum +
                    '}';
        }
    }

    private StudiesPlanImportLine parse(1.5.0/docs/api/java/lang/String.html">String line)
    {

        try{

            if(line.length() > codPos)
            {
                int endCodPos = line.indexOf(" ",codPos);
                if(endCodPos >= 0)
                {
                    StudiesPlanImportLine planImportLine = new StudiesPlanImportLine();
                    try{
                        planImportLine.cod = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.substring(codPos,endCodPos));

                        try{
                            planImportLine.nomeDisciplina = line.substring(descDiscipPos,asPos).trim();
                            planImportLine.ano = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.substring(asPos,asPos+1).trim()) + "";
                            //planImportLine.duracao = line.substring(descDiscipPos,asPos).trim();
                            planImportLine.semestre = line.substring(dispPos,tPratPos).trim();
                            planImportLine.teoricoPratica = line.substring(tPratPos,pratPos).trim();
                            planImportLine.teoricoPratica = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(planImportLine.teoricoPratica.substring(0,planImportLine.teoricoPratica.indexOf(":"))) + "";
                            planImportLine.pratica = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.substring(pratPos,teoPos).trim()) + "";
                            planImportLine.teorica = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.substring(teoPos,spePos).trim()) + "";
                            //planImportLine.spe = line.substring(spePos,totalHorasPos).trim();
                            planImportLine.totalHoras =  line.substring(totalHorasPos,ectsPos).trim();
                            planImportLine.totalHoras = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(planImportLine.totalHoras.substring(0,planImportLine.totalHoras.indexOf(":")))  +"";
                            planImportLine.ects = line.substring(ectsPos,creditosPos).trim();
                            //planImportLine.creditos = line.substring(creditosPos,cicloPos).trim();
                            //planImportLine.plano = line.substring(planoPos,ramoPos).trim();
                            planImportLine.ramo = line.substring(ramoPos,getDescHrCampoPos).trim();
                            planImportLine.troncoComum = planImportLine.ramo.equalsIgnoreCase("Tronco Comum");

                            return  planImportLine;
                        }catch(1.5.0/docs/api/java/lang/NumberFormatException.html">NumberFormatException e)
                        {
                            1.5.0/docs/api/java/lang/String.html">String error = "At line: [" + line + "] found error: " + e.toString();
                            foundErrors.add(error);
                            status = false;
                        }
                    }
                    catch(1.5.0/docs/api/java/lang/NumberFormatException.html">NumberFormatException eCodigo)
                    {
                        if(line.indexOf("Total:")>=0)
                        {
                            totalUnidadesEsperadas = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.substring(line.indexOf("Total:") + "Total:".length()).trim());
                        }
                        1.5.0/docs/api/java/lang/System.html">System.out.println("Found line to garbage:" + line);
                        notRegularLines.add("Found line to garbage:" + line);
                    }

                }
            }
        }catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable t)
        {
            1.5.0/docs/api/java/lang/String.html">String error = "At line: [" + line + "] found error: " + t.toString();
            foundErrors.add(error);
            logger.error(error,t);
            status = false;
        }
        return null;
    }

    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 {
        StudiesPlanImporter importer = new StudiesPlanImporter();
        importer.parseFile(new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream("/Volumes/Home/jorgemachado/Downloads/9556-Hig.Oral.TXT"));

        if(importer.isStatus())
        {
            1.5.0/docs/api/java/lang/System.html">System.out.println("Import success");
            if(importer.isEsperadasOk())
            {
                1.5.0/docs/api/java/lang/System.html">System.out.println("TOTAL DE ESPERADAS COINCIDE " + importer.getTotalUnidadesEsperadas());
            }
            else
            {
                1.5.0/docs/api/java/lang/System.html">System.out.println("AVISO!!!!: TOTAL DE ESPERADAS DE " + importer.getTotalUnidadesEsperadas() + " NAO COINCIDE COM AS UNIDADES ENCONTRADAS" + importer.getLines().size());
            }
        }
        else
        {
            1.5.0/docs/api/java/lang/System.html">System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            1.5.0/docs/api/java/lang/System.html">System.out.println("Found errors");
            for(1.5.0/docs/api/java/lang/String.html">String error: importer.getFoundErrors())
                1.5.0/docs/api/java/lang/System.html">System.out.println(error);
        }
        1.5.0/docs/api/java/lang/System.html">System.out.println("####################################");
        1.5.0/docs/api/java/lang/System.html">System.out.println("Found lines");
        for(StudiesPlanImportLine line: importer.getLines())
        {
            1.5.0/docs/api/java/lang/System.html">System.out.println(line);
        }
    }

    public void parseFile(5+0%2Fdocs%2Fapi+InputStream">InputStream stream) throws 1.5.0/docs/api/java/io/IOException.html">IOException {

        1.5.0/docs/api/java/io/BufferedReader.html">BufferedReader reader = new 1.5.0/docs/api/java/io/BufferedReader.html">BufferedReader(new 1.5.0/docs/api/java/io/InputStreamReader.html">InputStreamReader(stream,"ISO-8859-1"));
        1.5.0/docs/api/java/lang/String.html">String line;
        reader.readLine();//
        reader.readLine();
        1.5.0/docs/api/java/lang/String.html">String planDescription = reader.readLine();

        descPlanoSiges = planDescription;
        try{
        int codigoPlanoPos = descPlanoSiges.indexOf("Cód. Plano:");
        if(codigoPlanoPos >= 0)
        {
            int posTraco = planDescription.indexOf("-",codigoPlanoPos);
            codPlanoSiges = planDescription.substring(codigoPlanoPos + "Cód. Plano:".length(),posTraco).trim();
            anoPlanoSiges = planDescription.substring(posTraco + 1,planDescription.indexOf(" ",posTraco + 4)).trim();
            1.5.0/docs/api/java/lang/System.html">System.out.println("Encontrado Ano do Plano Siges: " + anoPlanoSiges);
            1.5.0/docs/api/java/lang/System.html">System.out.println("Encontrado Codigo do Plano Siges: " + codPlanoSiges);
        }
        }catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable t)
        {
            1.5.0/docs/api/java/lang/String.html">String error = "At line: [" + planDescription + "] found error: " + t.toString();
            foundErrors.add(error);
            logger.error(error,t);
            status = false;
        }

        1.5.0/docs/api/java/lang/String.html">String headers = reader.readLine();
        1.5.0/docs/api/java/lang/System.html">System.out.println("Found following headers: " + headers);
        initHeadersPos(headers);

        while((line = reader.readLine())!= null)
        {
            StudiesPlanImportLine planImportLine = parse(line);
            if(planImportLine != null)
            {
                lines.add(planImportLine);

            }
        }
        reader.close();

        1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder log = new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
        if(isStatus())
        {
            log.append("Import success" + "\n");
            if(isEsperadasOk())
            {
                log.append("TOTAL DE ESPERADAS COINCIDE " + getTotalUnidadesEsperadas() + "\n");
            }
            else
            {
                log.append("AVISO!!!!: TOTAL DE ESPERADAS DE " + getTotalUnidadesEsperadas() + " NAO COINCIDE COM AS UNIDADES ENCONTRADAS" + getLines().size() + "\n");
            }
        }
        else
        {
            log.append("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + "\n");
            log.append("Found errors" + "\n");
            for(1.5.0/docs/api/java/lang/String.html">String error: getFoundErrors())
                log.append(error);
        }



        log.append("Ignored Lines:  \n");
        for(1.5.0/docs/api/java/lang/String.html">String notRegular: notRegularLines){
            log.append(notRegular + "\n");
        }


        log.append("####################################" + "\n");
        log.append("Descrição do Plano: \n");
        log.append(descPlanoSiges);
        log.append("Found lines"+ "\n");
        for(StudiesPlanImportLine lineSP: getLines())
        {
            log.append(lineSP + "\n");
        }
        this.log = log.toString();

    }

    public List<String> getFoundErrors() {
        return foundErrors;
    }

    public boolean isStatus() {
        return status;
    }

    public boolean isEsperadasOk() {
        return lines.size() == totalUnidadesEsperadas;
    }

    public List<StudiesPlanImportLine> getLines() {
        return lines;
    }

    public 1.5.0/docs/api/java/lang/String.html">String getLog() {
        return log;
    }

    public int getTotalUnidadesEsperadas() {
        return totalUnidadesEsperadas;
    }

    public List<String> getNotRegularLines() {
        return notRegularLines;
    }

    public Curso getPlanoEstudosCurso()
    {

        HashMap<String,Curso.Semestre> semestresMap = new HashMap<String, Curso.Semestre>();
        HashMap<String,Curso.Semestre.Perfil> perfilMap = new HashMap<String, Curso.Semestre.Perfil>();

        Curso curso = new CursoImpl();
        curso.setAnoPlanoSiges(anoPlanoSiges);
        curso.setCodigoPlanoSiges(codPlanoSiges);
        curso.setDescPlanoSiges(descPlanoSiges);
        //curso.setNome(); sao preenchidos automaticamente no SAVE do plano no servico
        //curso.setSiges();
        //curso.setDep();
        List<Curso.Semestre> semestres = new ArrayList<Curso.Semestre>();
        for(StudiesPlanImportLine line: lines)
        {
            Curso.Semestre semestre = semestresMap.get(line.getCodigoDuracao());
            if(semestre == null)
            {
                semestre = new SemestreImpl();
                semestresMap.put(line.getCodigoDuracao(),semestre);
                semestre.setId(line.getCodigoDuracao());
                semestres.add(semestre);
            }

            UnidadeImpl unidade = new UnidadeImpl();
            unidade.setNome(line.nomeDisciplina);
            unidade.setECTS(line.ects);
            unidade.setSiges("" + line.cod);
            unidade.setTotalHoras(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.totalHoras));
            unidade.setHorasContacto(new UnidadeType.HorasContacto());
            unidade.getHorasContacto().setT(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.teorica));
            unidade.getHorasContacto().setTP(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.teoricoPratica));
            unidade.getHorasContacto().setT(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.pratica));
            unidade.getHorasContacto().setT(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(line.teorica));

            if(!line.troncoComum)
            {
                Curso.Semestre.Perfil perfil = perfilMap.get(semestre.getId() + "$" + line.ramo);
                if(perfil == null)
                {
                    perfil = new PerfilImpl();
                    perfil.setNome(line.ramo);
                    perfilMap.put(semestre.getId() + "$" + line.ramo,perfil);
                    semestre.getPerfil().add(perfil);
                }
                perfil.getUnidade().add(unidade);
            }
            else
            {
                semestre.getUnidade().add(unidade);
            }
        }
        curso.getSemestre().addAll(semestres);
        return curso;
    }


}