Subversion Repositories bacoAlunos

Rev

Rev 1310 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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...");

    }
}