Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 683 → Rev 684

/impl/conf/language/MessageResourcesSurvey.properties
1,6 → 1,6
################################################################################
#
# Survey MESSAGE RESOURCES
# Survey MESSAGE RESOURCES - Duarte Santos
#
################################################################################
 
59,6 → 59,7
# LIST SURVEY
survey.list.form.title=Título
survey.list.form.type=Tipo
survey.list.form.target=Destinatários
survey.list.form.year=Ano
survey.list.form.semester=Semestre
survey.list.form.start.date=Data de Início
/impl/conf/WEB-INF/struts/struts-survey.xml
41,10 → 41,9
<forward name="home" path="page.separators.home"/>
</action>
 
<action path="/user/startViewSurveyNodeGraphs" forward="page.view.node.graphs.from.serviceZone"/>
<action path="/user/startLoadSurveyNodeGraphs" forward="page.load.survey.node.graphs"/>
<action path="/user/startListSurveyStats" forward="/user/surveysControllerFromServiceZone.do?dispatch=listStats"/>
<action path="/user/startListSurveysFromServiceZone" forward="page.list.surveys.from.serviceZone"/>
<action path="/user/startListSurveyStatsFromServiceZone" forward="/user/surveysControllerFromServiceZone.do?dispatch=listStats&amp;from=ServiceZone"/>
<action path="/user/startGenerateSurveyStatsFromServiceZone" forward="/user/surveysControllerFromServiceZone.do?dispatch=generateStats&amp;from=ServiceZone"/>
<action path="/user/startConsistSurveyFromServiceZone" forward="/user/surveysControllerFromServiceZone.do?dispatch=consist&amp;from=ServiceZone"/>
<action path="/user/startCloneSurveyFromServiceZone" forward="/user/surveysControllerFromServiceZone.do?dispatch=clone&amp;from=ServiceZone"/>
58,7 → 57,7
input="page.submit.survey.from.serviceZone"
validate="false">
<forward name="response" path="page.submit.survey.response.from.home"/>
<forward name="stats" path="page.list.survey.stats.from.serviceZone"/>
<forward name="stats" path="page.list.survey.stats"/>
<forward name="serviceZone" path="page.separators.serviceZone"/>
<forward name="from.add.role" path="page.submit.survey.from.serviceZone"/>
</action>
/impl/conf/WEB-INF/struts/tiles-survey.xml
18,17 → 18,16
<put name="body" value="/user/surveys/listSurveys.jsp"/>
</definition>
 
<definition name="page.list.survey.stats.from.serviceZone" extends="page.separators.serviceZone">
<definition name="page.list.survey.stats" extends="page.separators.serviceZone">
<put name="title" value="Questionário"/>
<put name="topnav" value="/user/serviceZone/topnavListSurveyStats.jsp"/>
<put name="body" value="/user/surveys/listSurveyStats.jsp"/>
</definition>
 
<!--ver-->
<definition name="page.view.node.graphs.from.serviceZone" extends="page.separators.serviceZone">
<definition name="page.load.survey.node.graphs" extends="page.separators.serviceZone">
<put name="title" value="Questionário"/>
<put name="topnav" value="/user/serviceZone/topnavViewSurveyNodeGraphs.jsp"/>
<put name="body" value="/user/surveys/viewResponseGraphs.jsp"/>
<put name="topnav" value="/user/serviceZone/topnavLoadSurveyNodeGraphs.jsp"/>
<put name="body" value="/user/surveys/loadSurveyNodeGraphs.jsp"/>
</definition>
 
<definition name="page.submit.survey.response.from.home" extends="page.separators.home">
/impl/conf/app.properties
1,4 → 1,4

 
#FICHEIRO DE CONFIGURACOES
 
tmp.dir=@tmp.dir@
95,14 → 95,13
ionline.use.default.credentials.to.updates.and.deletes=false
 
server.estgp.start.path=
#server.estgp=http://localhost:9090/static --dars
server.estgp=http://deptal.estgp.pt:9090/static
server.estgp=http://localhost:9090/static
estgp.encoding=UTF-8
estgp.proxy.host=
estgp.proxy.port=
 
server.conteudos.start.path=
#server.conteudos=http://localhost:9090/conteudos --dars
#server.conteudos=http://localhost:9090/conteudos
server.conteudos=http://deptal.estgp.pt:9090/conteudos
conteudos.encoding=UTF-8
conteudos.proxy.host=
289,7 → 288,6
surveys.stats.consult.role.0=all
surveys.stats.consult.role.1=teacher
surveys.stats.consult.role.2=student
surveys.stats.consult.role.3=admin
 
surveys.question.type.0=radio
surveys.question.type.1=check
297,9 → 295,10
surveys.question.type.3=text
 
# Stats
surveys.stats.graph.img.width=700
surveys.stats.graph.img.width=800
surveys.stats.graph.img.height=300
 
 
#########################################################################
# Link Analysis
#
420,8 → 419,8
#
#PopService
#
#pop.container.use=true --dars
pop.container.use=false
pop.container.use=true
#pop.container.use=false
pop.web.interface=http://mail.estgp.pt/exchange
pop.server=mail.estgp.pt
pop.use.default.server=true
/impl/conf/berserk/sd.xml
1477,44 → 1477,64
 
<!-- Duarte Santos -->
<service>
<name>CreateEditSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.CreateEditSurveyService</implementationClass>
<description>Create or Edit an survey</description>
<name>LoadSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveyService</implementationClass>
<description>Load survey view</description>
<isTransactional>true</isTransactional>
<defaultMethod>createEditSurveyService</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<!--<chain name="OwnersLoadSurvey"/>-->
</filterChains>
</service>
<service>
<name>LoadSurvey</name>
<name>LoadEditSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveyService</implementationClass>
<description>Load an Survey view</description>
<description>Load survey view to edit</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="CanEditSurvey"/>
</filterChains>
</service>
<service>
<name>LoadCloneSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveyService</implementationClass>
<description>Load survey view to clone</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="OwnersLoadSurvey"/>
</filterChains>
</service>
<service>
<name>LoadListStatsSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveyService</implementationClass>
<description>Load survey view to list stats</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="CanConsultSurveyStats"/>
</filterChains>
</service>
<service>
<name>LoadSurveys</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveysService</implementationClass>
<description>Load all Surveys</description>
<description>Load all survey views</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>LoadOwnedSurveys</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveysService</implementationClass>
<description>Load owned surveys</description>
<description>Load owned survey views</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadOwnedSurveys</defaultMethod>
<filterChains>
1526,58 → 1546,59
<service>
<name>LoadSurveyResponse</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveyResponseService</implementationClass>
<description>Load an Survey response view</description>
<description>Load survey response view</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="OwnersLoadResponse"/>
</filterChains>
</service>
<service>
<name>InsertSurveyAnswers</name>
<implementationClass>pt.estgp.estgweb.services.surveys.InsertSurveyAnswersService</implementationClass>
<description>Insert list of answers</description>
<name>CreateEditSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.CreateEditSurveyService</implementationClass>
<description>Create or edit survey</description>
<isTransactional>true</isTransactional>
<defaultMethod>createEditSurveyService</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>ConsistSurvey</name>
<implementationClass>pt.estgp.estgweb.services.surveys.ConsistSurveyService</implementationClass>
<description>Apply survey answers to created new users</description>
<description>Apply survey responses to new users</description>
<isTransactional>true</isTransactional>
<defaultMethod>consistService</defaultMethod>
<defaultMethod>consistSurveyService</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="OwnersLoadSurvey"/>
</filterChains>
</service>
<service>
<name>GenerateSurveyStats</name>
<implementationClass>pt.estgp.estgweb.services.surveys.GenerateSurveyStatsService</implementationClass>
<description>Generate all survey stats</description>
<name>InsertSurveyAnswers</name>
<implementationClass>pt.estgp.estgweb.services.surveys.InsertSurveyAnswersService</implementationClass>
<description>Insert survey answers</description>
<isTransactional>true</isTransactional>
<defaultMethod>generateStatsService</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="OwnersLoadResponse"/>
</filterChains>
</service>
<service>
<name>LoadNodeGraphs</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadNodeGraphsService</implementationClass>
<name>GenerateSurveyStats</name>
<implementationClass>pt.estgp.estgweb.services.surveys.GenerateSurveyStatsService</implementationClass>
<description>Generate all survey stats</description>
<isTransactional>true</isTransactional>
<defaultMethod>generateStatsService</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="OwnersLoadSurvey"/>
</filterChains>
</service>
<service>
1588,7 → 1609,33
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<!--<chain name="OwnersLoadSurvey"/>-->
<chain name="OwnersLoadSurvey"/>
</filterChains>
</service>
<service>
<name>LoadSurveyNodeGraphs</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadSurveyNodeGraphsService</implementationClass>
<description>Load survey graphics of a node</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="CanConsultSurveyStats"/>
</filterChains>
</service>
<service>
<name>LoadConsultStatsSurveys</name>
<implementationClass>pt.estgp.estgweb.services.surveys.LoadConsultStatsSurveysService</implementationClass>
<description>Load surveys views which user can consult stats</description>
<isTransactional>true</isTransactional>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
</filterChains>
</service>
<!-- Duarte Santos -->
 
 
 
</serviceDefinitions>
/impl/conf/berserk/fd.xml
183,4 → 183,21
<description>Check if a resource can be loaded</description>
<isTransactional>false</isTransactional>
</filter>
 
 
<!-- Duarte Santos -->
<filter>
<name>CanConsultSurveyStatsClass</name>
<implementationClass>pt.estgp.estgweb.filters.filters.CanConsultSurveyStatsClass</implementationClass>
<description>Checks if the requester can consult stats of specified object</description>
<isTransactional>false</isTransactional>
</filter>
<filter>
<name>CanEditSurveyClass</name>
<implementationClass>pt.estgp.estgweb.filters.filters.CanEditSurveyClass</implementationClass>
<description>Checks if the requester can edit specified object</description>
<isTransactional>false</isTransactional>
</filter>
<!-- Duarte Santos -->
</filterDefinitions>
/impl/conf/berserk/fcd.xml
206,7 → 206,7
<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>
</filterChain>
 
<!--Surveys - Duarte Santos-->
<!-- Duarte Santos -->
<filterChain>
<name>OwnersLoadSurvey</name>
<expression>OwnerUsersClass("serializable","pt.estgp.estgweb.domain.SurveyImpl")</expression>
214,23 → 214,28
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>
</filterChain>
 
 
<filterChain>
<name>ContextStaticTimerExample</name>
<expression>ContextStaticTimer("2008-03-1 12:00:00","2008-03-2 19:56:00")</expression>
<description>Timer Control Chain</description>
<name>CanConsultSurveyStats</name>
<expression>CanConsultSurveyStatsClass("serializable","pt.estgp.estgweb.domain.SurveyImpl")</expression>
<description>Owner of an object Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.ContextControlFilter</filterClass>
<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>
</filterChain>
 
<filterChain>
<name>ContextObjectTimer</name>
<expression>ContextObjectTimer("object.serializable","object.referenceClass")</expression>
<description>Timer Control Chain from Object Time</description>
<name>OwnersLoadResponse</name>
<expression>OwnerUsersClass("serializable","pt.estgp.estgweb.domain.SurveyResponseImpl")</expression>
<description>Owner of an object Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.ContextControlFilter</filterClass>
<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>
</filterChain>
<filterChain>
<name>CanEditSurvey</name>
<expression>CanEditSurveyClass("serializable","pt.estgp.estgweb.domain.SurveyImpl")</expression>
<description>Owner of an object Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>
</filterChain>
<!-- Duarte Santos -->
 
 
 
/impl/src/java/jomm/dao/impl/AbstractDao.java
5,22 → 5,22
import jomm.dao.IDomainObjectDao;
import jomm.dao.utils.HibernateUtils;
import org.hibernate.*;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import static org.hibernate.criterion.Restrictions.eq;
import org.hibernate.proxy.HibernateProxy;
import pt.estgp.estgweb.domain.DomainObject;
import pt.estgp.estgweb.domain.DomainSerializableObject;
import pt.estgp.estgweb.domain.Teacher;
 
import java.io.Serializable;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Date;
 
import static org.hibernate.criterion.Restrictions.eq;
 
 
/**
* This class will not be overwritten once it has been created. This is the
* superclass of all DAOs.
235,6 → 235,7
}
}
 
public List<CLAZZ> getAll()
{
Session s = getCurrentSession();
/impl/src/java/pt/estgp/estgweb/Globals.java
233,7 → 233,7
public static final boolean MODULE_STATUS_PROFILE = ConfigProperties.getBooleanProperty("module.profile");
public static final boolean MODULE_STATUS_COURSEUNITS = ConfigProperties.getBooleanProperty("module.courseunits");
public static final boolean MODULE_STATUS_SMS = ConfigProperties.getBooleanProperty("module.sms");
// Duarte Santos
// Duarte Santos
public static final boolean MODULE_STATUS_SURVEYS = ConfigProperties.getBooleanProperty("module.surveys");
// Duarte Santos
public static final String SURVEY_TYPE_GENERAL = ConfigProperties.getProperty("surveys.type.0");
/impl/src/java/pt/estgp/estgweb/services/surveys/LoadNodeGraphsService.java
File deleted
/impl/src/java/pt/estgp/estgweb/services/surveys/ConsistSurveyService.java
1,17 → 1,15
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.SurveyView;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.estgp.estgweb.utils.RoleManager;
import pt.estgp.estgweb.web.controllers.surveys.SurveysController;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
 
28,38 → 26,41
private static final int MAX_COMMIT = 100;
 
private long surveyId;
private HttpServletRequest request;
 
public void consistService(long surveyId, UserSession userSession)
public void consistSurveyService(long surveyId, HttpServletRequest request, UserSession userSession)
{
if(surveyId <= 0) return;
 
Survey survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
if(survey != null)
{
this.surveyId = surveyId;
survey.setStatusPercentage(0);
survey.setStatus(SurveyStatusEnum.STATUS_CONSIST_SURVEY.getStatus());
ConsistSurveyService s = new ConsistSurveyService();
s.request = request;
s.surveyId = surveyId;
 
// start a thread
Thread thread = new Thread(this);
Thread thread = new Thread(s);
thread.start();
logger.info("Starting thread with id: "+thread.getId());
}
}
 
private synchronized void consistPedagogic(Survey survey)
private synchronized SurveyImpl consistPedagogic(SurveyImpl survey)
{
String semester = survey.getSemester();
String semesterMsg = MessageResources.getMessage(request,"courseunit."+semester);
String importYear = survey.getYear();
List<String> areas = DaoFactory.getCourseDaoImpl().loadAreas();
 
SurveyStructuralNode nodeYear = survey.getStructuralNode();
SurveyStructuralNode nodeSemester = ((SurveyStructuralNodeImpl)nodeYear).getChildNode(semester);
SurveyStructuralNode nodeSemester = ((SurveyStructuralNodeImpl)nodeYear).getChildNode(semesterMsg);
 
List<SurveyResponse> responses = new ArrayList<SurveyResponse>();
for(String area : areas)
{
SurveyStructuralNode nodeArea = ((SurveyStructuralNodeImpl)nodeSemester).getChildNode(area);
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)
{
71,9 → 72,13
List<User> users = new ArrayList<User>();
if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_STUDENT_COURSEUNIT))
users.addAll(DaoFactory.getStudentDaoImpl().loadByCourseUnit(courseUnit.getId()));
{
users = new ArrayList<User>(courseUnit.getStudents());
}
else if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_TEACHER_COURSEUNIT))
users.addAll(DaoFactory.getTeacherDaoImpl().loadByCourseUnit(courseUnit.getId()));
{
users = new ArrayList<User>(courseUnit.getTeachers());
}
 
for(User user: users)
{
90,38 → 95,37
}
}
 
long i = 1;
if(responses.size() == 0)
{
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
survey.setStatusPercentage(100);
return survey;
}
 
long i = 0;
int status;
if(responses.size() > 0)
for(SurveyResponse r : responses)
{
for(SurveyResponse r : responses)
long userId = r.getOwner().getId();
long nodeId = r.getStructuralNode().getId();
if(i++ % MAX_COMMIT == 0)
{
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);
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);
}
else
{
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
survey.setStatusPercentage(100);
}
survey.setStatusPercentage(100);
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
return survey;
}
 
private synchronized void consistGeneral(Survey survey)
private synchronized SurveyImpl consistGeneral(SurveyImpl survey)
{
List<String> roles = RoleManager.getRolesFromSerial(survey.getTargetRoles());
List<User> users = new ArrayList<User>();
149,35 → 153,35
}
}
 
if(responses.size() == 0)
{
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
survey.setStatusPercentage(100);
return survey;
}
 
long i = 0;
int status;
if(responses.size() > 0)
for(SurveyResponse r : responses)
{
for(SurveyResponse r : responses)
long userId = r.getOwner().getId();
long nodeId = r.getStructuralNode().getId();
 
if(i++ % MAX_COMMIT == 0)
{
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);
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);
}
else
{
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
survey.setStatusPercentage(100);
}
survey.setStatusPercentage(100);
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
return survey;
}
 
public void run()
185,17 → 189,24
logger.info("Running thread...");
AbstractDao.getCurrentSession().beginTransaction();
 
Survey survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
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...");
consistGeneral(survey);
survey = consistGeneral(survey);
}
else if(((SurveyImpl)survey).isTypeOf(Globals.SURVEY_TYPE_PEDAGOGIC))
{
logger.info("Consisting pedagogic survey...");
consistPedagogic(survey);
survey = consistPedagogic(survey);
}
 
AbstractDao.getCurrentSession().getTransaction().commit();
/impl/src/java/pt/estgp/estgweb/services/surveys/GenerateSurveyStatsCsvService.java
42,9 → 42,12
String filename = Globals.TMP_DIR + "/survey_"+survey.getId()+".csv";
File file = new File(filename);
FileOutputStream fout = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fout, Charset.forName("UTF-8"));
fout.write(239);
fout.write(187);
fout.write(191);
OutputStreamWriter writer = new OutputStreamWriter(fout, "UTF-8");
 
String[] csvHeader = {"IDResposta","IDQuestionario","Titulo do Questionario","IDPergunta","Pergunta","IDItem","Item","IDCandidata","Candidata","Resposta de Texto","IDUtilizador","Utilizador","Nos"};
String[] csvHeader = {"IDResposta","IDQuestionário","Título do Questionário","IDPergunta","Pergunta","IDItem","Item","IDCandidata","Candidata","Resposta de Texto","IDUtilizador","Utilizador","Nós"};
writeCsvHeader(writer,csvHeader);
 
List list = DaoFactory.getSurveyQuestionAnswerDaoImpl().loadForCsv(survey.getId());
82,11 → 85,13
String extension = FilesUtils.getExtension(filename);
FileInputStream inputStream = new FileInputStream(file);
String identifier = survey.getIdentifier();
 
if(identifier == null)
identifier = repositoryService.storeRepositoryFile(inputStream,"text/comma-separated-values",extension,(int)file.length(),file.getName(),"CSV file of survey: "+survey.getId(), ResourceAccessControlEnum.surveyStatsDomain,userSession);
else
repositoryService.updateRepositoryFile(identifier,inputStream,"text/comma-separated-values",extension,(int)file.length(),file.getName(),"CSV file of survey: "+survey.getId(),ResourceAccessControlEnum.surveyStatsDomain);
 
survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
survey.setIdentifier(identifier);
 
boolean deleted = file.delete();
/impl/src/java/pt/estgp/estgweb/services/surveys/InsertSurveyAnswersService.java
22,7 → 22,7
 
private LoadSurveyService loadSurveyService = new LoadSurveyService();
 
public SurveyView run(SurveyView surveyView, long responseId, UserSession userSession)
public SurveyView run(long responseId, SurveyView surveyView, UserSession userSession)
{
SurveyResponse response = DaoFactory.getSurveyResponseDaoImpl().load(responseId);
 
56,6 → 56,8
response.setDate(new Date());
response.setAnswered(true);
 
logger.info("Answer inserted to survey with id: "+surveyView.getId());
 
return loadSurveyService.run(surveyView.getId(), userSession);
}
}
/impl/src/java/pt/estgp/estgweb/services/surveys/CreateEditSurveyService.java
1,19 → 1,23
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.impl.SurveyQuestionDaoImpl;
import pt.estgp.estgweb.domain.views.*;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
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 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.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
* @author: Duarte Santos
28,15 → 32,12
private static final int MAX_COMMIT = 100;
 
private long surveyId;
private HttpServletRequest request;
 
public SurveyView createEditSurveyService(SurveyView surveyView, UserSession userSession) throws AccessDeniedOperationException
public SurveyView createEditSurveyService(SurveyView surveyView, HttpServletRequest request, UserSession userSession)
{
// delete questions, items, candidates
processDeletedObjects(surveyView);
 
// Survey
Survey s;
 
SurveyImpl s;
if(surveyView.getId() <= 0)
{
s = DomainObjectFactory.createSurveyImpl();
50,13 → 51,15
s.setStatusPercentage(0);
s.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
DaoFactory.getSurveyDaoImpl().save(s);
logger.info("Creating survey: "+s.getId());
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("Updating survey: "+s.getId());
logger.info("Editing survey with id: "+s.getId());
}
 
// SurveyQuestions
74,7 → 77,6
{
q = DaoFactory.getSurveyQuestionDaoImpl().load(questionView.getId());
questionView.persistViewInObject(q);
logger.info("Updating survey question: "+q.getId());
}
 
// SurveyQuestionItems
92,7 → 94,6
{
qi = DaoFactory.getSurveyQuestionItemDaoImpl().load(itemView.getId());
itemView.persistViewInObject(qi);
logger.info("Updating survey question item: "+qi.getId());
}
 
// SurveyQuestionCandidateAnswers
110,29 → 111,26
{
ca = DaoFactory.getSurveyQuestionCandidateAnswerDaoImpl().load(candidateAnswerView.getId());
candidateAnswerView.persistViewInObject(ca);
logger.info("Updating survey question item: " + ca.getId());
}
}
}
}
 
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
SurveyView view = new SurveyView(s);
 
// 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());
CreateEditSurveyService service = new CreateEditSurveyService();
service.request = request;
service.surveyId = s.getId();
 
Thread thread = new Thread(this);
Thread thread = new Thread(service);
thread.start();
logger.info("Starting thread with id: "+thread.getId());
}
 
return surveyView;
return view;
}
 
private void processDeletedObjects(SurveyView surveyView)
178,21 → 176,23
}
}
 
private synchronized void createPedagogicResponses(Survey survey)
private synchronized SurveyImpl createPedagogicResponses(SurveyImpl survey)
{
String semester = survey.getSemester();
String semesterMsg = MessageResources.getMessage(request,"courseunit."+semester);
String importYear = survey.getYear();
List<String> areas = DaoFactory.getCourseDaoImpl().loadAreas();
String semester = DatesUtils.getSemestre();
String importYear = DatesUtils.getImportYear();
 
SurveyStructuralNodeImpl nodeYear = createSurveyStructuralNodeTree(survey,importYear,null);
survey.setStructuralNode(nodeYear);
SurveyStructuralNodeImpl nodeSemester = createSurveyStructuralNodeTree(survey,semester,nodeYear);
SurveyStructuralNodeImpl nodeSemester = createSurveyStructuralNodeTree(survey,semesterMsg,nodeYear);
 
List<SurveyResponse> responses = new ArrayList<SurveyResponse>();
for(String area : areas)
{
SurveyStructuralNodeImpl nodeArea = createSurveyStructuralNodeTree(survey,area,nodeSemester);
List<Course> courses = DaoFactory.getCourseDaoImpl().findAllImportYearOrderByName(DatesUtils.getImportYear(),area);
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);
203,9 → 203,13
 
List<User> users = new ArrayList<User>();
if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_STUDENT_COURSEUNIT))
users.addAll(DaoFactory.getStudentDaoImpl().loadByCourseUnit(courseUnit.getId()));
{
users = new ArrayList<User>(courseUnit.getStudents());
}
else if(survey.getTargetRoles().equals(Globals.SURVEY_PEDAGOGIC_TEACHER_COURSEUNIT))
users.addAll(DaoFactory.getTeacherDaoImpl().loadByCourseUnit(courseUnit.getId()));
{
users = new ArrayList<User>(courseUnit.getTeachers());
}
 
for(User user : users)
{
219,50 → 223,56
}
}
 
long i = 1;
if(responses.size() == 0)
{
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
survey.setStatusPercentage(100);
return survey;
}
 
long i = 0;
int status;
if(responses.size() > 0)
for(SurveyResponse r : responses)
{
for(SurveyResponse r : responses)
long userId = r.getOwner().getId();
long nodeId = r.getStructuralNode().getId();
 
if (i++ % MAX_COMMIT == 0)
{
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);
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 void createGeneralResponses(Survey survey)
private synchronized SurveyImpl createGeneralResponses(SurveyImpl survey)
{
String importYear = survey.getYear();
String semester = survey.getSemester();
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));
 
String importYear = DatesUtils.getImportYear();
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)
{
273,30 → 283,36
responses.add(sr);
}
 
long i = 1;
if(responses.size() == 0)
{
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
survey.setStatusPercentage(100);
return survey;
}
 
long i = 0;
int status;
if(responses.size() > 0)
for(SurveyResponse r : responses)
{
for(SurveyResponse r : responses)
long userId = r.getOwner().getId();
long nodeId = r.getStructuralNode().getId();
 
if (i++ % MAX_COMMIT == 0)
{
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);
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, String msg, SurveyStructuralNodeImpl parent)
319,17 → 335,26
logger.info("Running thread...");
AbstractDao.getCurrentSession().beginTransaction();
 
Survey survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
logger.info("Loading survey with id: "+surveyId);
SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
 
if(((SurveyImpl)survey).isTypeOf(Globals.SURVEY_TYPE_GENERAL))
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...");
createGeneralResponses(survey);
survey = createGeneralResponses(survey);
}
else if(((SurveyImpl)survey).isTypeOf(Globals.SURVEY_TYPE_PEDAGOGIC))
else if(survey.isTypeOf(Globals.SURVEY_TYPE_PEDAGOGIC))
{
logger.info("Creating pedagogic responses...");
createPedagogicResponses(survey);
survey = createPedagogicResponses(survey);
}
 
AbstractDao.getCurrentSession().getTransaction().commit();
/impl/src/java/pt/estgp/estgweb/services/surveys/GenerateSurveyStatsService.java
7,11 → 7,15
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.text.TextBlockAnchor;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.TextAnchor;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
22,6 → 26,7
import pt.estgp.estgweb.utils.ConfigProperties;
 
import javax.servlet.http.HttpServletRequest;
import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
43,27 → 48,26
private HttpServletRequest request;
private UserSession userSession;
 
public void generateStatsService(HttpServletRequest request, long surveyId, UserSession userSession)
public void generateStatsService(long surveyId, HttpServletRequest request, UserSession userSession)
{
if(surveyId <= 0) return;
 
Survey survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
if(survey != null)
{
this.surveyId = surveyId;
this.request = request;
this.userSession = userSession;
survey.setStatusPercentage(0);
survey.setStatus(SurveyStatusEnum.STATUS_GENERATE_STATS.getStatus());
GenerateSurveyStatsService s = new GenerateSurveyStatsService();
s.request = request;
s.surveyId = surveyId;
s.userSession = userSession;
 
// start a thread
Thread thread = new Thread(this);
Thread thread = new Thread(s);
thread.start();
logger.info("Starting thread with id: "+thread.getId());
}
}
 
private synchronized SurveyStatsGraphic buildChart(HttpServletRequest request, SurveyQuestion q, SurveyStructuralNode node, UserSession userSession, boolean withCategories)
private synchronized JFreeChart buildChart(HttpServletRequest request, SurveyQuestion q, SurveyStructuralNode node, UserSession userSession, boolean withCategories)
{
// get counted values and labels
List<Integer> countedValues = new ArrayList<Integer>();
98,29 → 102,18
CategoryDataset dataset = buildCategoryDataset(categories,series,values);
JFreeChart chart = buildJFreeChart(q.getLabelpt(),domainAxisLabel,MessageResources.getMessage(request,"survey.stats.graph.axis.range.label"),dataset,orientation);
 
// store on repository
String filename = "/survey_"+q.getSurvey().getId()+"_question_"+q.getId()+"_node_"+node.getId()+".png";
SurveyStatsGraphic graph = DaoFactory.getSurveyStatsGraphicDaoImpl().load(q.getId(), node.getId());
String identifier;
if(graph == null)
{
identifier = storeChartRepository(chart,filename,"descricao",null,userSession);
if(identifier != null)
{
graph = DomainObjectFactory.createSurveyStatsGraphicImpl();
graph.setQuestion(q);
graph.setStructuralNode(node);
graph.setIdentifier(identifier);
}
}
else
{
identifier = graph.getIdentifier();
storeChartRepository(chart,filename,"descricao",identifier,userSession);
graph = null;
}
// chart configs
final CategoryPlot plot = chart.getCategoryPlot();
final ValueAxis valueAxis = plot.getRangeAxis();
final CategoryAxis categoryAxis = plot.getDomainAxis();
final CategoryLabelPositions positions = categoryAxis.getCategoryLabelPositions();
Font font = new Font("Tahoma",Font.PLAIN, 11);
categoryAxis.setMaximumCategoryLabelLines(3);
categoryAxis.setTickLabelFont(font);
CategoryLabelPosition right = new CategoryLabelPosition(RectangleAnchor.RIGHT, TextBlockAnchor.CENTER_RIGHT);
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.replaceRightPosition(positions, right));
 
return graph;
return chart;
}
 
public synchronized String storeChartRepository(JFreeChart chart, String filename, String description, String identifier, UserSession userSession)
187,50 → 180,79
logger.info("Running thread...");
AbstractDao.getCurrentSession().beginTransaction();
 
Survey survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
SurveyImpl survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
 
survey.setStatusPercentage(0);
survey.setStatus(SurveyStatusEnum.STATUS_GENERATE_STATS.getStatus());
 
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
 
survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
 
GenerateSurveyStatsCsvService service = new GenerateSurveyStatsCsvService();
service.run(surveyId,userSession);
 
List<SurveyStructuralNode> childNodes = ((SurveyStructuralNodeImpl)survey.getStructuralNode()).getChildsStructuralNodes();
List<SurveyStatsGraphic> graphics = new ArrayList<SurveyStatsGraphic>();
 
long total = childNodes.size() * survey.getQuestions().size();
long i = 0;
int status;
for(SurveyStructuralNode node : childNodes)
{
for(SurveyQuestion question : survey.getQuestions())
{
SurveyStatsGraphic graph = null;
if(question.getType().equals(Globals.SURVEY_QUESTION_TYPE_MATRIX))
graph = buildChart(request, question, node, userSession, true);
else if(question.getType().equals(Globals.SURVEY_QUESTION_TYPE_CHECK) || question.getType().equals(Globals.SURVEY_QUESTION_TYPE_RADIO))
graph = buildChart(request, question, node, userSession, false);
long nodeId = node.getId();
long questionId = question.getId();
 
if(graph != null)
graphics.add(graph);
}
}
 
long i = 0;
int status;
if(graphics.size() > 0)
{
for(SurveyStatsGraphic g : graphics)
{
if (i++ % MAX_COMMIT == 0)
{
status = (int)(((double)i/(double)total)*100);
survey.setStatusPercentage(status);
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
survey = DaoFactory.getSurveyDaoImpl().load(survey.getId());
survey = DaoFactory.getSurveyDaoImpl().load(surveyId);
}
DaoFactory.getSurveyStatsGraphicDaoImpl().save(g);
node = DaoFactory.getSurveyStructuralNodeDaoImpl().load(nodeId);
question = DaoFactory.getSurveyQuestionDaoImpl().load(questionId);
 
status = (int)(((double)i/(double)graphics.size())*100);
if(status >= 100)
JFreeChart chart = null;
if(question.getType().equals(Globals.SURVEY_QUESTION_TYPE_MATRIX))
chart = buildChart(request, question, node, userSession, true);
else if(question.getType().equals(Globals.SURVEY_QUESTION_TYPE_CHECK) || question.getType().equals(Globals.SURVEY_QUESTION_TYPE_RADIO))
chart = buildChart(request, question, node, userSession, false);
 
if(chart != null)
{
status = 100;
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
node = DaoFactory.getSurveyStructuralNodeDaoImpl().load(nodeId);
question = DaoFactory.getSurveyQuestionDaoImpl().load(questionId);
String identifier;
String filename = "/survey_"+surveyId+"_question_"+question.getId()+"_node_"+node.getId()+".png";
SurveyStatsGraphic graph = DaoFactory.getSurveyStatsGraphicDaoImpl().load(question.getId(),node.getId());
if(graph == null)
{
identifier = storeChartRepository(chart,filename,"descricao",null,userSession);
if(identifier != null)
{
graph = DomainObjectFactory.createSurveyStatsGraphicImpl();
graph.setQuestion(question);
graph.setStructuralNode(node);
graph.setIdentifier(identifier);
DaoFactory.getSurveyStatsGraphicDaoImpl().save(graph);
}
}
else
{
identifier = graph.getIdentifier();
storeChartRepository(chart,filename,"descricao",identifier,userSession);
}
}
survey.setStatusPercentage(status);
DaoFactory.getSurveyDaoImpl().saveOrUpdate(survey);
}
}
 
survey.setStatusPercentage(100);
survey.setStatus(SurveyStatusEnum.STATUS_STOPPED.getStatus());
 
AbstractDao.getCurrentSession().getTransaction().commit();
logger.info("End of thread...");
}
/impl/src/java/pt/estgp/estgweb/services/surveys/LoadConsultStatsSurveysService.java
New file
0,0 → 1,34
package pt.estgp.estgweb.services.surveys;
 
import pt.estgp.estgweb.domain.Survey;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.SurveyView;
import pt.estgp.estgweb.utils.RoleManager;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.ArrayList;
import java.util.List;
 
/**
* @author: Duarte Santos
* @date: 17-08-2011
* @time: 0:53
* @email: a12564 [at] estgp [dot] pt
*/
 
public class LoadConsultStatsSurveysService implements IService
{
public List<SurveyView> run(UserSession userSession)
{
List<Survey> surveys = DaoFactory.getSurveyDaoImpl().loadAllSurveys();
List<SurveyView> surveyViews = new ArrayList<SurveyView>();
for(Survey s : surveys)
{
List<String> statsConsultRolesList = RoleManager.getRolesFromSerial(s.getStatsConsultRoles());
if(s.isOwnedBy(userSession.getUser()) || statsConsultRolesList.contains("all") || userSession.getUser().hasRole(statsConsultRolesList) || userSession.getUser().isSuperuserOrAdmin())
surveyViews.add(new SurveyView(s));
}
return surveyViews;
}
}
/impl/src/java/pt/estgp/estgweb/services/surveys/LoadSurveyNodeGraphsService.java
New file
0,0 → 1,44
package pt.estgp.estgweb.services.surveys;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.SurveyStatsGraphic;
import pt.estgp.estgweb.domain.SurveyStructuralNode;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.SurveyStatsGraphicView;
import pt.estgp.estgweb.domain.views.SurveyStructuralNodeView;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.ArrayList;
import java.util.List;
 
/**
* @author: Duarte Santos
* @date: 13-08-2011
* @time: 1:43
* @email: a12564 [at] estgp [dot] pt
*/
 
public class LoadSurveyNodeGraphsService implements IService
{
private static final Logger logger = Logger.getLogger(LoadSurveyNodeGraphsService.class);
 
public List<SurveyStatsGraphicView> run(long surveyId, long nodeId, UserSession userSession)
{
SurveyStructuralNode node = DaoFactory.getSurveyStructuralNodeDaoImpl().load(nodeId);
 
if(node != null)
{
List<SurveyStatsGraphicView> surveyStatsGraphicViews = new ArrayList<SurveyStatsGraphicView>();
for(SurveyStatsGraphic g : node.getGraphics())
{
SurveyStructuralNodeView nodeView = new SurveyStructuralNodeView(g.getStructuralNode());
SurveyStatsGraphicView surveyStatsGraphicView = new SurveyStatsGraphicView(g);
surveyStatsGraphicView.setStructuralNodeView(nodeView);
surveyStatsGraphicViews.add(surveyStatsGraphicView);
}
return surveyStatsGraphicViews;
}
return null;
}
}
/impl/src/java/pt/estgp/estgweb/services/surveys/LoadSurveyService.java
29,14 → 29,18
public SurveyView run(long surveyId, UserSession userSession)
{
Survey s = DaoFactory.getSurveyDaoImpl().get(surveyId);
logger.info("Loading survey with id: "+s.getId()+" and structuralNode: "+s.getStructuralNode().getId());
long nrOfResponsesAnswered = DaoFactory.getSurveyResponseDaoImpl().countResponses(s.getId(),true);
long nrTotalOfResponses = DaoFactory.getSurveyResponseDaoImpl().countResponses(s.getId(),null);
 
if(s == null) return null;
 
long answered = DaoFactory.getSurveyResponseDaoImpl().countResponses(s.getId(),true);
long total = DaoFactory.getSurveyResponseDaoImpl().countResponses(s.getId(),null);
 
SurveyStructuralNodeView surveyStructuralNodeView = new SurveyStructuralNodeView(s.getStructuralNode());
SurveyView surveyView = new SurveyView(s);
surveyView.setStructuralNodeView(surveyStructuralNodeView);
surveyView.setNumberOfResponses(nrOfResponsesAnswered);
surveyView.setNumberTotalOfResponses(nrTotalOfResponses);
surveyView.setNumberOfResponses(answered);
surveyView.setNumberTotalOfResponses(total);
 
return surveyView;
}
}
/impl/src/java/pt/estgp/estgweb/domain/SurveyImpl.java
1,6 → 1,8
package pt.estgp.estgweb.domain;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.utils.RoleManager;
 
import java.io.Serializable;
import java.util.List;
12,7 → 14,7
* @email: a12564 [at] estgp [dot] pt
*/
 
public class SurveyImpl extends Survey implements IOwned
public class SurveyImpl extends Survey implements IOwned, IConsultSurveyStats, IEdit
{
private static final Logger logger = Logger.getLogger(SurveyImpl.class);
 
54,4 → 56,47
{
return (getType().equals(type));
}
 
public boolean canConsultSurveyStats(GenericUserImpl u)
{
return canConsultStats(u,false);
}
 
public boolean canConsultSurveyStats(GenericUserImpl u, boolean transaction)
{
return canConsultStats(u,transaction);
}
 
public boolean canConsultStats(GenericUserImpl user, boolean transaction)
{
return RoleManager.hasRole(getStatsConsultRolesList(), Globals.ALL_ROLE) || (user != null && (user.hasRole(getStatsConsultRoles()) || user.isSuperuserOrAdmin())) || isOwnedBy(user,transaction);
}
 
public List<String> getStatsConsultRolesList()
{
return RoleManager.getRolesFromSerial(getStatsConsultRoles());
}
 
public boolean canEdit(GenericUserImpl u)
{
return canEditSurvey(u,false);
}
 
public boolean canEdit(GenericUserImpl u,boolean transaction)
{
return canEditSurvey(u,true);
}
 
private boolean canEditSurvey(GenericUserImpl user, boolean transaction)
{
List<SurveyStructuralNode> childNodes = ((SurveyStructuralNodeImpl)getStructuralNode()).getChildsStructuralNodes();
for(SurveyStructuralNode node : childNodes)
{
for(SurveyResponse response : node.getResponses())
{
return response.getAnswers().size() > 0 && user != null && (user.isSuperuserOrAdmin() || isOwnedBy(user,transaction));
}
}
return false;
}
}
/impl/src/java/pt/estgp/estgweb/domain/IConsultSurveyStats.java
New file
0,0 → 1,14
package pt.estgp.estgweb.domain;
 
/**
* @author: Duarte Santos
* @date: 16-08-2011
* @time: 20:19
* @email: a12564 [at] estgp [dot] pt
*/
 
public interface IConsultSurveyStats
{
public boolean canConsultSurveyStats(GenericUserImpl u);
public boolean canConsultSurveyStats(GenericUserImpl u, boolean transaction);
}
/impl/src/java/pt/estgp/estgweb/domain/SurveyResponseImpl.java
12,11 → 12,30
* @email: a12564 [at] estgp [dot] pt
*/
 
public class SurveyResponseImpl extends SurveyResponse
public class SurveyResponseImpl extends SurveyResponse implements IOwned
{
private static final Logger logger = Logger.getLogger(SurveyResponseImpl.class);
 
 
@Override
public boolean isOwnedBy(GenericUser u)
{
return isOwnedBy(u,false);
}
 
@Override
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return u.getId() == getOwner().getId();
}
 
@Override
public GenericUser getOwner()
{
return super.getOwner();
}
 
@Override
public List<String> getOwnerRoles() {
logger.warn("Invoke not implemented method in class:" + getClass().getName());
return null;
31,4 → 50,6
public Serializable getSerializable() {
return getId();
}
 
}
/impl/src/java/pt/estgp/estgweb/domain/views/SurveyStatsGraphicView.java
19,6 → 19,7
 
private long id;
private String identifier;
private SurveyStructuralNodeView structuralNodeView;
 
public SurveyStatsGraphicView()
{}
51,6 → 52,14
this.identifier = identifier;
}
 
public SurveyStructuralNodeView getStructuralNodeView() {
return structuralNodeView;
}
 
public void setStructuralNodeView(SurveyStructuralNodeView structuralNodeView) {
this.structuralNodeView = structuralNodeView;
}
 
@Override
public Class getReferenceClass() {
return SurveyStatsGraphicImpl.class;
/impl/src/java/pt/estgp/estgweb/domain/views/SurveyStructuralNodeView.java
185,4 → 185,21
getChildsStructuralNodesViewRecursive(nodesList, this);
return nodesList;
}
 
private boolean isRelativeParentOfRecursive(SurveyStructuralNodeView node, long nodeId)
{
if(node.getId() == nodeId)
return true;
for(SurveyStructuralNodeView n : node.getNodes())
{
if(isRelativeParentOfRecursive(n,nodeId))
return true;
}
return false;
}
 
public boolean isRelativeParentOf(long nodeId)
{
return isRelativeParentOfRecursive(this,nodeId);
}
}
/impl/src/java/pt/estgp/estgweb/domain/views/SurveyView.java
3,6 → 3,7
import jomm.dao.impl.AbstractDao;
import jomm.utils.StringsUtils;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.services.surveys.SurveyStatusEnum;
import pt.estgp.estgweb.utils.ConfigProperties;
308,6 → 309,11
return (now.getTime() - this.updateDate.getTime() > EXPIRE_TIME);
}
 
public boolean isPedagogic()
{
return (this.getType().equals(Globals.SURVEY_TYPE_PEDAGOGIC));
}
 
public List<String> getOwnerRoles()
{
logger.warn("Invoke not implemented method in class:" + getClass().getName());
/impl/src/java/pt/estgp/estgweb/domain/DomainObjectFactory.java
209,8 → 209,8
return new SruSourceCollectionImpl();
}
 
// Duarte Santos
public static Survey createSurveyImpl()
// Duarte Santos
public static SurveyImpl createSurveyImpl()
{
return new SurveyImpl();
}
/impl/src/java/pt/estgp/estgweb/domain/IEdit.java
New file
0,0 → 1,14
package pt.estgp.estgweb.domain;
 
/**
* @author: Duarte Santos
* @date: 16-08-2011
* @time: 22:50
* @email: a12564 [at] estgp [dot] pt
*/
 
public interface IEdit
{
public boolean canEdit(GenericUserImpl u);
public boolean canEdit(GenericUserImpl u, boolean transaction);
}
/impl/src/java/pt/estgp/estgweb/domain/UserImpl.java
101,17 → 101,7
return false;
}
 
// Duarte Santos
public boolean haveResponse(Survey s, String msg)
{
for(SurveyResponse r : getMySurveyResponses())
{
if(r.getStructuralNode().getSurvey() == s && r.getStructuralNode().getMsg().equals(msg))
return true;
}
return false;
}
 
// Duarte Santos
public boolean haveResponse(Survey s, SurveyStructuralNode node)
{
for(SurveyResponse r : getMySurveyResponses())
121,5 → 111,4
}
return false;
}
 
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/SurveyStructuralNodeDaoImpl.java
29,6 → 29,14
return (SurveyStructuralNodeDaoImpl) myInstance;
}
 
public SurveyStructuralNode loadByRepositoryId(String identifier)
{
return (SurveyStructuralNode) createCriteria()
.createAlias("graphics","g")
.add(eq("g.identifier",identifier))
.uniqueResult();
}
 
public SurveyStructuralNode findBySurvey(long surveyId)
{
return (SurveyStructuralNode) createCriteria().add(eq("survey.id",surveyId)).add(isNull("parentNode")).uniqueResult();
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/SurveyDaoImpl.java
1,7 → 1,9
package pt.estgp.estgweb.domain.dao.impl;
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.Survey;
import pt.estgp.estgweb.domain.SurveyImpl;
16,15 → 18,17
* @email: a12564 [at] estgp [dot] pt
*/
 
public class SurveyDaoImpl extends SurveyDao
public class SurveyDaoImpl extends AbstractDao<SurveyImpl>
{
private static final Logger logger = Logger.getLogger(SurveyDaoImpl.class);
 
protected static SurveyDaoImpl myInstance = null;
 
public static SurveyDaoImpl getInstance()
{
if(myInstance == null)
myInstance = new SurveyDaoImpl();
return (SurveyDaoImpl) myInstance;
return myInstance;
}
 
public List<Survey> loadAllSurveys()
43,4 → 47,9
.add(eq("identifier",identifier))
.uniqueResult();
}
 
@Override
protected Class getReferenceClass() {
return SurveyImpl.class;
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseDaoImpl.java
153,7 → 153,7
.list();
}
 
// Duarte Santos
// Duarte Santos
public List<String> loadAreas()
{
return
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/SurveyQuestionAnswerDaoImpl.java
62,8 → 62,7
.addOrder(Order.asc("qca.id"))
.addOrder(Order.asc("qi.id"))
.addOrder(Order.asc("q.id"))
.addOrder(Order.asc("s.id"))
.addOrder(Order.asc("r.id"));
.addOrder(Order.asc("s.id"));
return c.list();
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/UserDaoImpl.java
5,10 → 5,8
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import static org.hibernate.criterion.Restrictions.*;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.common.SearchTypeEnum;
17,6 → 15,8
import java.util.Date;
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.*;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
216,8 → 216,8
{
return (User) createCriteria().add(or(eq("sigesCode",sigesCode),eq("username","a" + sigesCode))).uniqueResult();
}
 
// Duarte Santos
// Duarte Santos
public List<User> loadRolesUsers(List<String> roles)
{
Criteria criteria = createCriteria();
233,25 → 233,4
criteria.add(co);
return criteria.list();
}
 
public int countUsersWithoutResponse(List<String> roles)
{
Criteria criteria = createCriteria();
if(roles != null)
{
Criterion co = null;
for (String role : roles)
{
Criterion cor = like("roles", "%" + role + "%");
if (co == null)
co = cor;
else
co = or(co, cor);
}
criteria.add(co);
}
criteria.createAlias("mySurveyResponses","sr", CriteriaSpecification.LEFT_JOIN)
.add(isNull("sr.id"));
return criteria.list().size();
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/DaoFactory.java
199,7 → 199,7
return SruSourceCollectionDaoImpl.getInstance();
}
 
// Duarte Santos
// Duarte Santos
public static SurveyDaoImpl getSurveyDaoImpl()
{
return SurveyDaoImpl.getInstance();
/impl/src/java/pt/estgp/estgweb/filters/chains/ResourceAccessControlEnum.java
16,7 → 16,7
superUserDomain("resource.access.superDomain",new ResourceAccessControlSuperDomainFilter()),
courseunitDeliverableDomain("resource.access.courseunitDeliverableDomain",new ResourceAccessControlCourseUnitDeliverableFilter()),
courseunitDomain("resource.access.courseunitDomain",new ResourceAccessControlCourseUnitFilter()),
// Duarte Santos
// Duarte Santos
surveyStatsDomain("resource.access.survey", new ResourceAccessControlSurvey());
 
private String key;
/impl/src/java/pt/estgp/estgweb/filters/filters/CanConsultSurveyStatsClass.java
New file
0,0 → 1,49
package pt.estgp.estgweb.filters.filters;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.IAddContents;
import pt.estgp.estgweb.domain.IConsultSurveyStats;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.filters.chains.LoadControlFilter;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.filters.exceptions.NeedAuthenticationException;
import pt.estgp.estgweb.filters.filters.utils.LoadObjectFromParameters;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
 
/**
* @author: Duarte Santos
* @date: 16-08-2011
* @time: 20:35
* @email: a12564 [at] estgp [dot] pt
*/
 
public class CanConsultSurveyStatsClass extends LoadControlFilter
{
private static final Logger logger = Logger.getLogger(CanConsultSurveyStatsClass.class);
 
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
UserSession userSession = (UserSession) request.getServiceParameters().getParameter(Globals.USER_SESSION_KEY);
 
if(userSession.getUser() == null)
{
logger.info("try access restricted area:" + request.getRequester());
throw new NeedAuthenticationException();
}
 
if(userSession.getUser().isSuperuser())
return;
 
IConsultSurveyStats iConsultSurveyStats = (IConsultSurveyStats) LoadObjectFromParameters.loadObjectFromClassName((String) filterParameters.getParameter(1), filterParameters, request.getServiceParameters());
 
if(!iConsultSurveyStats.canConsultSurveyStats(userSession.getUser(),true))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
}
}
}
/impl/src/java/pt/estgp/estgweb/filters/filters/CanEditSurveyClass.java
New file
0,0 → 1,49
package pt.estgp.estgweb.filters.filters;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.IConsultSurveyStats;
import pt.estgp.estgweb.domain.IEdit;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.filters.chains.LoadControlFilter;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.filters.exceptions.NeedAuthenticationException;
import pt.estgp.estgweb.filters.filters.utils.LoadObjectFromParameters;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
 
/**
* @author: Duarte Santos
* @date: 16-08-2011
* @time: 22:55
* @email: a12564 [at] estgp [dot] pt
*/
 
public class CanEditSurveyClass extends LoadControlFilter
{
private static final Logger logger = Logger.getLogger(CanEditSurveyClass.class);
 
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
UserSession userSession = (UserSession) request.getServiceParameters().getParameter(Globals.USER_SESSION_KEY);
 
if(userSession.getUser() == null)
{
logger.info("try access restricted area:" + request.getRequester());
throw new NeedAuthenticationException();
}
 
if(userSession.getUser().isSuperuser())
return;
 
IEdit iEdit = (IEdit) LoadObjectFromParameters.loadObjectFromClassName((String) filterParameters.getParameter(1), filterParameters, request.getServiceParameters());
 
if(!iEdit.canEdit(userSession.getUser(),true))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
}
}
}
/impl/src/java/pt/estgp/estgweb/filters/filters/ResourceAccessControlSurvey.java
1,6 → 1,7
package pt.estgp.estgweb.filters.filters;
 
import pt.estgp.estgweb.domain.Survey;
import pt.estgp.estgweb.domain.SurveyStructuralNode;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlFilter;
17,7 → 18,16
@Override
public boolean canAccessResource(UserSession userSession, String identifier)
{
Survey s = DaoFactory.getSurveyDaoImpl().loadByRepositoryId(identifier);
Survey s;
s = DaoFactory.getSurveyDaoImpl().loadByRepositoryId(identifier);
if(s == null)
{
SurveyStructuralNode node = DaoFactory.getSurveyStructuralNodeDaoImpl().loadByRepositoryId(identifier);
if(node == null)
return false;
else
s = node.getSurvey();
}
return (userSession.getUser().hasRole(s.getStatsConsultRoles()) || userSession.getUser().isAdmin());
}
}
}
/impl/src/java/pt/estgp/estgweb/web/controllers/surveys/SurveysController.java
7,6 → 7,7
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.views.*;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.controllers.AddRolesController;
import pt.estgp.estgweb.web.form.surveys.SurveysForm;
import pt.estgp.estgweb.web.utils.DatesUtils;
71,29 → 72,27
}
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
Object[] args = {view};
String[] names = {"serializable"};
Object[] args = {view,request};
boolean newSurvey = true;
if(view.getId() > 0)
newSurvey = false;
 
SurveyView surveyView;
surveyView = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"CreateEditSurvey",args,names);
 
surveyForm.setSurveyView(surveyView);
 
if(surveyView != null)
{
if(view.getId() <= 0)
if(newSurvey)
addMessage(request, "survey.message.created.success");
else
addMessage(request, "survey.message.edited.success");
return mapping.findForward("serviceZone");
}
 
return mapping.getInputForward();
return mapping.findForward("serviceZone");
}
catch(AccessDeniedOperationException e)
{
logger.info(e.getMessage());
// addMessage(request,"survey.cant.be.edit.because.have.answers"); // Todo TIRAR ISTO
return mapping.findForward("list");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
168,9 → 167,9
 
SurveyQuestionView qView = surveyView.getQuestions().get(questionIndex);
 
String questionsToDelete = ""+qView.getId()+",";
String itemsToDelete = "";
String candidatesToDelete = "";
String questionsToDelete = surveyView.getDeletedQuestions()+qView.getId()+",";
String itemsToDelete = surveyView.getDeletedItems();
String candidatesToDelete = surveyView.getDeletedCandidates();
 
for(SurveyQuestionItemView iView : qView.getItems())
{
181,9 → 180,9
}
}
 
surveyView.setDeletedQuestions(surveyView.getDeletedQuestions().concat(questionsToDelete));
surveyView.setDeletedItems(surveyView.getDeletedItems().concat(itemsToDelete));
surveyView.setDeletedCandidates(surveyView.getDeletedCandidates().concat(candidatesToDelete));
surveyView.setDeletedQuestions(questionsToDelete);
surveyView.setDeletedItems(itemsToDelete);
surveyView.setDeletedCandidates(candidatesToDelete);
 
surveyView.getQuestions().remove(questionIndex);
}
336,11 → 335,11
{
try {
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
String[] names = {"serializable"};
Object[] args = {new Long(request.getParameter("id"))};
 
SurveyView view;
view = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"LoadSurvey",args,names); // todo ALTERAR O NOME DO SERVICO PARA ADICIONAR FILTRO
view = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"LoadEditSurvey",args,names);
 
if(view != null)
{
387,11 → 386,11
{
try {
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
String[] names = {"serializable"};
Object[] args = {new Long(request.getParameter("id"))};
 
SurveyView surveyView;
surveyView = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"LoadSurvey",args,names); // todo: ALTERAR O NOME DO SERVIÇO PARA DPS POR O FILTRO
surveyView = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"LoadCloneSurvey",args,names);
 
if(surveyView != null)
{
455,8 → 454,8
try {
IServiceManager sm = ServiceManager.getInstance();
 
String[] names = {};
Object[] args = {new Long(request.getParameter("id"))};
String[] names = {"serializable"};
Object[] args = {new Long(request.getParameter("id")),request};
 
sm.execute(RequestUtils.getRequester(request,response),"ConsistSurvey",args,names);
 
486,13 → 485,10
{
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
Object[] args = {request,new Long(request.getParameter("id"))};
String[] names = {"serializable"};
Object[] args = {new Long(request.getParameter("id")),request};
sm.execute(RequestUtils.getRequester(request,response),"GenerateSurveyStats",args,names);
 
Object[] args2 = {new Long(request.getParameter("id"))};
sm.execute(RequestUtils.getRequester(request,response),"GenerateSurveyStatsCsv",args2,names);
 
addMessage(request,"survey.message.operation.started");
 
return mapping.findForward("serviceZone");
517,11 → 513,11
try
{
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
String[] names = {"serializable"};
Object[] args = {new Long(request.getParameter("id"))};
 
SurveyView view;
view = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"LoadSurvey",args,names); // todo: ALTERAR NOME DO SERVIÇO PARA FILTROS
view = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"LoadListStatsSurvey",args,names);
 
if(view != null)
{
555,7 → 551,7
long resp = Long.parseLong(request.getParameter("resp"));
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
String[] names = {"serializable"};
Object[] args = {resp};
 
SurveyResponseView surveyResponseView;
565,7 → 561,7
{
surveysForm.setSurveyResponseView(surveyResponseView);
 
String[] names2 = {};
String[] names2 = {"serializable"};
Object[] args2 = {surveyResponseView.getStructuralNodeView().getSurveyView().getId()};
 
SurveyView surveyView;
665,10 → 661,11
try
{
IServiceManager sm = ServiceManager.getInstance();
Object[] args = {sView, rView.getId()};
String[] names = {"serializable"};
Object[] args = {rView.getId(),sView};
 
SurveyView surveyView;
surveyView = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"InsertSurveyAnswers",args);
surveyView = (SurveyView) sm.execute(RequestUtils.getRequester(request,response),"InsertSurveyAnswers",args,names);
 
if(surveyView != null)
{
/impl/src/hbm/pt/estgp/estgweb/domain/GenericUser.hbm.xml
72,11 → 72,11
<key column="owner"/>
<one-to-many class="pt.estgp.estgweb.domain.ManagedIdentifierCollection"/>
</set>
<set name="mySurveys" lazy="true">
<set name="mySurveys" lazy="true" order-by="id asc">
<key column="owner"/>
<one-to-many class="pt.estgp.estgweb.domain.Survey"/>
</set>
<set name="mySurveyResponses" lazy="true">
<set name="mySurveyResponses" lazy="true" order-by="id asc">
<key column="owner"/>
<one-to-many class="pt.estgp.estgweb.domain.SurveyResponse"/>
</set>
/impl/src/web/admin/surveys/submitSurvey.jsp
9,11 → 9,23
 
<jsp:useBean id="SurveysForm" type="pt.estgp.estgweb.web.form.surveys.SurveysForm" scope="request"/>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
 
<jomm:messages/>
<html:errors/>
 
<html:form action="/user/submitSurveyFromServiceZone">
<%
String fromAction = "";
String from = "";
String user = "";
if (request.getParameter("from") != null)
{
user = "/user";
fromAction = "From" + request.getParameter("from");
from = "?from=" + request.getParameter("from");
}
request.setAttribute("from", from);
request.setAttribute("user", user);
request.setAttribute("fromAction", fromAction);
%>
<html:form action="${user}/submitSurvey${fromAction}${from}">
<html:hidden property="surveyView.id"/>
<html:hidden property="surveyView.deletedQuestions"/>
<html:hidden property="surveyView.deletedItems"/>
/impl/src/web/css/style.css
1162,17 → 1162,6
 
}
 
/*Duarte Santos*/
.form #inputVertical
{
width:150px;
}
 
.form #inputHorizontal
{
width:300px;
}
 
.form input[type="text"], .form input[type="password"], .form input.text, .form input.password
{
width: 800px;
1828,8 → 1817,17
width:100%;
}
 
/*SURVEYS - Duarte Santos*/
/* Duarte Santos */
/* SURVEYS - Duarte Santos*/
.form #inputVertical
{
width:150px;
}
 
.form #inputHorizontal
{
width:300px;
}
 
textarea#surveyTextarea {
width: 400px;
height: 80px;
1863,3 → 1861,19
border-bottom:1px solid #eeeeee;
}
 
div#loadNodeGraphs {
margin:10px;
}
 
div#loadNodeGraphsHeader {
margin-bottom:5px;
}
 
div#listSurveyStats {
margin:10px;
}
 
.nodeSection {
margin:5px;
}
 
/impl/src/web/user/surveys/viewResponseGraphs.jsp
File deleted
\ No newline at end of file
/impl/src/web/user/surveys/listSurveyResponsesRecursive.jsp
File deleted
\ No newline at end of file
/impl/src/web/user/surveys/listSurveyStats.jsp
1,6 → 1,5
<%@ page import="pt.estgp.estgweb.domain.views.SurveyStructuralNodeView" %>
<%@ page import="pt.estgp.estgweb.domain.views.SurveyView" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
17,7 → 16,12
<%
SurveyView surveyView = (SurveyView) request.getAttribute("SurveyView");
SurveyStructuralNodeView nodeRoot = surveyView.getStructuralNodeView();
request.setAttribute("id",surveyView.getId());
request.setAttribute("node",nodeRoot);
%>
 
<jsp:include page="listSurveyResponsesRecursive.jsp"/>
<div id="listSurveyStats">
 
<jsp:include page="listSurveyStatsRecursive.jsp"/>
 
</div>
/impl/src/web/user/surveys/loadSurveyNodeGraphs.jsp
New file
0,0 → 1,39
<%@ page import="pt.estgp.estgweb.domain.views.SurveyStatsGraphicView" %>
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.exceptions.FilterChainFailedException" %>
 
<div id="loadNodeGraphs">
<%
try
{
String[] names = {"serializable"};
Object[] args = {Long.parseLong(request.getParameter("id")),Long.parseLong(request.getParameter("node"))};
IServiceManager sm = ServiceManager.getInstance();
 
List<SurveyStatsGraphicView> surveyStatsGraphicViews = (List<SurveyStatsGraphicView>) sm.execute(RequestUtils.getRequester(request,response),"LoadSurveyNodeGraphs",args,names);
 
if(surveyStatsGraphicViews.size() > 0)
{
%>
<div id="loadNodeGraphsHeader">Gráfico(s) relativo(s) a: <b><%=surveyStatsGraphicViews.get(0).getStructuralNodeView().getMsg()%></b></div>
<%
 
for(SurveyStatsGraphicView gView : surveyStatsGraphicViews)
{
%>
<div><img src="<%=request.getContextPath()%>/repositoryStream/<%=gView.getIdentifier()%>" alt=""/></div><br>
<%
}
}
else
out.println("<div>Não há graficos</div>");
}
catch(FilterChainFailedException e)
{}
catch (Throwable e)
{}
%>
</div>
/impl/src/web/user/surveys/listSurveys.jsp
43,6 → 43,7
<tr>
<th><bean:message key="survey.list.form.title"/></th>
<th><bean:message key="survey.list.form.type"/></th>
<th><bean:message key="survey.list.form.target"/></th>
<th><bean:message key="survey.list.form.year"/></th>
<th><bean:message key="survey.list.form.semester"/></th>
<th><bean:message key="survey.list.form.start.date"/></th>
57,6 → 58,18
<tr>
<td><bean:write name="surveyView" property="title"/></td>
<td><bean:message key="surveys.type.${surveyView.type}"/></td>
<%
if(sv.isPedagogic())
{
%>
<td><bean:message key="surveys.target.pair.${surveyView.targetRoles}"/></td>
<%
} else {
%>
<td><bean:message key="user.role.${surveyView.targetRoles}"/></td>
<%
}
%>
<td><bean:write name="surveyView" property="year"/></td>
<td><bean:message key="courseunit.${surveyView.semester}"/></td>
<td><bean:write name="surveyView" property="formatedStartDate"/></td>
68,12 → 81,16
if(sv.getStatus() != null && (sv.getStatus() == SurveyStatusEnum.STATUS_STOPPED || sv.isExpired()))
{
%>
<logic:equal name="surveyView" property="numberOfResponses" value="0">
<td><html:link action="/user/startEditSurveyFromServiceZone.do?id=${surveyView.id}"><bean:message key="survey.list.form.option.edit"/></html:link></td>
</logic:equal>
<td><html:link action="/user/startCloneSurveyFromServiceZone.do?id=${surveyView.id}"><bean:message key="survey.list.form.option.clone"/></html:link></td>
<td><html:link action="/user/startConsistSurveyFromServiceZone.do?id=${surveyView.id}"><bean:message key="survey.list.form.option.consist"/></html:link></td>
<td><html:link action="/user/startGenerateSurveyStatsFromServiceZone.do?id=${surveyView.id}"><bean:message key="survey.list.form.option.gen.stats"/></html:link></td>
<td><html:link action="/user/startListSurveyStatsFromServiceZone.do?id=${surveyView.id}"><bean:message key="survey.list.form.option.view.stats"/></html:link></td>
<logic:present name="surveyView" property="identifier">
<td><html:link action="/user/startListSurveyStats.do?id=${surveyView.id}"><bean:message key="survey.list.form.option.view.stats"/></html:link></td>
<td><a href="<%=request.getContextPath()%>/repositoryStream/${surveyView.identifier}"><bean:message key="survey.list.form.option.download.csv"/></a></td>
</logic:present>
<%
}
else if(sv.getStatus() != null)
/impl/src/web/user/surveys/listSurveyStatsRecursive.jsp
New file
0,0 → 1,50
<%@ page import="pt.estgp.estgweb.domain.views.SurveyStructuralNodeView" %>
<%
String from = "";
if (request.getParameter("from") != null)
{
from = "&from=" + request.getParameter("from");
}
request.setAttribute("from", from);
long nodeToShow = 0;
if(request.getParameter("node") != null)
{
nodeToShow = Long.parseLong(request.getParameter("node"));
}
 
SurveyStructuralNodeView node = (SurveyStructuralNodeView) request.getAttribute("node");
if(node.getNodes().size() > 0)
{
%>
<a href="#"><img border="0" onclick="this.src=showOrHide('node<%=node.getId()%>','<%=request.getContextPath()%>/imgs/closedPlus.gif','<%=request.getContextPath()%>/imgs/openedMinus.gif')"
src="<%=request.getContextPath()%>/imgs/closedPlus.gif" alt="abrir"/></a> <%=node.getMsg()%><br>
 
<%
if(node.isRelativeParentOf(nodeToShow)) {
%>
<div id="node<%=node.getId()%>" style="display:block" class="nodeSection">
<%
}else{
%>
<div id="node<%=node.getId()%>" style="display:none" class="nodeSection">
<%
}
for(SurveyStructuralNodeView n : node.getNodes())
{
request.setAttribute("node",n);
%>
<jsp:include page="listSurveyStatsRecursive.jsp"/>
<%
}
%>
</div>
<%
}
else
{
%>
<div class="nodeSection"><a href="<%=request.getContextPath()%>/user/startLoadSurveyNodeGraphs.do?id=<%=request.getAttribute("id")%>&node=<%=node.getId()%><%=from%>"><%=node.getMsg()%></a></div>
<%
}
%>
/impl/src/web/user/home/todos.jsp
57,7 → 57,7
String style;
String img;
String styleClass;
// Duarte Santos
// Duarte Santos
if (toDoCat.getDescription().equals(ModuleEnum.TodoAnnouncements.getMessageKey()) || toDoCat.getDescription().equals(ModuleEnum.Surveys.getMessageKey()))
{
styleClass = "WARNING";
/impl/src/web/user/serviceZone/serviceZone.jsp
49,12 → 49,16
request.setAttribute("OwnerBlogPosts", ownerBlogPosts);
}
 
// Duarte Santos
// Duarte Santos
List<SurveyView> ownerSurveys = null;
List<SurveyView> consultStatsSurveys = null;
if(Globals.MODULE_STATUS_SURVEYS)
{
ownerSurveys = (List<SurveyView>) sm.execute(RequestUtils.getRequester(request,response),"LoadOwnedSurveys", args, names);
request.setAttribute("OwnerSurveys",ownerSurveys);
 
consultStatsSurveys = (List<SurveyView>) sm.execute(RequestUtils.getRequester(request,response),"LoadConsultStatsSurveys", args, names);
request.setAttribute("ConsultStatsSurveys",consultStatsSurveys);
}
%>
<jomm:messages/>
101,7 → 105,7
</baco:hasRole>
</baco:isModuleOn>
 
<!-- Duarte Santos -->
<!-- Duarte Santos -->
<baco:isModuleOn module="surveys">
<baco:isAdmin>
<li>
501,57 → 505,42
<baco:isModuleOn module="surveys">
<div class="block">
<div class="head">
<bean:message key="intranet.my.surveys"/>
<a href="#"><img border="0" onclick="this.src=showOrHide('mySurveys','<%=request.getContextPath()%>/imgs/closedbox.gif','<%=request.getContextPath()%>/imgs/openedbox.gif')" src="<%=request.getContextPath()%>/imgs/closedbox.gif" alt="abrir"/></a>
<bean:message key="intranet.my.surveys.stats"/>
<a href="#"><img border="0" onclick="this.src=showOrHide('mySurveysStats','<%=request.getContextPath()%>/imgs/closedbox.gif','<%=request.getContextPath()%>/imgs/openedbox.gif')" src="<%=request.getContextPath()%>/imgs/closedbox.gif" alt="abrir"/></a>
</div>
<div id="mySurveys" style="display:none;">
<div id="mySurveysStats" style="display:none;">
<%
if(ownerSurveys.size() == 0)
{
if(consultStatsSurveys.size() == 0)
{
%>
<div class="zerofound">
<bean:message key="survey.zero.placed"/>
</div>
<div class="zerofound">
<bean:message key="survey.stats.zero.placed"/>
</div>
<%
}
}
else
{
{
%>
<table>
<%
for(SurveyView s : ownerSurveys)
{
%>
<tr>
<td>
<a href="<%=request.getContextPath()%>/user/startListSurveysFromServiceZone.do"><%=s.getTitle()%></a>
</td>
<td>
<%=s.getFormatedSaveDate()%>
</td>
</tr>
<%
}
%>
</table>
<table>
<%
}
for (SurveyView s : consultStatsSurveys)
{
%>
<tr>
<td>
<a href="<%=request.getContextPath()%>/user/startListSurveyStats.do?id=<%=s.getId()%>&from=ServiceZone"><%=s.getTitle()%></a>
</td>
</tr>
<%
}
%>
</table>
<%
}
%>
</div>
</div>
<div class="block">
<div class="head">
<bean:message key="intranet.my.surveys.stats"/>
<a href="#"><img border="0" onclick="this.src=showOrHide('mySurveysStats','<%=request.getContextPath()%>/imgs/closedbox.gif','<%=request.getContextPath()%>/imgs/openedbox.gif')" src="<%=request.getContextPath()%>/imgs/closedbox.gif" alt="abrir"/></a>
</div>
<div id="mySurveysStats" style="display:none;">
<div class="zerofound">
<bean:message key="survey.stats.zero.placed"/>
</div>
</div>
</div>
</baco:isModuleOn>
<!---->
 
</td>
</tr>
/impl/src/web/user/serviceZone/topnavListSurveyStats.jsp
5,7 → 5,8
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startServiceZone.do", "intranet.separator.service.zone.back");
topNav.addNavPlace("/user/startListSurveysFromServiceZone.do", "survey.topnav.list.surveys");
if(request.getParameter("from") == null)
topNav.addNavPlace("/user/startListSurveysFromServiceZone.do", "survey.topnav.list.surveys");
topNav.addNavPlace(null, "survey.topnav.list.stats");
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/serviceZone/topnavLoadSurveyNodeGraphs.jsp
New file
0,0 → 1,16
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startServiceZone.do", "intranet.separator.service.zone.back");
String from = "";
if(request.getParameter("from") == null)
topNav.addNavPlace("/user/startListSurveysFromServiceZone.do", "survey.topnav.list.surveys");
else
from = "&from=" + request.getParameter("from");
topNav.addNavPlace("/user/startListSurveyStats.do?id="+Long.parseLong(request.getParameter("id"))+from+"&node="+Long.parseLong(request.getParameter("node"))+"", "survey.topnav.list.stats");
topNav.addNavPlace(null, "survey.topnav.view.graphs");
%>
<jsp:include page="/layout/topnav.jsp"/>