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