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