package pt.estgp.estgweb.services.sigesimports;
import jomm.dao.impl.AbstractDao;
import jomm.utils.FilesUtils;
import jomm.utils.PdfUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.enums.LangEnum;
import pt.estgp.estgweb.services.courseunits.CreateCourseUnitXML;
import pt.estgp.estgweb.services.email.EMAILJob;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.jobs.JobScheduleService;
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.Dom4jUtil;
import pt.estgp.estgweb.web.FtpServer;
import pt.ipportalegre.siges.web.services.ArrayOfAula;
import pt.ipportalegre.siges.web.services.Aula;
import pt.ipportalegre.siges.web.services.SiGesWEB;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Jorge Machado
* @date 11/May/2008
* @time 12:51:32
* @see pt.estgp.estgweb
*/
public class ImportSumariesJson
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(ImportSumariesJson.
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
) throws ServiceException
{
return run
(year,semestre,
true,
true);
}
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 sendIONLINE,
boolean sendEMAIL
) throws ServiceException
{
1.5.0/docs/api/java/lang/String.html">String msgS =
"STARTING SUMARIES IMPORT SERVICE FOR year: " + year +
" semestre: " + semestre +
" sendIONLINE: " + sendIONLINE +
" sendEMAIL: " + sendEMAIL
;
serviceLogInfo
(msgS
);
logger.
info(msgS
);
DefaultLogMessages logMessages =
new DefaultLogMessages
();
logMessages.
addMessage(new DefaultLogMessage
("import.summaries", LogMessageTypeEnum.
INFO,
"instituicao " + Globals.
SIGES_INSTITUTION_CODE));
serviceLogInfo
(logMessages.
getLastMessage());
int countUnits =
0;
int countUnitsOk =
0;
int countUnitsZeroSummaries =
0;
List
<String
> unitsZeroSummaries =
new ArrayList
<String
>();
List
<String
> unitsFailed =
new ArrayList
<String
>();
try
{
SiGesWEB service
;
try
{
serviceLogInfo
("STARTING WEB SERVICE AT " + Globals.
SIGES_WEBSERVICE_WSDL);
service =
new SiGesWEB
(new 1.5.0/docs/api/java/net/URL.html">URL(Globals.
SIGES_WEBSERVICE_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/lang/Throwable.html">Throwable e
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.error",e.
toString(),
"erro na configuracao do WEB Service", LogMessageTypeEnum.
INFO));
serviceLogInfo
(logMessages.
getLastMessage());
logger.
fatal(e, e
);
serviceLogError
(e.
toString(), e
);
return logMessages
;
}
int i =
0;
//List<Long> cUs = DaoFactory.getCourseUnitDaoImpl().loadIds(year,DatesUtils.getSemestre());
List
<Long
> cUs = DaoFactory.
getCourseUnitDaoImpl().
loadIds(year,semestre
);
1.5.0/docs/api/java/lang/String.html">String nowCode =
"";
for(1.5.0/docs/api/java/lang/Long.html">Long cId: cUs
)
{
nowCode =
"BACO_ONLY_CODE" + cId
;
countUnits++
;
try
{
if (i++
> MAX_COMMIT
)
{
i =
0;
setProgress
((int) (((float)countUnits
)/
((float)cUs.
size())*100.0f
));
AbstractDao.
getCurrentSession().
getTransaction().
commit();
AbstractDao.
getCurrentSession().
beginTransaction();
serviceLogInfo
("Commiting database");
}
CourseUnit c = DaoFactory.
getCourseUnitDaoImpl().
load(cId
);
nowCode = c.
getCode();
logMessages.
addMessage(new DefaultLogMessage
("import.info",
"Importing Summaries to CourseUnit: " + c.
getCode() +
": course: " + c.
getCourse().
getCode(),
"", LogMessageTypeEnum.
INFO));
logger.
info("Importing Summaries to CourseUnit: " + c.
getName() +
" (" + c.
getCode() +
") course " + c.
getCourse().
getName() +
" (" + c.
getCourse().
getCode() +
")");
serviceLogInfo
(logMessages.
getLastMessage());
int tries =
3;
ArrayOfAula arrayOfAulas =
null;
while(tries
> 0)
{
//comentario de teste
try
{
arrayOfAulas = service.
getSiGesWEBSoap().
getAulas(Globals.
SIGES_INSTITUTION_CODE, year,c.
getCode(),semestre
);
break;
}
catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable t
)
{
if(tries-- ==
0)
{
logger.
error("Giving up of courseUnit:" + cId +
" ( " + c.
getName() +
" ) ",t
);
serviceLogError
("Giving up of courseUnit:" + cId +
" ( " + c.
getName() +
" ) ",t
);
break;
}
logger.
error("WebService Fail, trying " + tries +
" times sleeping a while");
serviceLogError
("WebService Fail, trying " + tries +
" times sleeping a while");
1.5.0/docs/api/java/lang/Thread.html">Thread.
sleep(5000
);
}
}
if(arrayOfAulas
!=
null && arrayOfAulas.
getAula() !=
null)
{
List
<CourseUnitSummary
> courseUnitSummaries =
new ArrayList
<CourseUnitSummary
>();
//HashMap<String, CourseUnitSummary> map = new HashMap<String, CourseUnitSummary>();
/*if(c.getSummaries() != null && c.getSummaries().size() > 0)
for(CourseUnitSummary s: c.getSummaries())
map.put(s.getCodigoAula() + ":" + s.getCodigoSumario(),s);
else
c.setSummaries(new HashSet<CourseUnitSummary>());*/
JSONObject summariesJson =
new JSONObject
();
JSONArray summaries =
new JSONArray
();
summariesJson.
put("summary",summaries
);
for(Aula aula: arrayOfAulas.
getAula())
{
//CourseUnitSummary s = map.get(aula.getSumNumeroAula() + ":" + aula.getCodigoSumario());
//if(s == null)
//{
CourseUnitSummaryImpl s = DomainObjectFactory.
createCourseUnitSummaryImpl();
s.
setCourseUnit(c
);
//c.getSummaries().add(s);
//DaoFactory.getCourseUnitSummaryDaoImpl().save(s);
//summaries.add();
//}
s.
setCodigoSumario(""+aula.
getCodigoSumario().
intValue());
s.
setCodigoAula(""+aula.
getSumNumeroAula().
intValue());
s.
setNumeroAula(aula.
getSumNumeroAula().
intValue());
s.
setDataAula(aula.
getData().
toGregorianCalendar().
getTime());
s.
setTipoAula(aula.
getSumTipoAula());
s.
setCodigoSalaAula("" + aula.
getAulaCodigoSalaAula().
intValue());
s.
setAlunosPresentes(aula.
getSumNumeroAlunos().
intValue());
s.
setTitulo(aula.
getSumTitulo());
s.
setDescricao(aula.
getSumDescricao());
s.
setcEstado(""+aula.
getSumCdEstado().
intValue());
s.
setNumeroHoras("" + aula.
getNumeroCelulas().
intValue());
summaries.
put(s.
getJson());
courseUnitSummaries.
add(s
);
}
if(courseUnitSummaries.
size() == 0
)
{
countUnitsZeroSummaries++
;
unitsZeroSummaries.
add(c.
getCode());
}
else
{
countUnitsOk++
;
}
c.
setSummariesJson(summariesJson.
toString());
if(sendIONLINE
)
{
1.5.0/docs/api/java/lang/String.html">String path = generatePdf
(c
);
sendPdfFtpIonline
(c,
new ArrayList
<String
>(),
null,path,
null);
FilesUtils.
delete(path
);
}
if(sendEMAIL
)
{
sendEmail
(null, courseUnitSummaries,
true);
}
}
else
{
countUnitsZeroSummaries++
;
unitsZeroSummaries.
add(c.
getCode());
logger.
error("Summaries come null in unit:" + c.
getCode());
serviceLogError
("Summaries come null in unit:" + c.
getCode());
}
}
catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e
)
{
unitsFailed.
add(nowCode
);
logger.
error(e,e
);
serviceLogError
(e.
toString(),e
);
}
}
setProgress
(100
);
serviceLogError
("Finish commiting");
}
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
);
throw new ServiceException
(e.
toString(), e
);
}
logMessages.
addMessage(new DefaultLogMessage
("import.summaries.terminating", LogMessageTypeEnum.
INFO));
logger.
info("terminating summaries import");
serviceLogInfo
(logMessages.
getLastMessage());
serviceLogInfo
("#######################################");
serviceLogInfo
("#######################################");
serviceLogInfo
("UNITS PROCESSED: " + countUnits
);
serviceLogInfo
("UNITS FAILED: " +
(countUnits - countUnitsZeroSummaries - countUnitsOk
));
serviceLogInfo
("UNITS IMPORT OK: " + countUnitsOk
);
serviceLogInfo
("UNITS ZERO SUMARIES: " + countUnitsZeroSummaries
);
serviceLogInfo
("#######################################");
return logMessages
;
}
public static SendEmailService sendEmailService =
new SendEmailService
();
private void sendEmail
(UserSession userSession,List
<CourseUnitSummary
> summaries,
boolean sendEmail
)
{
if(Globals.
EMAIL_SUMMARIES && summaries.
size() > 0 && sendEmail
)
{
// for(CourseUnitSummary summary: summaries)
// {
List
<String
> emails = DaoFactory.
getCourseUnitSummaryDaoImpl().
getStudentsEmails(summaries.
get(0
).
getId());
if(emails ==
null)
logger.
warn("No students emails in unit: code:" + summaries.
get(0).
getCourseUnit().
getCode() +
" " + summaries.
get(0
).
getCourseUnit().
getName());
EMAILJob emailJob =
new EMAILJob
(sendEmailService.
getSummariesEmail(emails, summaries, summaries.
get(0
).
getCourseUnit(), LangEnum.
PORTUGUESE));
JobScheduleService.
getInstance().
scheduleNow(emailJob,
"New Summary EMAIL from: " + summaries.
get(0).
getCourseUnit().
getName() +
" aula: " +summaries.
get(summaries.
size()-1
).
getNumeroAula() ,userSession
);
// }
}
}
public static 1.5.0/docs/api/java/lang/String.html">String generatePdf
(CourseUnit c
) throws 1.5.0/docs/api/java/io/IOException.html">IOException,
1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException
{
5+0%2Fdocs%2Fapi+Document">Document dom =
new CreateCourseUnitXML
().
run(c,
null);
org.
w3c.
dom.
5+0%2Fdocs%2Fapi+Document">Document dd = Dom4jUtil.
toW3c(dom
);
1.5.0/docs/api/java/lang/String.html">String path = Globals.
TMP_DIR +
1.5.0/docs/api/java/io/File.html">File.
separator + c.
getCode() +
"-" + c.
getNormalizedName() +
"-sumarios.pdf";
1.5.0/docs/api/java/io/FileOutputStream.html">FileOutputStream out =
new 1.5.0/docs/api/java/io/FileOutputStream.html">FileOutputStream(path
);
Map
<String,Object
> params =
new HashMap
<String,Object
>();
params.
put("site", Globals.
SITE_URL);
PdfUtils.
createPdfFromXml(new 1.5.0/docs/api/javax/xml/transform/dom/DOMSource.html">DOMSource(dd
),
"pt/estgp/estgweb/services/courseunits/courseunitsummaries.fo.xsl", out, params
);
out.
flush();
out.
close();
return path
;
}
private static void sendPdfFtpIonline
(CourseUnit cu, List
<String
> errors, UserSession u,
1.5.0/docs/api/java/lang/String.html">String pdfPath,FTPClient client
) throws 1.5.0/docs/api/java/io/IOException.html">IOException,
1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException
{
FtpServer server =
null;
if(client ==
null)
{
server = FtpServer.
getNewServer(Globals.
FTP_IONLINE_URL,Globals.
FTP_IONLINE_USER,Globals.
FTP_IONLINE_PASS);
client = server.
getClient();
}
client.
setFileType(FTP.
BINARY_FILE_TYPE);
1.5.0/docs/api/java/lang/String.html">String pastaFichaCurricular =
((CourseUnitImpl
)cu
).
getSummariosPathIntranet();
if(!client.
changeWorkingDirectory(pastaFichaCurricular
))
{
logger.
error("FTP CANT CHANGE TO PATH: " + pastaFichaCurricular
);
}
else
{
client.
storeFile(((CourseUnitImpl
)cu
).
getSummariosFileNameIntranet(),
new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream(pdfPath
));
if(server
!=
null)
{
client.
quit();
client.
disconnect();
}
}
//
}
/**
* Testar por aqui poi requer Super Role e assim e' autmatico
*
*
* @param args of main
* @throws pt.estgp.estgweb.services.expceptions.ServiceException on error
*/
public static void main
(1.5.0/docs/api/java/lang/String.html">String[] args
) throws ServiceException, JSONException
{
1.5.0/docs/api/java/lang/System.html">System.
out.
println("Syntax:");
1.5.0/docs/api/java/lang/System.html">System.
out.
println("year, semestre, sendIonline, sendEmail");
1.5.0/docs/api/java/lang/System.html">System.
out.
println("If no arguments wil user actual year import config in all semestres and true in email and ionline");
1.5.0/docs/api/java/lang/String.html">String year = DaoFactory.
getConfigurationDaoImpl().
getImportsDefaultImportYearCreateTransaction();
1.5.0/docs/api/java/lang/String.html">String semestre =
null;
boolean sendIonline =
true;
boolean sendEmail =
true;
if(args
!=
null && args.
length > 0
)
year = args
[0
];
if(args
!=
null && args.
length > 1
)
semestre = args
[1
];
if(args
!=
null && args.
length > 2
)
sendIonline =
1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(args
[2
]);
if(args
!=
null && args.
length > 3
)
sendEmail =
1.5.0/docs/api/java/lang/Boolean.html">Boolean.
parseBoolean(args
[3
]);
AbstractDao.
getCurrentSession().
beginTransaction();
if(semestre
!=
null)
new ImportSumariesJson
().
run(year,semestre,sendIonline,sendEmail
);
else
{
new ImportSumariesJson
().
run(year,
"S1",sendIonline,sendEmail
);
new ImportSumariesJson
().
run(year,
"S2",sendIonline,sendEmail
);
new ImportSumariesJson
().
run(year,
"A",sendIonline,sendEmail
);
}
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
public static final 1.5.0/docs/api/java/lang/String.html">String JOB_importYear_KEY =
"JOB_importYear_KEY";
public static final 1.5.0/docs/api/java/lang/String.html">String JOB_semestre_KEY =
"JOB_semestre_KEY";
public static final 1.5.0/docs/api/java/lang/String.html">String JOB_sendIonline_KEY =
"JOB_sendIonline_KEY";
public static final 1.5.0/docs/api/java/lang/String.html">String JOB_sendEmail_KEY =
"JOB_sendEmail_KEY";
@
1.5.0/docs/api/java/lang/Override.html">Override
protected void runJobServiceTask
() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable {
1.5.0/docs/api/java/lang/String.html">String importYear =
(1.5.0/docs/api/java/lang/String.html">String) getParametersMap
().
get(JOB_importYear_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String semestre =
(1.5.0/docs/api/java/lang/String.html">String) getParametersMap
().
get(JOB_semestre_KEY
).
getObject();
1.5.0/docs/api/java/lang/Boolean.html">Boolean sendIonline =
(1.5.0/docs/api/java/lang/Boolean.html">Boolean) getParametersMap
().
get(JOB_sendIonline_KEY
).
getObject();
1.5.0/docs/api/java/lang/Boolean.html">Boolean sendEmail =
(1.5.0/docs/api/java/lang/Boolean.html">Boolean) getParametersMap
().
get(JOB_sendEmail_KEY
).
getObject();
run
(importYear,semestre,sendIonline,sendEmail
);
}
}