package pt.estgp.estgweb.services.sigesimports;
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.NonUniqueResultException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.Course;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseView;
import pt.estgp.estgweb.services.courses.CoursesService;
import pt.estgp.estgweb.services.email.SendEmailService;
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.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.ipportalegre.siges.web.services.ArrayOfDisciplina;
import pt.ipportalegre.siges.web.services.Disciplina;
import pt.ipportalegre.siges.web.services.SiGesWEB;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import javax.xml.namespace.QName;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
/**
* @author Jorge Machado
*/
public class ImportCourseService
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(ImportCourseService.
class);
private CoursesService coursesService =
new CoursesService
();
int newUnits =
0;
int newCourses =
0;
public ILogMessages run
(1.5.0/docs/api/java/lang/String.html">String year
) throws ServiceException
{
1.5.0/docs/api/java/lang/String.html">String msgS =
"STARTING COURSES IMPORT SERVICE FOR YEAR: " + year
;
serviceLogInfo
(msgS
);
logger.
info(msgS
);
newUnits =
0;
newCourses =
0;
DefaultLogMessages logMessages =
new DefaultLogMessages
();
try
{
logMessages.
addMessage(new DefaultLogMessage
("import.semestre.separated", LogMessageTypeEnum.
INFO,
"instituicao " + DaoFactory.
getConfigurationDaoImpl().
getSigesInstitutionCode()));
serviceLogInfo
(logMessages.
getLastMessage());
HashMap
<String, Disciplina
> disciplinasMap =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapS1 =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapS2 =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapA =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapT1 =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapT2 =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapT3 =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> disciplinasMapT4 =
new HashMap
<String, Disciplina
>();
HashMap
<String, Disciplina
> cursosMap =
new HashMap
<String, Disciplina
>();
/**
* Build Course Units Maps
*/
SiGesWEB service
;
1.5.0/docs/api/java/lang/String.html">String WSDL = DaoFactory.
getConfigurationDaoImpl().
getSigesWebServicesWsdl();
try
{
serviceLogInfo
("STARTING WEB SERVICE AT " + WSDL
);
service =
new SiGesWEB
(new 1.5.0/docs/api/java/net/URL.html">URL(WSDL
),
new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName(Globals.
SIGES_WEBSERVICE_TARGET_NAMESPACE,
"SiGesWEB"));
}
catch (1.5.0/docs/api/java/net/MalformedURLException.html">MalformedURLException e
)
{
logger.
fatal(e, e
);
logMessages.
addMessage(new DefaultLogMessage
("import.error",e.
toString(),
"erro na configuracao do WEB Service", LogMessageTypeEnum.
INFO));
serviceLogError
(logMessages.
getLastMessage(), e
);
return logMessages
;
}
importUnitsSemestre
(service,
"S1", year, disciplinasMap, disciplinasMapS1, cursosMap, logMessages
);
importUnitsSemestre
(service,
"S2", year, disciplinasMap, disciplinasMapS2, cursosMap, logMessages
);
importUnitsSemestre
(service,
"A", year, disciplinasMap, disciplinasMapA, cursosMap, logMessages
);
importUnitsSemestre
(service,
"T1", year, disciplinasMap, disciplinasMapT1, cursosMap, logMessages
);
importUnitsSemestre
(service,
"T2", year, disciplinasMap, disciplinasMapT2, cursosMap, logMessages
);
importUnitsSemestre
(service,
"T3", year, disciplinasMap, disciplinasMapT3, cursosMap, logMessages
);
importUnitsSemestre
(service,
"T4", year, disciplinasMap, disciplinasMapT4, cursosMap, logMessages
);
/**
* Import Courses
*/
logMessages.
addMessage(new DefaultLogMessage
("import.semestre.updating.courses", LogMessageTypeEnum.
INFO));
serviceLogInfo
("updating courses");
logger.
info("updating courses");
Set
<Map.
Entry<String, Disciplina
>> set2 = cursosMap.
entrySet();
for (1.5.0/docs/api/java/util/Map.html">Map.
Entry<String, Disciplina
> entry : set2
)
{
Disciplina d = entry.
getValue();
CourseView c = coursesService.
loadCourseByCode("" + d.
getCodigoCurso().
intValue(),
false);
// Course c = DaoFactory.getCourseDaoImpl().findCourseByCode("" + d.getCodigoCurso());
if (c ==
null)
{
c =
new CourseView
();
newCourses++
;
serviceLogInfo
("New Course Found: (" + d.
getCodigoCurso() +
") " + d.
getNomeCurso());
// DaoFactory.getCourseDaoImpl().save(c);
}
c.
setName(d.
getNomeCurso());
1.5.0/docs/api/java/lang/String.html">String grauBaco = ConfigProperties.
getProperty("siges.degree."+d.
getGrauCurso());
if(c.
getDegree() ==
null)
c.
setDegree(grauBaco
);
c.
setCode("" + d.
getCodigoCurso().
intValue());
c.
setImportYear(year
);
c.
setInstitutionalCode("" + d.
getCodigoInstituicao().
intValue());
coursesService.
submitCourse(c,
null,
null,0,
null,
null);
}
/**
* Update Course Units
*/
updateCourseUnits
(disciplinasMapS1,
"S1",logMessages,year
);
updateCourseUnits
(disciplinasMapS2,
"S2",logMessages,year
);
updateCourseUnits
(disciplinasMapA,
"A",logMessages,year
);
updateCourseUnits
(disciplinasMapT1,
"T1",logMessages,year
);
updateCourseUnits
(disciplinasMapT2,
"T2",logMessages,year
);
updateCourseUnits
(disciplinasMapT3,
"T3",logMessages,year
);
updateCourseUnits
(disciplinasMapT4,
"T4",logMessages,year
);
serviceLogInfo
("######################################");
serviceLogInfo
("######################################");
serviceLogInfo
("#Courses Imported:" + cursosMap.
size());
serviceLogInfo
("#Units Imported S1:" + disciplinasMapS1.
size());
serviceLogInfo
("#Units Imported S2:" + disciplinasMapS2.
size());
serviceLogInfo
("#Units Imported A:" + disciplinasMapA.
size());
serviceLogInfo
("#Units Imported T1:" + disciplinasMapT1.
size());
serviceLogInfo
("#Units Imported T2:" + disciplinasMapT2.
size());
serviceLogInfo
("#Units Imported T3:" + disciplinasMapT3.
size());
serviceLogInfo
("#Units Imported T4:" + disciplinasMapT4.
size());
serviceLogInfo
("#New Courses Found:" + newCourses
);
serviceLogInfo
("#New Units Found:" + newUnits
);
logger.
info("######################################");
logger.
info("######################################");
logger.
info("#Courses Imported:" + cursosMap.
size());
logger.
info("#Units Imported S1:" + disciplinasMapS1.
size());
logger.
info("#Units Imported S2:" + disciplinasMapS2.
size());
logger.
info("#Units Imported A:" + disciplinasMapA.
size());
logger.
info("#Units Imported T1:" + disciplinasMapT1.
size());
logger.
info("#Units Imported T2:" + disciplinasMapT2.
size());
logger.
info("#Units Imported T3:" + disciplinasMapT3.
size());
logger.
info("#Units Imported T4:" + disciplinasMapT4.
size());
logger.
info("#New Courses Found:" + newCourses
);
logger.
info("#New Units Found:" + newUnits
);
}
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
(logMessages.
getLastMessage(), e
);
1.5.0/docs/api/java/lang/String.html">String cause = e.
getCause() ==
null ? "" : e.
getCause().
toString();
sendNotificationAdmin
("Erro na importacao de sumarios",cause
);
}
logger.
info("terminating course import");
serviceLogInfo
("terminating course import");
logMessages.
addMessage(new DefaultLogMessage
("import.course.terminating", LogMessageTypeEnum.
INFO));
setProgress
(100
);
return logMessages
;
}
/**
* Envio de Notificação aos operadores do CI
* @param subject
* @param cause
*/
private void sendNotificationAdmin
(1.5.0/docs/api/java/lang/String.html">String subject,
1.5.0/docs/api/java/lang/String.html">String cause
)
{
List
<String
> emails = ConfigProperties.
getListValues("admin.email");
for(1.5.0/docs/api/java/lang/String.html">String email:emails
)
{
serviceLogWarn
(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email
);
logger.
warn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email
);
}
List
<String
> arguments =
new ArrayList
<String
>();
arguments.
add(cause.
replace("\n",
"<br/>"));
Email email =
new Email
(subject,emails,Globals.
SYSTEM_EMAIL_BOX,
"messageToAdmin_pt.txt",arguments
);
email.
setHtml(true);
try {
new SendEmailService
().
sendEmail(email
);
} catch (ServiceException e
) {
e.
printStackTrace();
}
}
private void importUnitsSemestre
(SiGesWEB service,
1.5.0/docs/api/java/lang/String.html">String semestre,
1.5.0/docs/api/java/lang/String.html">String year,
HashMap
<String, Disciplina
> disciplinasMap,
HashMap
<String, Disciplina
> disciplinasMapSemestre,
HashMap
<String, Disciplina
> cursosMap,
DefaultLogMessages logMessages
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.semestre.course.units." + semestre, LogMessageTypeEnum.
INFO));
serviceLogInfo
("importing " + semestre +
" course units");
logger.
info("importing " + semestre +
" course units");
ArrayOfDisciplina arrayOfDisciplina = service.
getSiGesWEBSoap().
getDisciplinasDaInstituicaoSemestre(new 1.5.0/docs/api/java/math/BigDecimal.html">BigDecimal(DaoFactory.
getConfigurationDaoImpl().
getSigesInstitutionCode()), year, semestre
);
List
<Disciplina
> disciplinas = arrayOfDisciplina.
getDisciplina();
for (Disciplina d : disciplinas
)
{
if (disciplinasMap.
get(d.
getCodigo().
intValue() +
":" + d.
getCodigoCurso() +
":" + semestre
) !=
null)
{
logMessages.
addMessage(new DefaultLogMessage
("import.semestre.repeated." + semestre,
"unit: " + d.
getCodigo().
intValue(),
"", LogMessageTypeEnum.
WARNING));
serviceLogWarn
("repeated unit in " + semestre +
":" + d.
getCodigo().
intValue());
logger.
warn("repeated unit in " + semestre +
":" + d.
getCodigo().
intValue());
}
disciplinasMap.
put(d.
getCodigo().
intValue() +
":" + d.
getCodigoCurso() +
":" + semestre, d
);
disciplinasMapSemestre.
put(d.
getCodigo().
intValue() +
":" + d.
getCodigoCurso() +
":" + semestre, d
);
cursosMap.
put(d.
getCodigoCurso().
intValue()+
":"+year, d
);
}
}
private void updateCourseUnits
(HashMap
<String, Disciplina
> disciplinasMapS,
1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages logMessages,
1.5.0/docs/api/java/lang/String.html">String year
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.
INFO));
logger.
info("updating " + semestre +
" course units");
serviceLogInfo
("updating " + semestre +
" course units");
Set
<Map.
Entry<String, Disciplina
>> set = disciplinasMapS.
entrySet();
for (1.5.0/docs/api/java/util/Map.html">Map.
Entry<String, Disciplina
> entry : set
)
{
Disciplina d = entry.
getValue();
CourseUnit c
;
try{
c = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUnique("" + d.
getCodigo(),
"" + d.
getCodigoCurso(), semestre, year
);
}catch(NonUniqueResultException e
)
{
logger.
fatal("Unidade Repetida: (" + d.
getCodigo() +
") curso: " + d.
getCodigoCurso() +
" " + semestre +
" " + year
);
serviceLogFatal
("Unidade Repetida: (" + d.
getCodigo() +
") curso: " + d.
getCodigoCurso() +
" " + semestre +
" " + year
);
throw e
;
}
if (c ==
null)
{
c = DomainObjectFactory.
createCourseUnitImpl();
DaoFactory.
getCourseUnitDaoImpl().
save(c
);
serviceLogInfo
("New Unit Found: (" + d.
getCodigo() +
") " + d.
getNome() +
" - curso (" + d.
getNomeCurso() +
") " + d.
getNomeCurso());
newUnits++
;
}
c.
setName(d.
getNome());
c.
setInstitutionCode("" + DaoFactory.
getConfigurationDaoImpl().
getSigesInstitutionCode());
c.
setCode("" + d.
getCodigo().
intValue());
c.
setCourseCode("" + d.
getCodigoCurso());
c.
setCourseName("" + d.
getNomeCurso());
c.
setSemestre(semestre
);
c.
setImportYear(year
);
Course course = DaoFactory.
getCourseDaoImpl().
findCourseByCode(c.
getCourseCode());
c.
setCourse(course
);
}
}
public static final 1.5.0/docs/api/java/lang/String.html">String JOB_importYear_KEY =
"JOB_importYear_KEY";
@
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();
ILogMessages messages = run
(importYear
);
return messages
;
}
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
];
AbstractDao.
getCurrentSession().
beginTransaction();
new ImportCourseService
().
run(year
);
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
}