package pt.estgp.estgweb.services.sigesimports;
import com.lowagie.text.pdf.SimpleBookmark;
import jomm.dao.impl.AbstractDao;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
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.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 sun.tools.java.Imports;
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
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);
/**
* 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,
boolean cloneOnlyNews,
boolean generateAllPdfs
) throws ServiceException
{
1.5.0/docs/api/java/lang/System.html">System.
out.
println("Using year = " + year
);
1.5.0/docs/api/java/lang/System.html">System.
out.
println("Using only news = " + cloneOnlyNews
);
int foundTotal =
0;
int found =
0;
int updated=
0;
List
<String
> foundnprog =
new ArrayList
<String
>();
List
<String
> nfound =
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 " + Globals.
SIGES_INSTITUTION_CODE));
logger.
info("S1");
List
<CourseUnit
> units = DaoFactory.
getCourseUnitDaoImpl().
loadYear(year
);
for (CourseUnit cu: units
)
{
SaveCourseUnitProgram service =
new SaveCourseUnitProgram
();
foundTotal++
;
if(cu.
getCourseUnitProgram() ==
null ||
!cloneOnlyNews
)
{
List
<CourseUnit
> lista = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUnique(cu.
getCode(),cu.
getCourseCode(),importYearBefore
);
if(lista
!=
null && lista.
size() > 0)
{
logger.
info("OK - Unit siges: " + cu.
getCode() +
" without program will try found old to clone");
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)
{
novaFicha =
true;
CourseUnitProgram program =
new CourseUnitProgramImpl
();
DaoFactory.
getCourseUnitProgramDaoImpl().
save(program
);
program.
setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl
());
DaoFactory.
getCourseUnitProgramPart2DaoImpl().
save(program.
getCourseUnitProgramPart2());
cu.
setCourseUnitProgram(program
);
cu.
setValidProgram(false);
}
//So clona a ficha no caso de n�o estar validada pelo CC
if(novaFicha ||
(!cu.
isValidProgram() && !cloneOnlyNews
))
{
updated++
;
((CourseUnitProgramImpl
)cu.
getCourseUnitProgram()).
cloneFrom(cuOld.
getCourseUnitProgram());
List
<String
> errors =
new ArrayList
<String
>();
service.
createPdf(cu,errors
);
}
}
else
{
foundnprog.
add(cu.
getCode());
}
}
else
{
nfound.
add(cu.
getCode());
logger.
info("NOT FOUND - Unit siges: " + cu.
getCode() +
" without program don't have old to clone");
}
}
else if(generateAllPdfs
)
{
List
<String
> errors =
new ArrayList
<String
>();
if(cu.
getCourseUnitProgram() !=
null)
service.
createPdf(cu,errors
);
}
cu.
setValidProgram(true);
}
logger.
info("STATS " + year
);
logger.
info("Total: " + foundTotal
);
logger.
info("Programas alterados: " + updated
);
logger.
info("Previous Unit Found with program : " + found
);
logger.
info("Previous Unit Found without program: " + foundnprog.
size());
logger.
info("Previous Unit Not Found: " + nfound.
size());
logger.
info("### Found No Prog:");
for(1.5.0/docs/api/java/lang/String.html">String c : foundnprog
)
{
logger.
info(c
);
}
logger.
info("### Not Found:");
for(1.5.0/docs/api/java/lang/String.html">String c : nfound
)
{
logger.
info(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));
}
logger.
info("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);
}
logger.
info("AQUI");
((CourseUnitProgramImpl
)cuInto.
getCourseUnitProgram()).
cloneFrom(cuFrom.
getCourseUnitProgram());
DaoFactory.
getCourseUnitProgramDaoImpl().
saveOrUpdate(((CourseUnitProgramImpl
)cuInto.
getCourseUnitProgram()));
DaoFactory.
getCourseUnitProgramPart2DaoImpl().
saveOrUpdate(((CourseUnitProgramImpl
)cuInto.
getCourseUnitProgram()).
getCourseUnitProgramPart2());
SaveCourseUnitProgram service =
new SaveCourseUnitProgram
();
List
<String
> errors =
new ArrayList
<String
>();
try {
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 = DatesUtils.
getImportYear();
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
]);
AbstractDao.
getCurrentSession().
beginTransaction();
new SincronizeLastYearCourseUnitProgramsService
().
run(year,cloneOnlyNews,generateAllPdfs
);
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
}