package pt.estgp.estgweb.services.assessments;
import com.itextpdf.text.DocumentException;
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.AssessmentView;
import pt.estgp.estgweb.services.surveys.SurveyStatusEnum;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by IntelliJ IDEA.
* User: Filipe Matos
* Date: 3/Ago/2013
* Time: 2:12:31
* To change this template use File | Settings | File Templates.
*/
public class ScheduleAssessmentService
implements IService,
1.5.0/docs/api/java/lang/Runnable.html">Runnable {
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(ScheduleAssessmentService.
class);
private static final int MAX_COMMIT =
100;
private long assessmentId
;
private HttpServletRequest request
;
private UserSession userSession
;
private List
<Long
> selectedUsersId
;
private GeneratePdfService generatePdfService =
new GeneratePdfService
();
public AssessmentView scheduleAssessmentService
(AssessmentView assessmentView, List
<Long
> selectedUsersId, HttpServletRequest request, UserSession userSession
) throws 1.5.0/docs/api/java/io/IOException.html">IOException, DocumentException
{
// AssessmentImpl a = DaoFactory.getAssessmentDaoImpl().get(assessmentView.getId());
AssessmentImpl a = DaoFactory.
getAssessmentDaoImpl().
load(assessmentView.
getId());
if(assessmentView.
getStartDate()!=
null)
a.
setStartDate(assessmentView.
getStartDate());
if(assessmentView.
getEndDate()!=
null)
a.
setEndDate(assessmentView.
getEndDate());
if(assessmentView.
getTime()!=
null)
a.
setTime(assessmentView.
getTime());
AssessmentView view =
new AssessmentView
(a
);
AbstractDao.
getCurrentSession().
flush();
AbstractDao.
getCurrentSession().
getTransaction().
commit();
AbstractDao.
getCurrentSession().
beginTransaction();
// generate pdf
generatePdfService.
generateAssessmentPdf(a.
getId(),userSession
);
logger.
info("Generate assessment pdf");
AbstractDao.
getCurrentSession().
getTransaction().
commit();
AbstractDao.
getCurrentSession().
beginTransaction();
// start a thread
ScheduleAssessmentService service =
new ScheduleAssessmentService
();
service.
request = request
;
service.
assessmentId = a.
getId();
service.
selectedUsersId = selectedUsersId
;
service.
userSession = userSession
;
1.5.0/docs/api/java/lang/Thread.html">Thread thread =
new 1.5.0/docs/api/java/lang/Thread.html">Thread(service
);
thread.
start();
logger.
info("Starting thread with id: "+thread.
getId());
return view
;
}
private synchronized AssessmentImpl createAssessmentResponses
(AssessmentImpl assessment
)
{
//primeiro verificar se ja ha respostas
List
<AssessmentResponse
> existResponses = DaoFactory.
getAssessmentResponseDaoImpl().
loadResponsesByAssessmentId(assessment.
getId());
if(existResponses
!=
null)
{
for(int i=
0;i
<existResponses.
size();i++
)
{
DaoFactory.
getAssessmentResponseDaoImpl().
delete(existResponses.
get(i
));
}
}
Set
<StudentImpl
> users =
new HashSet
<StudentImpl
>(0
);
users = assessment.
getCourseUnit().
getStudents();
List
<AssessmentResponse
> responses =
new ArrayList
<AssessmentResponse
>();
for(User user : users
)
{
if(selectedUsersId.
contains(user.
getId()))
{
AssessmentResponse ar = DomainObjectFactory.
createAssessmentResponseImpl();
ar.
setAnswered(false);
ar.
setEvaluated(false);
ar.
setOwner(user
);
ar.
setAssessment(assessment
);
responses.
add(ar
);
}
}
if(responses.
size() == 0
)
{
assessment.
setStatus(SurveyStatusEnum.
STATUS_STOPPED.
getStatus());
assessment.
setStatusPercentage(100
);
return assessment
;
}
long i =
0;
int status
;
for(AssessmentResponse r : responses
)
{
if (i++
% MAX_COMMIT == 0
)
{
status =
(int)(((double)i/
(double)responses.
size())*100
);
assessment.
setStatusPercentage(status
);
AbstractDao.
getCurrentSession().
getTransaction().
commit();
AbstractDao.
getCurrentSession().
beginTransaction();
assessment = DaoFactory.
getAssessmentDaoImpl().
load(assessmentId
);
}
DaoFactory.
getAssessmentResponseDaoImpl().
save(r
);
}
assessment.
setStatusPercentage(100
);
assessment.
setStatus(AssessmentStatusEnum.
STATUS_STOPPED.
getStatus());
return assessment
;
}
public void run
()
{
logger.
info("Running thread...");
AbstractDao.
getCurrentSession().
beginTransaction();
logger.
info("Loading assessment with id: "+assessmentId
);
AssessmentImpl assessment = DaoFactory.
getAssessmentDaoImpl().
get(assessmentId
);
assessment.
setStatusPercentage(0
);
assessment.
setStatus(AssessmentStatusEnum.
STATUS_SCHEDULE_ASSESSMENT.
getStatus());
AbstractDao.
getCurrentSession().
getTransaction().
commit();
AbstractDao.
getCurrentSession().
beginTransaction();
assessment = DaoFactory.
getAssessmentDaoImpl().
get(assessmentId
);
logger.
info("Creating assessment responses...");
assessment = createAssessmentResponses
(assessment
);
AbstractDao.
getCurrentSession().
getTransaction().
commit();
logger.
info("End of thread...");
}
}