Subversion Repositories bacoAlunos

Rev

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

package pt.estgp.estgweb.services.surveys;

import jomm.dao.impl.AbstractDao;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.impl.SurveyQuestionDaoImpl;
import pt.estgp.estgweb.domain.views.*;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.utils.DatesUtils;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.utils.RoleManager;
import pt.estgp.estgweb.utils.StringsUtils;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import java.util.*;

/**
 * @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;

    public SurveyView createEditSurveyService(SurveyView surveyView, UserSession userSession) throws AccessDeniedOperationException
    {
        // delete questions, items, candidates
        processDeletedObjects(surveyView);

        // Survey
        Survey s;

        if(surveyView.getId() <= 0)
        {
            s = DomainObjectFactory.createSurveyImpl();
            surveyView.persistViewInObject(s);
            s.setOwner(userSession.getUser());
            s.setSemester(DatesUtils.getSemestre());
            s.setYear(DatesUtils.getImportYear());
            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: "+s.getId());
        }
        else
        {
            s = DaoFactory.getSurveyDaoImpl().load(surveyView.getId());
            surveyView.persistViewInObject(s);
            logger.info("Updating survey: "+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);
                logger.info("Updating survey question: "+q.getId());
            }

            // 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);
                    logger.info("Updating survey question item: "+qi.getId());
                }

                // 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);
                        logger.info("Updating survey question item: " + ca.getId());
                    }
                }
            }
        }

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

        // start a thread
        if(surveyView.getId() <= 0)
        {
            Survey survey = DaoFactory.getSurveyDaoImpl().load(s.getId());
            this.surveyId = survey.getId();
            survey.setStatusPercentage(0);
            survey.setStatus(SurveyStatusEnum.STATUS_CREATE_SURVEY.getStatus());

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

        return surveyView;
    }

    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 void createPedagogicResponses(Survey survey)
    {
        List<String> areas = DaoFactory.getCourseDaoImpl().loadAreas();
        1.5.0/docs/api/java/lang/String.html">String semester = DatesUtils.getSemestre();
        1.5.0/docs/api/java/lang/String.html">String importYear = DatesUtils.getImportYear();

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

        List<SurveyResponse> responses = new ArrayList<SurveyResponse>();
        for(1.5.0/docs/api/java/lang/String.html">String area : areas)
        {
            SurveyStructuralNodeImpl nodeArea = createSurveyStructuralNodeTree(survey,area,nodeSemester);
            List<Course> courses = DaoFactory.getCourseDaoImpl().findAllImportYearOrderByName(DatesUtils.getImportYear(),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.addAll(DaoFactory.getStudentDaoImpl().loadByCourseUnit(courseUnit.getId()));
                    else if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_TEACHER_COURSEUNIT))
                        users.addAll(DaoFactory.getTeacherDaoImpl().loadByCourseUnit(courseUnit.getId()));

                    for(User user : users)
                    {
                        SurveyResponse sr = DomainObjectFactory.createSurveyResponseImpl();
                        sr.setAnswered(false);
                        sr.setOwner(user);
                        sr.setStructuralNode(nodeCourseUnit);
                        responses.add(sr);
                    }
                }
            }
        }

        long i = 1;
        int status;
        if(responses.size() > 0)
        {
            for(SurveyResponse r : responses)
            {
                if (i++ % MAX_COMMIT == 0)
                {
                    AbstractDao.getCurrentSession().getTransaction().commit();
                    AbstractDao.getCurrentSession().beginTransaction();
                    survey = DaoFactory.getSurveyDaoImpl().load(survey.getId());
                }
                DaoFactory.getSurveyResponseDaoImpl().save(r);

                status = (int)(((double)i/(double)responses.size())*100);
                if(status >= 100)
                {
                    status = 100;
                    survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
                }
                survey.setStatusPercentage(status);
                DaoFactory.getSurveyDaoImpl().saveOrUpdate(survey);
            }
        }
    }

    private synchronized void createGeneralResponses(Survey 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));

        1.5.0/docs/api/java/lang/String.html">String importYear = DatesUtils.getImportYear();
        1.5.0/docs/api/java/lang/String.html">String semester = DatesUtils.getSemestre();

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

        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);
        }

        long i = 1;
        int status;
        if(responses.size() > 0)
        {
            for(SurveyResponse r : responses)
            {
                if (i++ % MAX_COMMIT == 0)
                {
                    AbstractDao.getCurrentSession().getTransaction().commit();
                    AbstractDao.getCurrentSession().beginTransaction();
                    survey = DaoFactory.getSurveyDaoImpl().load(survey.getId());
                }
                DaoFactory.getSurveyResponseDaoImpl().save(r);

                status = (int)(((double)i/(double)responses.size())*100);
                if(status >= 100)
                {
                    status = 100;
                    survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
                }
                survey.setStatusPercentage(status);
                DaoFactory.getSurveyDaoImpl().saveOrUpdate(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();

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

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

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