Subversion Repositories bacoAlunos

Rev

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

package pt.estgp.estgweb.services.surveys;

import jomm.dao.impl.AbstractDao;
import jomm.utils.MessageResources;
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.utils.RoleManager;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: Duarte Santos
 * @date: 09-08-2011
 * @time: 12:58
 * @email: a12564 [at] estgp [dot] pt
 */


public class ConsistSurveyService 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(ConsistSurveyService.class);
    private static final int MAX_COMMIT = 100;

    private long surveyId;
    private HttpServletRequest request;

    public void consistSurveyService(long surveyId, HttpServletRequest request, UserSession userSession)
    {
        if(surveyId <= 0) return;

        SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
        if(survey != null)
        {
            ConsistSurveyService s = new ConsistSurveyService();
            s.request = request;
            s.surveyId = surveyId;

            // start a thread
            1.5.0/docs/api/java/lang/Thread.html">Thread thread = new 1.5.0/docs/api/java/lang/Thread.html">Thread(s);
            thread.start();
            logger.info("Starting thread with id: "+thread.getId());
        }
    }

    private synchronized SurveyImpl consistPedagogic(SurveyImpl survey)
    {
        1.5.0/docs/api/java/lang/String.html">String semester = survey.getSemester();
        1.5.0/docs/api/java/lang/String.html">String semesterMsg = MessageResources.getMessage(request,"courseunit."+semester);
        1.5.0/docs/api/java/lang/String.html">String importYear = survey.getYear();
        List<String> areas = DaoFactory.getCourseDaoImpl().loadAreas();

        SurveyStructuralNode nodeYear = survey.getStructuralNode();
        SurveyStructuralNode nodeSemester = ((SurveyStructuralNodeImpl)nodeYear).getChildNode(semesterMsg);

        List<SurveyResponse> responses = new ArrayList<SurveyResponse>();
        for(1.5.0/docs/api/java/lang/String.html">String area : areas)
        {
            1.5.0/docs/api/java/lang/String.html">String areaMsg = MessageResources.getMessage(request,"area."+area);
            SurveyStructuralNode nodeArea = ((SurveyStructuralNodeImpl)nodeSemester).getChildNode(areaMsg);
            List<Course> courses = DaoFactory.getCourseDaoImpl().findAllImportYearOrderByName(importYear,area);
            for(Course course : courses)
            {
                SurveyStructuralNode nodeCourse = ((SurveyStructuralNodeImpl)nodeArea).getChildNode(course.getName());
                List<CourseUnit> courseUnits = DaoFactory.getCourseUnitDaoImpl().loadCourseUnits(course.getId(),semester,importYear,false,false);
                for(CourseUnit courseUnit : courseUnits)
                {
                    SurveyStructuralNode nodeCourseUnit = ((SurveyStructuralNodeImpl)nodeCourse).getChildNode(courseUnit.getName());
                   
                    List<User> users = new ArrayList<User>();
                    if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_STUDENT_COURSEUNIT))
                    {
                        users = new ArrayList<User>(courseUnit.getStudents());
                    }
                    else if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_TEACHER_COURSEUNIT))
                    {
                        users = new ArrayList<User>(courseUnit.getTeachers());
                    }

                    for(User user: users)
                    {
                        if(!((UserImpl)user).haveResponse(survey,nodeCourseUnit))
                        {
                            SurveyResponse sr = DomainObjectFactory.createSurveyResponseImpl();
                            sr.setAnswered(false);
                            sr.setOwner(user);
                            sr.setStructuralNode(nodeCourseUnit);
                            responses.add(sr);
                        }
                    }
                }
            }
        }

        if(responses.size() == 0)
        {
            survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
            survey.setStatusPercentage(100);
            return survey;
        }

        long i = 0;
        int status;
        for(SurveyResponse r : responses)
        {
            long userId = r.getOwner().getId();
            long nodeId = r.getStructuralNode().getId();
            if(i++ % MAX_COMMIT == 0)
            {
                status = (int)(((double)i/(double)responses.size())*100);
                survey.setStatusPercentage(status);
                AbstractDao.getCurrentSession().getTransaction().commit();
                AbstractDao.getCurrentSession().beginTransaction();
                survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
            }
            r.setOwner(DaoFactory.getUserDaoImpl().load(userId));
            r.setStructuralNode(DaoFactory.getSurveyStructuralNodeDaoImpl().load(nodeId));
            DaoFactory.getSurveyResponseDaoImpl().save(r);
        }
        survey.setStatusPercentage(100);
        survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
        return survey;
    }

    private synchronized SurveyImpl consistGeneral(SurveyImpl survey)
    {
        List<String> roles = RoleManager.getRolesFromSerial(survey.getTargetRoles());
        List<User> users = new ArrayList<User>();
       
        if(roles.size() == 1 && roles.get(0).equals("all"))
            users.addAll(DaoFactory.getUserDaoImpl().getAll());
        else
            users.addAll(DaoFactory.getUserDaoImpl().loadRolesUsers(roles));

        List<SurveyStructuralNode> childNodes = ((SurveyStructuralNodeImpl)survey.getStructuralNode()).getChildsStructuralNodes();

        List<SurveyResponse> responses = new ArrayList<SurveyResponse>();
        for(SurveyStructuralNode node : childNodes)
        {
            for(User user : users)
            {
                if(!((UserImpl)user).haveResponse(survey,node))
                {
                    SurveyResponse sr = DomainObjectFactory.createSurveyResponseImpl();
                    sr.setAnswered(false);
                    sr.setOwner(user);
                    sr.setStructuralNode(node);
                    responses.add(sr);
                }
            }
        }

        if(responses.size() == 0)
        {
            survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
            survey.setStatusPercentage(100);
            return survey;
        }

        long i = 0;
        int status;
        for(SurveyResponse r : responses)
        {
            long userId = r.getOwner().getId();
            long nodeId = r.getStructuralNode().getId();

            if(i++ % MAX_COMMIT == 0)
            {
                status = (int)(((double)i/(double)responses.size())*100);
                survey.setStatusPercentage(status);
                AbstractDao.getCurrentSession().getTransaction().commit();
                AbstractDao.getCurrentSession().beginTransaction();
                survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
            }
            r.setOwner(DaoFactory.getUserDaoImpl().load(userId));
            r.setStructuralNode(DaoFactory.getSurveyStructuralNodeDaoImpl().load(nodeId));
            DaoFactory.getSurveyResponseDaoImpl().save(r);
        }
        survey.setStatusPercentage(100);
        survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
        return survey;
    }

    public void run()
    {
        logger.info("Running thread...");
        AbstractDao.getCurrentSession().beginTransaction();

        SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
        survey.setStatusPercentage(0);
        survey.setStatus(SurveyStatusEnum.STATUS_CONSIST_SURVEY.getStatus());

        AbstractDao.getCurrentSession().getTransaction().commit();
        AbstractDao.getCurrentSession().beginTransaction();

        survey = DaoFactory.getSurveyDaoImpl().load(surveyId);

        if(((SurveyImpl)survey).isTypeOf(Globals.SURVEY_TYPE_GENERAL))
        {
            logger.info("Consisting general survey...");
            survey = consistGeneral(survey);
        }
        else if(((SurveyImpl)survey).isTypeOf(Globals.SURVEY_TYPE_PEDAGOGIC))
        {
            logger.info("Consisting pedagogic survey...");
            survey = consistPedagogic(survey);
        }

        AbstractDao.getCurrentSession().getTransaction().commit();
        logger.info("End of thread...");
    }
}