package pt.estgp.estgweb.services.sigesimports;
import jomm.dao.impl.AbstractDao;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.services.courseunits.SaveCourseUnitProgram;
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.DatesUtils;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author Jorge Machado
*/
public class SincronizeLastYearCourseUnitProgramsService
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(SincronizeLastYearCourseUnitProgramsService.
class);
private static final int MAX_COMMIT =
100;
public ILogMessages run
(1.5.0/docs/api/java/lang/String.html">String year,
1.5.0/docs/api/java/lang/String.html">String semestre,
boolean cloneOnlyNews,
boolean generateAllPdfs
) throws ServiceException
{
return run
( year,semestre, cloneOnlyNews, generateAllPdfs,
false);
}
/**
* DESCRICAO DE SERVICO
*
* Unidades sem ficha �-lhes atribuida a ficha do ano anterior,
* 1� � atribuido o mesmo professor como respons�vel
* 2� a Ficha � clonada
* 3� a Ficha fica com estado de n�o validada
*
* Restri��es por ordem de prioridade
* - Fichas com estado validadas n�o s�o clonadas
* - Fichas invalidas poder�o ser clonadas se:
* - N�o existir ficha
* - ou para fichas j� clonadas apenas s�o clonadas novamente se a condi��o
* de entrada cloneOnlyNews for false
*
* @param year
* @param cloneOnlyNews
* @return
* @throws ServiceException
*/
public ILogMessages run
(1.5.0/docs/api/java/lang/String.html">String year,
1.5.0/docs/api/java/lang/String.html">String semestre,
boolean cloneOnlyNews,
boolean generateAllPdfs,
boolean validate
) throws ServiceException
{
1.5.0/docs/api/java/lang/String.html">String msgS =
"STARTING SUMARIES IMPORT SERVICE FOR year: " + year +
" semestre: " + semestre +
" cloneOnlyNews: " + cloneOnlyNews +
" generateAllPdfs: " + generateAllPdfs +
" validate: " + validate
;
serviceLogInfo
(msgS
);
logger.
info(msgS
);
int foundTotal =
0;
int found =
0;
int updated=
0;
List
<String
> naoAfectadasPermissao =
new ArrayList
<String
>();
List
<String
> clonados =
new ArrayList
<String
>();
List
<String
> foundnprog =
new ArrayList
<String
>();
List
<String
> nfound =
new ArrayList
<String
>();
List
<String
> notChangedNotNew =
new ArrayList
<String
>();
1.5.0/docs/api/java/lang/String.html">String importYearBefore = DatesUtils.
getImportYearBefore(year
);
DefaultLogMessages logMessages =
new DefaultLogMessages
();
try
{
logMessages.
addMessage(new DefaultLogMessage
("courseunitprograms.sincronization", LogMessageTypeEnum.
INFO,
"instituicao " + DaoFactory.
getConfigurationDaoImpl().
getSigesInstitutionCode()));
serviceLogInfo
(logMessages.
getLastMessage());
int i =
0;
List
<Long
> units = DaoFactory.
getCourseUnitDaoImpl().
loadIds(year,semestre
);
//List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadYear(year);
for (1.5.0/docs/api/java/lang/Long.html">Long cuId: units
)
// for (CourseUnit cu: units)
{
SaveCourseUnitProgram service =
new SaveCourseUnitProgram
();
foundTotal++
;
if (i++
> MAX_COMMIT
)
{
i =
0;
setProgress
((int) (((float)foundTotal
)/
((float)units.
size())*100.0f
));
commitPartially
();
}
CourseUnit cu = DaoFactory.
getCourseUnitDaoImpl().
load(cuId
);
if(cu.
getCourseUnitProgram() ==
null ||
!cloneOnlyNews
)
{
//todo cuidado que ignoro o semestre
List
<CourseUnit
> lista = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUniqueWithProgram(cu.
getCode(), cu.
getCourseCode());
if(lista
!=
null && lista.
size() > 0
)
{
1.5.0/docs/api/java/lang/String.html">String msg = cu.
getCourseUnitProgram() ==
null ? "OK - Unit siges: " + cu.
getCode() +
" without program will try found old to clone"
:
"OK - Unit siges: " + cu.
getCode() +
" cloning will check validation to found an old unit to clone";
logger.
info(msg
);
serviceLogInfo
(msg
);
CourseUnit cuOld = lista.
get(0
);
if(cuOld.
getCourseUnitProgram() !=
null)
{
found++
;
if(cuOld.
getResponsableTeacher() !=
null && cu.
getResponsableTeacher() ==
null)
cu.
setResponsableTeacher(cuOld.
getResponsableTeacher());
boolean novaFicha =
false;
if(cu.
getCourseUnitProgram() ==
null)
{
serviceLogInfo
("Ficha NOVA nao existe vai tentar clonar");
novaFicha =
true;
CourseUnitProgram program =
new CourseUnitProgramImpl
();
DaoFactory.
getCourseUnitProgramDaoImpl().
save(program
);
program.
setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl
());
DaoFactory.
getCourseUnitProgramPart2DaoImpl().
save(program.
getCourseUnitProgramPart2());
cu.
setCourseUnitProgram(program
);
}
//So clona a ficha no caso de nao estar validada pelo CC
if(novaFicha ||
(!cu.
isValidProgram() && !cloneOnlyNews
))
{
if(!novaFicha
)
serviceLogInfo
("Clonando Ficha de unidade ja existente mas nao valida");
updated++
;
CourseUnitProgramImpl cProgram =
(CourseUnitProgramImpl
) DaoFactory.
getCourseUnitProgramDaoImpl().
narrow(cu.
getCourseUnitProgram());
cProgram.
cloneFrom(cuOld.
getCourseUnitProgram());
List
<String
> errors =
new ArrayList
<String
>();
List
<String
> warnings =
new ArrayList
<String
>();
clonados.
add(cu.
getCode());
cu.
setValidProgram(validate
);
service.
createPdf(cu,errors
);
if(errors.
size() > 0
)
{
for(1.5.0/docs/api/java/lang/String.html">String error:errors
)
{
serviceLogError
(error
);
logMessages.
addMessage(new DefaultLogMessage
("Unit: " + cu.
getCode() +
" ERROR generating PDF:" + error, LogMessageTypeEnum.
ERROR));
serviceLogError
(logMessages.
getLastMessage());
logger.
error(logMessages.
getLastMessage());
}
}
if(warnings.
size() > 0
)
{
for(1.5.0/docs/api/java/lang/String.html">String warning: warnings
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.warning",LogMessageTypeEnum.
WARNING,
"Unit: " + cu.
getCode() +
" Warning generating PDF:" + warning
));
serviceLogWarn
(logMessages.
getLastMessage());
logger.
warn(logMessages.
getLastMessage());
}
}
}
else
{
naoAfectadasPermissao.
add(cu.
getCode());
if(cu.
isValidProgram())
serviceLogInfo
("Ficha nao alterada. razao: VALIDADA");
else
serviceLogInfo
("Ficha nao alterada. razao: cloneOnlyNews=true");
}
}
else
{
foundnprog.
add(cu.
getCode());
1.5.0/docs/api/java/lang/String.html">String msgN =
"FOUND OLD Unit siges: " + cu.
getCode() +
" OK but NO program to clone";
logger.
warn(msgN
);
serviceLogWarn
(msgN
);
}
}
else
{
nfound.
add(cu.
getCode());
1.5.0/docs/api/java/lang/String.html">String msg =
"NOT FOUND OLD for - Unit siges: " + cu.
getCode();
logger.
info(msg
);
serviceLogWarn
(msg
);
}
}
else
{
notChangedNotNew.
add(cu.
getCode());
serviceLogInfo
(cu.
getCode() +
" Ficha nao alterada. razao: cloneOnlyNews=true");
if(generateAllPdfs
)
{
List
<String
> errors =
new ArrayList
<String
>();
if(cu.
getCourseUnitProgram() !=
null)
service.
createPdf(cu,errors
);
}
}
//cu.setValidProgram(true);
}
setProgress
(100
);
logger.
info("######################################");
serviceLogInfo
("######################################");
logger.
info("######################################");
serviceLogInfo
("######################################");
logger.
info("STATS " + year
);
serviceLogInfo
("STATS " + year
);
logger.
info("Total Analisadas: " + foundTotal
);
serviceLogInfo
("Total Analisadas: " + foundTotal
);
logger.
info("CANDIDATAS - Unidades antigas encontrada com programa : " + found
);
serviceLogInfo
("CANDIDATAS - Unidades antigas encontrada com programa : " + found
);
logger.
info("NADA FEITO - Unidade antiga encontrada mas sem programa: " + foundnprog.
size());
serviceLogInfo
("NADA FEITO - Unidade antiga encontrada mas sem programa: " + foundnprog.
size());
logger.
info("NADA FEITO - Unidade antiga nao encontrada: " + nfound.
size());
serviceLogInfo
("NADA FEITO - Unidade antiga nao encontrada: " + nfound.
size());
logger.
info("OK - Programas CLONADOS: " + updated
);
serviceLogInfo
("OK - Programas CLONADOS: " + updated
);
logger.
info("NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS: " + naoAfectadasPermissao.
size());
serviceLogInfo
("NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS: " + naoAfectadasPermissao.
size());
if(cloneOnlyNews
)
{
logger.
info("NAO PERMITIDA (cloneOnlyNews = true) - Nao alterada por ja existir programa: " + notChangedNotNew.
size());
serviceLogInfo
("NAO PERMITIDA (cloneOnlyNews = true) - Nao alterada por ja existir programa: " + notChangedNotNew.
size());
}
logger.
info("######################################");
logger.
info("###NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS (SIGES CODE):");
serviceLogInfo
("######################################");
serviceLogInfo
("###NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS (SIGES CODE):");
for(1.5.0/docs/api/java/lang/String.html">String c : naoAfectadasPermissao
)
{
logger.
info(c
);
serviceLogInfo
(c
);
}
logger.
info("###OK - Programas CLONADOS (SIGES CODE):");
serviceLogInfo
("###OK - Programas CLONADOS (SIGES CODE):");
for(1.5.0/docs/api/java/lang/String.html">String c : clonados
)
{
logger.
info(c
);
serviceLogInfo
(c
);
}
logger.
info("###NADA FEITO - Unidade antiga encontrada sem programa (SIGES CODE):");
serviceLogInfo
("###NADA FEITO - Unidade antiga encontrada sem programa (SIGES CODE):");
for(1.5.0/docs/api/java/lang/String.html">String c : foundnprog
)
{
logger.
info(c
);
serviceLogInfo
(c
);
}
logger.
info("###NADA FEITO - Unidade antiga nao encontrada (SIGES CODE):");
serviceLogInfo
("###NADA FEITO - Unidade antiga nao encontrada (SIGES CODE):");
for(1.5.0/docs/api/java/lang/String.html">String c : nfound
)
{
logger.
info(c
);
serviceLogInfo
(c
);
}
if(cloneOnlyNews
)
{
logger.
info("###NAO PERMITIDA (cloneOnlyNews) - Nao alterada por ja existir programa (SIGES CODE):");
serviceLogInfo
("###NAO PERMITIDA (cloneOnlyNews) - Nao alterada por ja existir programa (SIGES CODE):");
for(1.5.0/docs/api/java/lang/String.html">String c : notChangedNotNew
)
{
logger.
info(c
);
serviceLogInfo
(c
);
}
}
}
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
(e.
toString(),e
);
}
logger.
info("terminating programs sincronization");
serviceLogInfo
("terminating programs sincronization");
logMessages.
addMessage(new DefaultLogMessage
("courseunitprograms.sincronization.terminating", LogMessageTypeEnum.
INFO));
return logMessages
;
}
/**
* Load all importYear on format 201213 201314 from units of previous ant forward years from the given unit
* The search clause is based on sigesCode and CourseSigesCode
* @param courseUnitId pattern unit to search for
* @return sorted list of importYears
*/
public List
<String
> findOtherYearsWithProgram
(long courseUnitId,UserSession sess
)
{
CourseUnit u = DaoFactory.
getCourseUnitDaoImpl().
load(courseUnitId
);
List
<CourseUnit
> cus = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodes(u.
getCode(),u.
getCourseCode());
List
<String
> importYears =
new ArrayList
<String
>();
for(CourseUnit cu : cus
)
{
if( cu.
getImportYear() !=
null && !cu.
getImportYear().
equals(u.
getImportYear()) &&
!importYears.
contains(cu.
getImportYear())
&&
cu.
getCourseUnitProgram() !=
null)
importYears.
add(cu.
getImportYear());
}
1.5.0/docs/api/java/util/Collections.html">Collections.
sort(importYears,
new Comparator
<String
>() {
@
1.5.0/docs/api/java/lang/Override.html">Override
public int compare
(1.5.0/docs/api/java/lang/String.html">String o1,
1.5.0/docs/api/java/lang/String.html">String o2
) {
return o1.
compareTo(o2
);
}
});
return importYears
;
}
/**
* Load all units of previous ant forward years from the given unit
* The search clause is based on sigesCode and CourseSigesCode
* @param courseUnitId pattern unit to search for
* @return sorted list of units with all information inside
*/
public List
<CourseUnitView
> findOtherUnitsWithProgram
(1.5.0/docs/api/java/lang/Long.html">Long courseUnitId,UserSession sess
)
{
CourseUnit u = DaoFactory.
getCourseUnitDaoImpl().
load(courseUnitId
);
List
<CourseUnit
> cus = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodes(u.
getCode(),u.
getCourseCode());
List
<CourseUnitView
> views =
new ArrayList
<CourseUnitView
>();
for(CourseUnit cu : cus
)
{
if( cu.
getImportYear() !=
null && !cu.
getImportYear().
equals(u.
getImportYear()) &&
!views.
contains(cu.
getImportYear())
&&
cu.
getCourseUnitProgram() !=
null)
views.
add(new CourseUnitView
(cu
));
}
1.5.0/docs/api/java/util/Collections.html">Collections.
sort(views,
new Comparator
<CourseUnitView
>() {
@
1.5.0/docs/api/java/lang/Override.html">Override
public int compare
(CourseUnitView o1, CourseUnitView o2
) {
return o1.
getImportYear().
compareTo(o2.
getImportYear());
}
});
return views
;
}
/**
* Given a courseunit the target intoUnit will have a cloned program from the fromUnit
* The PDF file is Generated and saved into repository with SaveCourseUnitProgram Service
* @param fromUnitId from unit
* @param intoUnitId target unit
* @return the cloned courseunit program
*/
public CourseUnitProgram cloneProgram
(long fromUnitId,
long intoUnitId,UserSession sess
)
{
CourseUnit cuFrom = DaoFactory.
getCourseUnitDaoImpl().
load(fromUnitId
);
CourseUnit cuInto = DaoFactory.
getCourseUnitDaoImpl().
load(intoUnitId
);
if(cuInto.
getCourseUnitProgram() ==
null)
{
CourseUnitProgram program =
new CourseUnitProgramImpl
();
DaoFactory.
getCourseUnitProgramDaoImpl().
save(program
);
program.
setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl
());
DaoFactory.
getCourseUnitProgramPart2DaoImpl().
save(program.
getCourseUnitProgramPart2());
cuInto.
setCourseUnitProgram(program
);
cuInto.
setValidProgram(false);
}
CourseUnitProgramImpl cProgram =
(CourseUnitProgramImpl
) DaoFactory.
getCourseUnitProgramDaoImpl().
narrow(cuInto.
getCourseUnitProgram());
cProgram.
cloneFrom(cuFrom.
getCourseUnitProgram());
DaoFactory.
getCourseUnitProgramDaoImpl().
saveOrUpdate((cuInto.
getCourseUnitProgram()));
DaoFactory.
getCourseUnitProgramPart2DaoImpl().
saveOrUpdate((cuInto.
getCourseUnitProgram()).
getCourseUnitProgramPart2());
SaveCourseUnitProgram service =
new SaveCourseUnitProgram
();
List
<String
> errors =
new ArrayList
<String
>();
try {
//Cria PDF's e envia-os para o i.online
service.
createPdf(cuInto,errors
);
} catch (1.5.0/docs/api/java/io/IOException.html">IOException e
) {
e.
printStackTrace();
} catch (1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException e
) {
logger.
error(e,e
);
} catch (FOPException e
) {
logger.
error(e, e
);
}
return cuInto.
getCourseUnitProgram();
}
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
];
boolean cloneOnlyNews =
true;
if(args
!=
null && args.
length > 1
)
cloneOnlyNews =
1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(args
[1
]);
boolean generateAllPdfs =
false;
if(args
!=
null && args.
length > 2
)
generateAllPdfs =
1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(args
[2
]);
1.5.0/docs/api/java/lang/String.html">String semestre =
null;
if(args
!=
null && args.
length > 2
)
semestre = args
[3
];
else
throw new ServiceException
("Nao pode correr este serviço sem escolher semestre");
AbstractDao.
getCurrentSession().
beginTransaction();
new SincronizeLastYearCourseUnitProgramsService
().
run(year,semestre,cloneOnlyNews,generateAllPdfs
);
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
/**
* Parameters for ServiceJob
* importYear : String
* cloneOnlyNews : Boolean
* generateAllPdfs : Boolean
*
* @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
{
1.5.0/docs/api/java/lang/String.html">String importYear = getParametersMap
().
get(JOB_importYear_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String semestre = getParametersMap
().
get(JOB_semestre_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String cloneOnlyNewsStr = getParametersMap
().
get(JOB_cloneOnlyNews_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String generateAllPdfsStr = getParametersMap
().
get(JOB_generateAllPdfs_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String validateStr = getParametersMap
().
get(JOB_validate_KEY
).
getObject();
boolean cloneOnlyNews = cloneOnlyNewsStr
!=
null && 1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(cloneOnlyNewsStr
);
boolean generateAllPdfs = generateAllPdfsStr
!=
null && 1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(generateAllPdfsStr
);
boolean validate = validateStr
!=
null && 1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(validateStr
);
return run
(importYear,semestre,cloneOnlyNews,generateAllPdfs,validate
);
}
public boolean runOnlyOnDemand
()
{
return true;
}
}