Subversion Repositories bacoAlunos

Rev

Rev 995 | 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.domain.views.SurveyQuestionCandidateAnswerView;
import pt.estgp.estgweb.domain.views.SurveyQuestionItemView;
import pt.estgp.estgweb.domain.views.SurveyQuestionView;
import pt.estgp.estgweb.domain.views.SurveyView;
import pt.estgp.estgweb.utils.DatesUtils;
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.Date;
import java.util.List;

/**
 * @author: Duarte Santos
 * @date: 28-05-2011
 * @time: 13:37
 * @email: a12564 [at] estgp [dot] pt
 */


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

    private long surveyId;
    private HttpServletRequest request;

    public SurveyView createEditSurveyService(SurveyView surveyView, HttpServletRequest request, UserSession userSession)
    {
        // Survey
        SurveyImpl s;
        if(surveyView.getId() <= 0)
        {
            s = DomainObjectFactory.createSurveyImpl();
            surveyView.persistViewInObject(s);
            s.setOwner(userSession.getUser());
            s.setSemester(DatesUtils.getSemestre());
            s.setYear(DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear());
            if(s.getStartDate() == null)
                s.setStartDate(new 5+0%2Fdocs%2Fapi+Date">Date());
            s.setSaveDate(new 5+0%2Fdocs%2Fapi+Date">Date());
            s.setStatusPercentage(0);
            s.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
            DaoFactory.getSurveyDaoImpl().save(s);
            logger.info("Creating survey with id: "+s.getId());
        }
        else
        {
            // delete questions, items, candidates
            processDeletedObjects(surveyView);
            s = DaoFactory.getSurveyDaoImpl().load(surveyView.getId());
            surveyView.persistViewInObject(s);
            logger.info("Editing survey with id: "+s.getId());
        }

        // SurveyQuestions
        for(SurveyQuestionView questionView: surveyView.getQuestions())
        {
            SurveyQuestion q;
            if(questionView.getId() <= 0)
            {
                q = DomainObjectFactory.createSurveyQuestionImpl();
                questionView.persistViewInObject(q);
                q.setSurvey(s);
                DaoFactory.getSurveyQuestionDaoImpl().save(q);
            }
            else
            {
                q = DaoFactory.getSurveyQuestionDaoImpl().load(questionView.getId());
                questionView.persistViewInObject(q);
            }

            // SurveyQuestionItems
            for(SurveyQuestionItemView itemView: questionView.getItems())
            {
                SurveyQuestionItem qi;
                if(itemView.getId() <= 0)
                {
                    qi = DomainObjectFactory.createSurveyQuestionItemImpl();
                    itemView.persistViewInObject(qi);
                    qi.setQuestion(q);
                    DaoFactory.getSurveyQuestionItemDaoImpl().save(qi);
                }
                else
                {
                    qi = DaoFactory.getSurveyQuestionItemDaoImpl().load(itemView.getId());
                    itemView.persistViewInObject(qi);
                }

                // SurveyQuestionCandidateAnswers
                for(SurveyQuestionCandidateAnswerView candidateAnswerView: itemView.getCandidates())
                {
                    SurveyQuestionCandidateAnswer ca;
                    if(candidateAnswerView.getId() <= 0)
                    {
                        ca = DomainObjectFactory.createSurveyQuestionCandidateAnswerImpl();
                        candidateAnswerView.persistViewInObject(ca);
                        ca.setQuestionItem(qi);
                        DaoFactory.getSurveyQuestionCandidateAnswerDaoImpl().save(ca);
                    }
                    else
                    {
                        ca = DaoFactory.getSurveyQuestionCandidateAnswerDaoImpl().load(candidateAnswerView.getId());
                        candidateAnswerView.persistViewInObject(ca);
                    }
                }
            }
        }

        SurveyView view = new SurveyView(s);

        AbstractDao.getCurrentSession().flush();
        AbstractDao.getCurrentSession().getTransaction().commit();
        AbstractDao.getCurrentSession().beginTransaction();
        // start a thread
        if(surveyView.getId() <= 0)
        {
            CreateEditSurveyService service = new CreateEditSurveyService();
            service.request = request;
            service.surveyId = s.getId();

            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 void processDeletedObjects(SurveyView surveyView)
    {

        1.5.0/docs/api/java/lang/String.html">String deletedCandidatesIdsStr = surveyView.getDeletedCandidates();
        if(deletedCandidatesIdsStr != null)
        {
            1.5.0/docs/api/java/lang/String.html">String[] deletedCandidatesIds = deletedCandidatesIdsStr.split(",");
            for(1.5.0/docs/api/java/lang/String.html">String deletedCandidateId : deletedCandidatesIds)
            {
                if(deletedCandidateId.length() <= 0) continue;
                long id = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(deletedCandidateId);
                SurveyQuestionCandidateAnswerImpl ca = (SurveyQuestionCandidateAnswerImpl) DaoFactory.getSurveyQuestionCandidateAnswerDaoImpl().load(id);
                DaoFactory.getSurveyQuestionCandidateAnswerDaoImpl().delete(ca);
            }
        }

        1.5.0/docs/api/java/lang/String.html">String deletedItemsIdsStr = surveyView.getDeletedItems();
        if(deletedItemsIdsStr != null)
        {
            1.5.0/docs/api/java/lang/String.html">String[] deletedItemsIds = deletedItemsIdsStr.split(",");
            for(1.5.0/docs/api/java/lang/String.html">String deletedItemId : deletedItemsIds)
            {
                if(deletedItemId.length() <= 0) continue;
                long id = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(deletedItemId);
                SurveyQuestionItemImpl qi = (SurveyQuestionItemImpl) DaoFactory.getSurveyQuestionItemDaoImpl().load(id);
                DaoFactory.getSurveyQuestionItemDaoImpl().delete(qi);
            }
        }

        1.5.0/docs/api/java/lang/String.html">String deletedQuestionsIdsStr = surveyView.getDeletedQuestions();
        if(deletedQuestionsIdsStr != null)
        {
            1.5.0/docs/api/java/lang/String.html">String[] deletedQuestionsIds = deletedQuestionsIdsStr.split(",");
            for(1.5.0/docs/api/java/lang/String.html">String deletedQuestionId : deletedQuestionsIds)
            {
                if(deletedQuestionId.length() <= 0) continue;
                long id = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(deletedQuestionId);
                SurveyQuestionImpl q = (SurveyQuestionImpl) DaoFactory.getSurveyQuestionDaoImpl().load(id);
                DaoFactory.getSurveyQuestionDaoImpl().delete(q);
            }
        }
    }

    private synchronized SurveyImpl createPedagogicResponses(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();

        SurveyStructuralNodeImpl nodeYear = createSurveyStructuralNodeTree(survey,importYear,null);
        survey.setStructuralNode(nodeYear);
        SurveyStructuralNodeImpl nodeSemester = createSurveyStructuralNodeTree(survey,semesterMsg,nodeYear);

        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);
            SurveyStructuralNodeImpl nodeArea = createSurveyStructuralNodeTree(survey,areaMsg,nodeSemester);
            List<Course> courses = DaoFactory.getCourseDaoImpl().findAllImportYearOrderByName(importYear,area);
            for(Course course : courses)
            {
                SurveyStructuralNodeImpl nodeCourse = createSurveyStructuralNodeTree(survey,course.getName(),nodeArea);
                List<CourseUnit> courseUnits = DaoFactory.getCourseUnitDaoImpl().loadCourseUnits(course.getId(),semester,importYear,false,false);
                for(CourseUnit courseUnit: courseUnits)
                {
                    SurveyStructuralNodeImpl nodeCourseUnit = createSurveyStructuralNodeTree(survey,courseUnit.getName(),nodeCourse);

                    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)
                    {
                        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 createGeneralResponses(SurveyImpl survey)
    {
        1.5.0/docs/api/java/lang/String.html">String importYear = survey.getYear();
        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);
        List<String> roles = RoleManager.getRolesFromSerial(survey.getTargetRoles());
        List<User> users = new ArrayList<User>();

        SurveyStructuralNodeImpl nodeYear = createSurveyStructuralNodeTree(survey,importYear,null);
        survey.setStructuralNode(nodeYear);
        SurveyStructuralNodeImpl nodeSemester = createSurveyStructuralNodeTree(survey,semesterMsg,nodeYear);
        SurveyStructuralNodeImpl nodeGeneral = createSurveyStructuralNodeTree(survey,survey.getTitle(),nodeSemester);

        if(roles.size() == 1 && roles.get(0).equals("all"))
            users.addAll(DaoFactory.getUserDaoImpl().getAll());
        else
            users.addAll(DaoFactory.getUserDaoImpl().loadRolesUsers(roles));

        List<SurveyResponse> responses = new ArrayList<SurveyResponse>();
        for(User user : users)
        {
            SurveyResponse sr = DomainObjectFactory.createSurveyResponseImpl();
            sr.setAnswered(false);
            sr.setOwner(user);
            sr.setStructuralNode(nodeGeneral);
            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 SurveyStructuralNodeImpl createSurveyStructuralNodeTree(Survey survey, 1.5.0/docs/api/java/lang/String.html">String msg, SurveyStructuralNodeImpl parent)
    {
        SurveyStructuralNodeImpl child = DomainObjectFactory.createSurveyStructuralNodeImpl();
        if(parent != null)
        {
            parent = (SurveyStructuralNodeImpl) DaoFactory.getSurveyStructuralNodeDaoImpl().load(parent.getId());
            parent.getNodes().add(child);
        }
        child.setMsg(msg);
        child.setSurvey(survey);
        child.setParentNode(parent);
        DaoFactory.getSurveyStructuralNodeDaoImpl().save(child);
        return child;
    }

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

        logger.info("Loading survey with id: "+surveyId);
        SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);

        survey.setStatusPercentage(0);
        survey.setStatus(SurveyStatusEnum.STATUS_CREATE_SURVEY.getStatus());

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

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

        if(survey.isTypeOf(Globals.SURVEY_TYPE_GENERAL))
        {
            logger.info("Creating general responses...");
            survey = createGeneralResponses(survey);
        }
        else if(survey.isTypeOf(Globals.SURVEY_TYPE_PEDAGOGIC))
        {
            logger.info("Creating pedagogic responses...");
            survey = createPedagogicResponses(survey);
        }

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