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
;
}
}