Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1379 → Rev 1525

/branches/v3/impl/importRoutines.xml
125,4 → 125,13
<target name="loadSummariesAtsi">
<java classname="pt.estgp.estgweb.services.sigesimports.LoadSumariesToPDF" classpath="${build.dir.classes}" classpathref="pathToToolsLib"/>
</target>
 
<target name="updateCourseDepartments">
<java classname="pt.estgp.estgweb.services.courses.UpdateDepartmentsTask" classpath="${build.dir.classes}" classpathref="pathToToolsLib"/>
</target>
 
<target name="generateFreshJsonPlanosEstudosFromXml">
<java classname="pt.estgp.estgweb.services.courses.CoursesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib"/>
</target>
 
</project>
/branches/v3/impl/local-exampleNotInUse.properties
2,6 → 2,8
## Properties file to be used with ant build.xml
##
 
env.JAVA_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
 
##database configuration
database.host=localhost
database.port=3306
/branches/v3/impl/conf/language/MessageResources.properties
10,7 → 10,13
#errors.suffix=</LI>
#errors.footer=</UL>
 
errors.header=<div class="web-messages">
errors.header.for.json=<div class=\\"web-messages\\">
errors.prefix.for.json=<div class=\\"alert alert-warning\\">
errors.suffix.for.json=</div>
errors.footer.for.json=</div>
 
 
errors.header=<script>alert('Existem erros ou avisos, verifique a lista');</script><div class="web-messages">
errors.prefix=<div class="alert alert-warning">
errors.suffix=</div>
errors.footer=</div>
387,8 → 393,8
authenticate.blocked=O seu usuário está bloqueado pelo sistema. Para mais informações contacte o Centro Informático.
username=Nome de Utilizador
password=Palavra Passe
username.pae=Número de Aluno/Docente
password.pae=Palavra Passe ou Número do Cartão de Cidadão (BI)
username.pae=<label class="label label-primary" style="font-size:1.2em">Número de Aluno / Docente (USERNAME NETPA)</label>
password.pae=<label class="label label-info" style="font-size:1.2em">Número</label> do <label class="label label-info" style="font-size:1.2em">Cartão de Cidadão</label> <label class="label label-info" style="font-size:1.2em">ou bilhete de identidade</label>
password.again=Repita a password
submit=Entrar
edit=Editar
422,6 → 428,14
see.more=Ver mais
 
 
questionario.email.subject=Por favo preencha o assunto
questionario.email.from.email=Por favor preencha o email que quer que apareça como remetente
questionario.email.from.person=Por favor preencha a pessoa ou a entidade ou orgão que quer que apareça como remetente
questionario.email.message=Por favor preencha uma mensagem
 
questionario.send.message.top.nav=Envio de Mensagem de Correio Eletronico aos Inquiridos
 
 
#Cursos
 
 
587,6 → 601,8
targetService.pt.estgp.estgweb.services.sigesimports.GenerateCourseUnitProgramsService=Gerar PDF's Fichas Curriculares
targetService.pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService=Selecção de Cursos Questionários
targetService.pt.estgp.estgweb.services.questionarios.pedagogico.AssignAnswersJobService=Atribuição de Respostas a Questionários
targetService.pt.estgp.estgweb.services.questionarios.pedagogico.TeachersAnswersProcessor=Atribuição de Respostas a Questionários de Docentes
targetService.pt.estgp.estgweb.services.questionarios.pedagogico.AnswersAlunosProcessor=Atribuição de Respostas a Questionários de Alunos
targetService.pt.estgp.estgweb.services.courses.CourseUnitsStatisticsJobService=Gerar Estatisticas Unidades Curriculares
 
 
1057,6 → 1073,8
course.studies.plan=Plano de Estudos
course.studies.plan.users=Plano de Estudos
course.studies.plan.not.available=Não disponivel
course.studies.plan.saved=Plano de Estudos Salvo com Sucesso
course.studies.plan.cloned=Plano de Estudos Clonado com Sucesso
course.courseunit.program.objectives.todo={0} Unidades em Falta (Ficha)
course.externalSite=Site Externo
#course.studies.plan=Plano de Estudos
1140,6 → 1158,9
course.list=Listagem de Cursos
course.course.units=Listagem de Unidades Curriculares
 
course.admin.studyplans=Administração de Planos de Estudo
course.studies.plan.added=Plano de estudos adicionado, por favor edite para completar
course.admin.studyplans.edit=Edição de Plano de Estudos
################################################################################
#
# COURSE UNITS MESSAGE RESOURCES
1562,6 → 1583,15
 
task.param.JOB_questionario_courseList_KEY=Lista de Cursos
task.param.JOB_questionario_id_KEY=Questionário ID
 
 
events.manage.events=Administrar classes de eventos
events.my.events=Gerir as minhas classes de eventos
events.my.events.add.formacao=Adicionar Formação
events.my.events.add.generic=Adicionar Evento Genérico
event.name=Nome da Classe
event.managerRole=Papel de gestão
event.permited.types=Tipos Permitidos
################################################################################
#
# Manage Identifiers MESSAGE RESOURCES
1785,6 → 1815,7
#
################################################################################
 
error.questionario.com.respostas.nao.pode.efetuar.op=Operação não permitida, Existem Respostas
error.questionario.p.without.group=Verifique a pergunta {0} nao tem grupo
error.questionario.group.without.p=Verifique o grupo {0} nao tem pergunta
warn.questionario.repeated.in.time=Aviso: Já existe um questionário ({0}) nesse ano e semestre na categoria histórica escolhida
1797,8 → 1828,12
questionarios.courses.start=Atribuição de Cursos Iniciada
questionarios.answers.start=Atribuição de Respostas Iniciada
questionario.tipologias.update.success=Tipologias atualizadas com sucesso
questionario.resposta=Resposta a Questionário
questionario.resposta.com.sucesso=A sua resposta foi submetida com sucesso ao nosso sistema de avaliação. Obrigado
 
questionario.respostas.grupos.1.2.3=Os grupos 1 2 e 3 são obrigatórios por favor responda às questões. Obrigado.
 
 
################################################################################
#
# REMINDERS MESSAGE RESOURCES
1896,10 → 1931,19
questionario.state.PROCESSING_OLAP=Gerando Cubos OLAP
questionario.state.OLAP=Cubos OLAP Terminados
 
questionario.state.START=Afetações Inicio
questionario.state.YEAR_SEMESTRE_ASSIGNED=Ano e Semestre Atribuido
questionario.state.ASSIGNING_COURSES=Atribuindo Cursos
questionario.state.COURSES_ASSIGNED=Cursos Atribuidos
questionario.state.ASSIGNING_ANSWERS=Atribuindo Respostas Candidatas
questionario.state.ANSWERS_ASSIGNED=Respostas Candidatas Atribuidas
questionario.state.FINNISHED_ANSWERS_GENERATING=Terminadas as Afetações
 
questionario.historydrive=Categoria Histórica
questionario.answerprocessor=Processador de Respostas
# SERVICE ZONE
survey.admin=Administração do Questionário {0}
survey.see=Acompanhar Questionário {0}
surveys=Questionários
survey.newEdit.survey=Formulário do Questionário
survey.create.survey=Criar Questionário
/branches/v3/impl/conf/WEB-INF/struts/struts-courses.xml
8,6 → 8,7
 
<form-beans>
<form-bean type="pt.estgp.estgweb.web.form.courses.CourseForm" name="CourseForm"/>
<form-bean type="pt.estgp.estgweb.web.form.courses.CourseStudiesPlansAdminForm" name="CourseStudiesPlansAdminForm"/>
</form-beans>
 
<global-exceptions>
100,7 → 101,23
 
 
 
<!--Studies Plans-->
<action path="/user/adminStudyPlans" forward="page.admin.course.studyplans"/>
<action path="/user/adminStudyPlansEdit" forward="page.admin.course.studyplans.edit"/>
<action path="/user/courseControllerStudiesPlan"
type="pt.estgp.estgweb.web.controllers.courses.CoursesController"
name="CourseStudiesPlansAdminForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.welcome">
<forward name="loadstudyplans" path="page.admin.course.studyplans"/>
<forward name="adminStudyPlans" path="page.admin.course.studyplans"/>
<forward name="editStudyPlan" path="page.admin.course.studyplans.edit"/>
 
</action>
 
 
</action-mappings>
 
</struts-config>
/branches/v3/impl/conf/WEB-INF/struts/tiles-pae-questionarios.xml
13,6 → 13,12
<put name="body" value="/user/questionarios/questionariosList.jsp"/>
</definition>
 
<definition name="page.pae.see.questionarios" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/questionarios/topnavQuestionarioList.jsp"/>
<put name="body" value="/user/questionarios/questionariosSee.jsp"/>
</definition>
 
<definition name="page.pae.questionario.newEdit" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/questionarios/topnavQuestionarioNewEdit.jsp"/>
26,6 → 32,20
</definition>
 
 
<definition name="page.pae.questionario.see" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/questionarios/topnavQuestionarioSee.jsp"/>
<put name="body" value="/user/questionarios/pedagogicoEstudante/questionarioDashBoard.jsp"/>
</definition>
 
 
<definition name="page.pae.questionario.pedagogico.message" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/questionarios/pedagogicoEstudante/topnavQuestionarioPedagogicoSendMessage.jsp"/>
<put name="body" value="/user/questionarios/pedagogicoEstudante/sendMessageQuestionarioRequisitados.jsp"/>
</definition>
 
 
<!-- Modulo do Pedagogico Estudantes -->
<definition name="page.pae.questionario.courses.selection" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
44,4 → 64,11
</definition>
 
 
<definition name="page.pae.questionario.resposta.questionario" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/questionarios/topnavQuestionarioResposta.jsp"/>
<put name="body" value="/user/questionarios/respostaQuestionario.jsp"/>
</definition>
 
 
</tiles-definitions>
/branches/v3/impl/conf/WEB-INF/struts/struts-pae-eventos.xml
New file
0,0 → 1,94
<?xml version="1.0" encoding="UTF-8"?>
 
<!--<!DOCTYPE struts-config PUBLIC-->
<!--"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"-->
<!--"http://struts.apache.org/dtds/struts-config_1_3.dtd">-->
 
<struts-config>
 
 
<form-beans>
<form-bean type="pt.estgp.estgweb.web.form.events.EventClassForm" name="EventClassForm"/>
<form-bean type="pt.estgp.estgweb.web.form.events.MyEventGenericForm" name="MyEventGenericForm"/>
<form-bean type="pt.estgp.estgweb.web.form.events.MyEventFormacoesForm" name="MyEventFormacoesForm"/>
</form-beans>
 
<global-exceptions>
 
</global-exceptions>
 
<global-forwards>
 
</global-forwards>
 
 
<action-mappings>
 
 
 
 
<!-- Start Pages -->
 
<!--PUBLIC-->
<action path="/eventSubscription" forward="page.pae.events.subscribe"/>
 
 
 
 
 
 
<action path="/user/startManageEventsClass" forward="page.pae.events.classes"/>
<action path="/user/startManageMyEvents" forward="page.pae.my.events"/>
 
<action path="/user/submitEventClass"
type="pt.estgp.estgweb.web.controllers.events.EventsController"
name="EventClassForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.pae.events.classes">
<forward name="jsonOk" path="page.pae.events.json.ok"/>
<forward name="jsonErrors" path="page.pae.events.json.errors"/>
</action>
<action path="/user/submitEventClassAjax"
type="pt.estgp.estgweb.web.controllers.events.EventsController"
name="EventClassForm"
scope="request"
parameter="dispatch"
validate="true"
input="page.pae.events.json.errors">
<forward name="jsonOk" path="page.pae.events.json.ok"/>
<forward name="jsonErrors" path="page.pae.events.json.errors"/>
</action>
 
<action path="/user/startSubmitEventFormacoes" forward="page.pae.events.add.formacoes"/>
<action path="/user/submitEventFormacoes"
type="pt.estgp.estgweb.web.controllers.events.EventsController"
name="MyEventFormacoesForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.pae.events.add.formacoes">
<forward name="ok" path="page.pae.my.events"/>
<forward name="errors" path="page.pae.events.add.formacoes"/>
</action>
<action path="/user/startSubmitEventGeneric" forward="page.pae.events.add.generic"/>
<action path="/user/submitEventGeneric"
type="pt.estgp.estgweb.web.controllers.events.EventsController"
name="MyEventFormacoesForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.pae.events.add.generic">
<forward name="ok" path="page.pae.my.events"/>
<forward name="errors" path="page.pae.events.add.generic"/>
</action>
 
 
 
 
 
 
</action-mappings>
 
</struts-config>
/branches/v3/impl/conf/WEB-INF/struts/tiles-courses.xml
113,4 → 113,20
<put name="body" value="/user/contacts/listCourseComissionStudents.jsp"/>
</definition>
 
 
 
<!--Studies Plans-->
 
 
<definition name="page.admin.course.studyplans" extends="base.separators.semleft">
<put name="title" value="Administração de Planos de Estudos"/>
<put name="topnav" value="/user/courses/topnavPlansAdminFromCourseEdit.jsp"/>
<put name="body" value="/user/courses/studiesPlansAdministration.jsp"/>
</definition>
<definition name="page.admin.course.studyplans.edit" extends="base.separators.semleft">
<put name="title" value="Edição de Planos de Estudos"/>
<put name="topnav" value="/user/courses/topnavPlanEditFromCourseEdit.jsp"/>
<put name="body" value="/user/courses/studiesPlansAdministrationEdit.jsp"/>
</definition>
 
</tiles-definitions>
/branches/v3/impl/conf/WEB-INF/struts/tiles-pae-eventos.xml
New file
0,0 → 1,51
<?xml version="1.0" encoding="UTF-8" ?>
 
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://struts.apache.org/dtds/tiles-config_1_1.dtd">
 
 
<tiles-definitions>
 
 
<!--PUBLIC-->
<definition name="page.pae.events.subscribe" extends="base.definition.pae.public">
<put name="body" value="/user/events/registoEventos.jsp"/>
</definition>
 
<!--SERVICES PAGES-->
<definition name="page.pae.events.classes" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/events/topnavManageEventsClasses.jsp"/>
<put name="body" value="/user/events/manageEventsClasses.jsp"/>
</definition>
 
<definition name="page.pae.my.events" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/events/topnavMyEvents.jsp"/>
<put name="body" value="/user/events/myEvents.jsp"/>
</definition>
<definition name="page.pae.events.add.formacoes" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/events/topnavMyEventsAddFormacoes.jsp"/>
<put name="body" value="/user/events/addEventFormacoes.jsp"/>
</definition>
<definition name="page.pae.events.add.generic" extends="page.pae.separators.home">
<put name="separator" value="1" type="string"/>
<put name="topnav" value="/user/events/topnavMyEventsAddGeneric.jsp"/>
<put name="body" value="/user/events/addEventGeneric.jsp"/>
</definition>
 
 
 
<!--Layout para AJAX REQUEST RESPONSE no caso de ter de voltar a apresentar o resultado na modal-->
<definition name="page.pae.events.json.ok" extends="base.empty.json">
<put name="body" value="/user/events/jsonSubmitOk.jsp"/>
</definition>
<definition name="page.pae.events.json.errors" extends="base.empty.json">
<put name="body" value="/user/events/jsonSubmitErrors.jsp"/>
</definition>
 
 
 
</tiles-definitions>
/branches/v3/impl/conf/WEB-INF/struts/struts-pae.xml
27,7 → 27,7
 
<!-- Start Pages -->
 
<action path="/WelcomePedagogicSurvey" forward="page.welcome.pedagogic.survey"/>
<action path="/WelcomePedagogicSurvey" forward="page.welcome.pae"/>
 
 
<!--Authentication-->
37,9 → 37,9
scope="request"
parameter="dispatch"
validate="false"
input="page.welcome.pedagogic.survey">
input="page.welcome.pae">
<forward name="success" path="page.pae.separators.home"/>
<forward name="logout" path="page.welcome.pedagogic.survey"/>
<forward name="logout" path="page.welcome.pae"/>
<forward name="firstTimeAuthenticate" path="page.pae.separators.home"/>
</action>
 
/branches/v3/impl/conf/WEB-INF/struts/tiles-pae.xml
7,14 → 7,22
 
<tiles-definitions>
 
<definition name="base.definition.pedagogicSurvey.public" path="/layout/layoutpedagogicsurveypublic.jsp">
 
<definition name="base.definition.pae.public" path="/layout/layoutpaepublic.jsp">
<put name="title" value="x"/>
<put name="header" value="/layout/header.jsp"/>
<put name="footer" value="/layout/footer.jsp" />
</definition>
 
<definition name="base.definition.pae.auth" path="/layout/layoutpaeauth.jsp">
<put name="title" value="x"/>
<put name="header" value="/layout/header.jsp"/>
<put name="footer" value="/layout/footer.jsp" />
</definition>
 
<definition name="page.welcome.pedagogic.survey" extends="base.definition.pedagogicSurvey.public">
 
 
<definition name="page.welcome.pae" extends="base.definition.pae.auth">
<put name="body" value="/auth/index.jsp" />
</definition>
 
/branches/v3/impl/conf/WEB-INF/struts/struts-default.xml
213,7 → 213,8
/WEB-INF/struts/tiles-configuration.xml,
/WEB-INF/struts/tiles-pagecontent.xml,
/WEB-INF/struts/tiles-pae.xml,
/WEB-INF/struts/tiles-pae-questionarios.xml"/>
/WEB-INF/struts/tiles-pae-questionarios.xml,
/WEB-INF/struts/tiles-pae-eventos.xml"/>
</plug-in>
 
 
/branches/v3/impl/conf/WEB-INF/struts/struts-pae-questionarios.xml
9,6 → 9,8
 
<form-beans>
<form-bean type="pt.estgp.estgweb.web.form.questionarios.QuestionarioForm" name="QuestionarioForm"/>
<form-bean type="pt.estgp.estgweb.web.form.questionarios.QuestionarioRespostaForm" name="QuestionarioRespostaForm"/>
<form-bean type="pt.estgp.estgweb.web.form.questionarios.QuestionarioMessage" name="QuestionarioMessage"/>
</form-beans>
 
<global-exceptions>
32,10 → 34,14
 
<action path="/user/startNewQuestionario" forward="/user/questionariosPaeNoValidation.do?dispatch=startNew"/>
<action path="/user/listQuestionarios" forward="page.pae.questionario.list"/>
<action path="/user/seeQuestionarios" forward="page.pae.see.questionarios"/>
<action path="/user/adminQuestionario" forward="page.pae.questionario.admin"/>
<action path="/user/seeQuestionario" forward="page.pae.questionario.see"/>
<action path="/user/formQuestionariosPae" forward="/user/questionariosPaeNoValidation.do?dispatch=form"/>
<action path="/user/deleteQuestionario" forward="/user/questionariosPaeNoValidation.do?dispatch=deleteQuestionario"/>
<action path="/user/startRespostaQuestionario" forward="page.pae.questionario.resposta.questionario"/>
 
 
<action path="/user/questionariosPaeStartAfectacoes" forward="/user/questionariosPaeNoValidation.do?dispatch=startAfetacoes"/>
 
<action path="/user/questionariosPaeNoValidation"
74,11 → 80,47
<forward name="admin" path="page.pae.questionario.admin"/>
</action>
 
<action path="/user/questionariosPaeResposta"
type="pt.estgp.estgweb.web.controllers.questionarios.QuestionarioYearSemestreController"
name="QuestionarioRespostaForm"
scope="request"
parameter="dispatch"
validate="true"
input="page.pae.questionario.resposta.questionario">
<forward name="success" path="page.pae.separators.home"/>
</action>
 
<action path="/user/startQuestionariosPaeMessagePedagogico" forward="page.pae.questionario.pedagogico.message"/>
<!--<action path="/user/startQuestionariosPaeMessageXPTO" forward="page.pae.questionario.XPTO.message"/>-->
<action path="/user/questionariosPaeMessagePedagogico"
type="pt.estgp.estgweb.web.controllers.questionarios.QuestionarioController"
name="QuestionarioMessage"
scope="request"
parameter="dispatch"
validate="true"
input="page.pae.questionario.pedagogico.message">
<forward name="success" path="page.pae.questionario.see"/>
<forward name="seeAll" path="page.pae.see.questionarios"/>
</action>
 
<!--Outros no futuro
<action path="/user/questionariosPaeMessageXpto"
type="pt.estgp.estgweb.web.controllers.questionarios.QuestionarioController"
name="QuestionarioMessage"
scope="request"
parameter="dispatch"
validate="true"
input="page.pae.questionario.XPTO.message">
<forward name="success" path="page.pae.questionario.see.XPTO"/>
</action>
-->
 
<!--%%%%%%%%%%%%%%%% Pedagogico Alunos Modulo %%%%%%%%%%%%%%%%%%%-->
<action path="/user/questionarioPedagogicoStartChooseCourses" forward="page.pae.questionario.courses.selection"/>
<action path="/user/questionarioPedagogicoStartCheckCourses" forward="page.pae.questionario.courses.check"/>
<action path="/user/questionarioPedagogicoStartAssignAnswers" forward="page.pae.questionario.assign.answers"/>
 
 
<action path="/user/questionariosPaeSelectCourses"
type="pt.estgp.estgweb.web.controllers.questionarios.QuestionarioCourseSelectionController"
name="QuestionarioForm"
/branches/v3/impl/conf/WEB-INF/tlds/jomm.tld
58,6 → 58,10
<tagclass>jomm.web.tags.MessagesTag</tagclass>
</tag>
<tag>
<name>errorsForJson</name>
<tagclass>jomm.web.tags.ErrorsForJsonTag</tagclass>
</tag>
<tag>
<name>notEqualBeans</name>
<tagclass>jomm.web.tags.NotEqualBeansTag</tagclass>
<attribute>
/branches/v3/impl/conf/WEB-INF/tlds/baco.tld
60,6 → 60,20
</attribute>
</tag>
<tag>
<name>hasRolePrefix</name>
<tagclass>pt.estgp.estgweb.web.tags.HasRolePrefixTag</tagclass>
<attribute>
<name>role</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>rolePrefix</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>hasNotRole</name>
<tagclass>pt.estgp.estgweb.web.tags.HasNotRoleTag</tagclass>
<attribute>
/branches/v3/impl/conf/WEB-INF/web.xml
160,6 → 160,12
<!---->
<!--SERVLETS-->
 
 
<servlet>
<servlet-name>WsJson</servlet-name>
<servlet-class>pt.estgp.estgweb.web.json.JsonHandler</servlet-class>
</servlet>
 
<!--SOAP Tutorial-->
<servlet>
<servlet-name>ws</servlet-name>
170,6 → 176,7
</servlet>
<!--SOAP Tutorial-->
 
 
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
199,7 → 206,8
/WEB-INF/struts/struts-configuration.xml,
/WEB-INF/struts/struts-pagecontent.xml,
/WEB-INF/struts/struts-pae.xml,
/WEB-INF/struts/struts-pae-questionarios.xml
/WEB-INF/struts/struts-pae-questionarios.xml,
/WEB-INF/struts/struts-pae-eventos.xml
</param-value>
</init-param>
<init-param>
308,6 → 316,11
</servlet-mapping>
 
<servlet-mapping>
<servlet-name>WsJson</servlet-name>
<url-pattern>/wsjson/api</url-pattern>
</servlet-mapping>
 
<servlet-mapping>
<servlet-name>ws</servlet-name>
<url-pattern>/ws/siges</url-pattern>
</servlet-mapping>
/branches/v3/impl/conf/app.properties
17,9 → 17,11
user.session.timeout.minutes=60
site.url=@site.url@
 
 
 
#USAR APENAS ESTES DOIS EMAILS NAO DA PARA MAIS
admin.email=ci@estgp.pt
admin.email.2=jmachado@estgp.pt
admin.email=@admin.email.1@
admin.email.2=@admin.email.2@
 
email.local.suffix.1=estgp.pt
email.local.suffix.2=esae.pt
28,14 → 30,19
 
 
email.local.suffix=estgp.pt
email.server=smtp.gmail.com
email.server=@email.server@
 
##If RoundRobin is false will use email.from property in from address
email.use.round.robin=@email.use.round.robin@
email.use.security=@email.use.security@
#to use example: bacodev1@estgp.pt bacodev2@estgp.pt
email.user.prefix=bacodev
email.user.sufix=@estgp.pt
email.user.count=10
email.user.prefix=@email.user.prefix@
email.user.sufix=@email.user.sufix@
email.user.count=@email.user.count@
email.user=bacodev@estgp.pt
email.password=@email.password@
email.from=bacodev@estgp.pt
 
email.from=@email.from@
email.templates.dir=@email.templates.dir@
#email.server.security=
#email.server.security=SSL
431,6 → 438,37
siges.degree.16=C
siges.degree.17=O
 
#SEE ALSO IN MESSAGE_RESOURCES.properties for WEB Pages
#Here is used for API JSON Services
# see apijson in web folder Mestrados,PosGraduacoes,CET,CTeSP or none for all
course.B=Bacharelatos
course.L=Licenciaturas
course.M=Mestrados
course.P=PosGraduacoes
course.E=CET
course.C=AccoesdeFormacaodeCurtaDuracao
course.A=FormacoesAvancadas
course.O=OutrasFormacoes
course.T=CTeSP
course.D=DiplomadeEstudosSuperioresEspecializados
course.H=Doutoramento
course.Z=Desconhecido
 
course.inverse.Bacharelatos=B
course.inverse.Licenciaturas=L
course.inverse.Mestrados=M
course.inverse.PosGraduacoes=P
course.inverse.CET=E
course.inverse.AccoesdeFormacaodeCurtaDuracao=C
course.inverse.FormacoesAvancadas=A
course.inverse.OutrasFormacoes=O
course.inverse.CTeSP=T
course.inverse.DiplomadeEstudosSuperioresEspecializados=D
course.inverse.Doutoramento=H
course.inverse.Desconhecido=Z
 
parameterSchoolEnumValues","ESTG,ESECS,ESS,ESAE or none for all
 
siges.degree.unknown=Z
 
# DONT USE ANY MORE NOW IS IN CONFIGURATION DAO national.institution.code=3122
674,6 → 712,8
 
 
 
#if set url in baco separators will allays be enabled
#mode.pae.enabled=false
#system.theme=estg
#system.redirections.policy.index.welcome=welcome
#system.redirections.policy.authentication.action=/authenticate.do
682,20 → 722,23
#authentication.policy.password.msg.key=password
 
#system.theme=ipp
#mode.pae.enabled=true
#system.redirections.policy.index.welcome=welcomePedagogicSurvey
#system.redirections.policy.authentication.action=/authenticatePae.do
#authentication.policy.service=AuthenticatePae
#authentication.policy.username.msg.key=username.pae
#authentication.policy.password.msg.key=password.pae
 
mode.pae.enabled=@mode.pae.enabled@
system.theme=@system.theme@
authentication.policy.service=@authentication.policy.service@
authentication.policy.username.msg.key=@authentication.policy.username.msg.key@
authentication.policy.password.msg.key=@authentication.policy.password.msg.key@
system.redirections.policy.index.welcome=@system.redirections.policy.index.welcome@
system.redirections.policy.authentication.action=@system.redirections.policy.authentication.action@
system.redirections.policy.authentication.logout.action=@system.redirections.policy.authentication.logout.action@
system.mail.standard.certificated.home.page=@system.mail.standard.certificated.home.page@
 
 
###AQUI PODEMOS USAR OU TRA INTRANET OU OUTRO PORTAL PUBLICO
system.intranet.url=@system.intranet.url@
system.public.url=@system.public.url@
720,11 → 763,16
 
institution.code.prefix.1=ESTG
institution.code.prefix.2=ESAE
institution.code.prefix.3=ESE
institution.code.prefix.3=ESECS
institution.code.prefix.4=ESS
institution.code.prefix.5=ESE PG
institution.code.prefix.6=IPP
 
institution.code.prefix.inverse.ESTG=1
institution.code.prefix.inverse.ESAE=2
institution.code.prefix.inverse.ESECS=3
institution.code.prefix.inverse.ESS=4
 
#InstitutionCodes to choose institution in processement
#in ohter cenarios we can change the values
#for the institutionCode used in SIGES
833,5 → 881,54
siges.summaries.prelancado.code=4
 
 
####TIPOS DE ALUNO EXTRAIDOS A 8 de Junho de 2016
#1 Normal
#2 Bolseiro
#3 Militar
#4 Trabalhador Estudante
#5 Internacional
#6 Dirigente Associativo
#7 Atleta de Alta Competição
#8 Kids / Teens (Clic)
#9 Palop
#10 Individual (Clic)
#11 Deficientes
#12 Mães e Pais Estudantes
#13 Regular 75h (Clic)
#14 Conversação (Clic)
#15 Grupo (Clic)
#16 Bombeiro
#23 Normal (a)
#24 Intensivo 30h (Clic)
#25 Intensivo 20h (Clic)
#17 Tempo Parcial
#18 Intensivo 12h (Clic)
#22 Reprovado
#19 Regular 45h (Clic)
#26 Intensivo 10h (Clic)
#27 Regular 60h (Clic)
#28 Intensivo 22h (Clic)
#20 Erasmus
#21 Externo
#29 Vasco da Gama
#30 Protocolo/Parceria com Instituições estrangeira
 
siges.tipo.aluno.normal=1
siges.tipo.aluno.bolseiro=2
siges.tipo.aluno.militar=3
siges.tipo.aluno.trabalhador.estudante=4
siges.tipo.aluno.dirigente.associativo=6
siges.tipo.aluno.deficiente=11
siges.tipo.bombeiro=16
siges.tipo.vascodagama=29
siges.tipo.erasmus=20
 
 
##GOOGLE RECAPTCHA
google.recaptcha.secret.key=@google.recaptcha.secret.key@
google.recaptcha.address=https://www.google.com/recaptcha/api/siteverify
google.recaptcha.secret.param.name=secret
google.recaptcha.response.param.name=response
 
 
 
/branches/v3/impl/conf/template/email/courseUnitAnnouncement_pt.txt
1,4 → 1,5
# 0 : Course Unit Name

# 0 : Course Unit Name
# 1 : Title
# 2 : Text
# 3 : Teacher
/branches/v3/impl/conf/template/email/message_ipp_pt_certificated.txt
New file
0,0 → 1,28

<html>
<head>
<title>{1}</title>
</head>
<body>
 
<p>Olá <b>@USER_NOME@</b></p>
 
<p><i>Mensagem de:</i> {0}</p>
<p><i>Assunto:</i> <b><u>{1}</u></b></p>
 
{2}
 
<hr/>
<p>Informação Automática PAE:</p>
<p><i>@USER_NOME@</i>, pode responder a esta solicitação acedendo directamente à sua conta no sistema PAE através do seguinte endereço: </a>
<a href="@URL@">@URL@</a>
<p>Se pretender contactar a entidade que lhe enviou a mensagem, use por favor o seguinte endereço de email: {3}</p>
 
 
 
---------------------------------------------
 
<p>Instituto Politécnico de Portalegre - Sistema PAE</p>
<p><a href="http://pae.ipportalegre.pt">http://pae.ipportalegre.pt</a></p>
</body>
</html>
/branches/v3/impl/conf/template/email/message_ipp_pt.txt
New file
0,0 → 1,24

<html>
<head>
<title>{1}</title>
</head>
<body>
 
 
<p><i>Mensagem de:</i> {0}</p>
<p><i>Assunto:</i> <b><u>{1}</u></b></p>
 
{2}
 
<hr/>
<p>Se pretender responder, use o email: {3}</p>
 
 
 
---------------------------------------------
 
<p>Instituto Politécnico de Portalegre - Sistema PAE</p>
<p><a href="http://pae.ipportalegre.pt">http://pae.ipportalegre.pt</a></p>
</body>
</html>
/branches/v3/impl/conf/berserk/sd.xml
83,7 → 83,34
<chain name="Logger"/>
</filterChains>
</service>
 
<service>
<name>AddRole2User</name>
<implementationClass>pt.estgp.estgweb.services.users.CreateUserService</implementationClass>
<description>Load user of some class</description>
<isTransactional>true</isTransactional>
<defaultMethod>addRole2User</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="EventClassManager"/><!--Suporta Admins ou Eventos-->
</filterChains>
</service>
<service>
<name>RemoveRole2User</name>
<implementationClass>pt.estgp.estgweb.services.users.CreateUserService</implementationClass>
<description>Load user of some class</description>
<isTransactional>true</isTransactional>
<defaultMethod>removeRole2User</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
<chain name="EventClassManager"/><!--Suporta Admins ou Eventos-->
</filterChains>
</service>
 
<service>
<name>LoadUsers</name>
<implementationClass>pt.estgp.estgweb.services.users.LoadUsersService</implementationClass>
<description>Load user of some class</description>
122,7 → 149,18
<chain name="Logger"/>
</filterChains>
</service>
<service>
<name>LoadTeachersWithUnitsInLast3Years</name>
<implementationClass>pt.estgp.estgweb.services.users.LoadUsersService</implementationClass>
<description>Load user of some class</description>
<isTransactional>true</isTransactional>
<defaultMethod>LoadTeachersWithUnitsInLast3Years</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
 
 
<service>
<name>LoadTeachers</name>
<implementationClass>pt.estgp.estgweb.services.users.LoadUsersService</implementationClass>
873,7 → 911,6
<service>
<name>LoadCourseUnit</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitService</implementationClass>
<description>Load course unit</description>
<isTransactional>true</isTransactional>
<filterChains>
884,7 → 921,6
<service>
<name>LoadCourseUnitCleared</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitService</implementationClass>
<description>Load course unit</description>
<isTransactional>true</isTransactional>
<defaultMethod>runCleared</defaultMethod>
1470,7 → 1506,91
<chain name="Logger"/>
</filterChains>
</service>
 
<service>
<name>LoadCourseByCodeAndStudiesPlans</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadCourseByCodeAndStudiesPlans</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
<service>
<name>LoadCourseAndStudiesPlans</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadCourseAndStudiesPlans</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
<service>
<name>AddNewStudiesPlan</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>addNewStudiesPlan</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>SavePlanoEstudos</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>savePlanoEstudosEditado</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>CloneStudiesPlanVersionFrom</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>cloneVersionFrom</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="ServicesStudiesPlans"/>
</filterChains>
</service>
<service>
<name>AddTeacherCourseCommission</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>addTeacherCommission</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="ServicesCoursesManagement"/>
</filterChains>
</service>
<service>
<name>RemoveTeacherCourseCommission</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>removeTeacherCommission</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="ServicesCoursesManagement"/>
</filterChains>
</service>
 
 
 
<service>
<name>SubmitCourse</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Create or Update a new course</description>
1479,7 → 1599,7
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
<chain name="ServicesCoursesManagement"/>
</filterChains>
</service>
<service>
1544,6 → 1664,48
</service>
 
 
<service>
<name>SincronizeCoursesStudiesPlans</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>sincronizeCoursesStudiesPlans</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>GetCourseStudiesPlanXml</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>getCourseStudiesPlanXml</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
<service>
<name>GetCourseDetailForJsonApi</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>getCourseDetailForJsonApi</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
<service>
<name>GetActiveCoursesForJsonApi</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>getActiveCoursesForJsonApi</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
 
 
 
2555,7 → 2717,49
</service>
 
 
<!--Events new-->
 
 
<service>
<name>EventsSaveClass</name>
<implementationClass>pt.estgp.estgweb.services.events.EventsService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>save</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="EventClassManager"/>
</filterChains>
</service>
 
 
<service>
<name>EventsSaveEvent</name>
<implementationClass>pt.estgp.estgweb.services.events.EventsService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>saveEvent</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="EventManager"/>
</filterChains>
</service>
<service>
<name>RemoveEventClass</name>
<implementationClass>pt.estgp.estgweb.services.events.EventsService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>delete</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="EventClassManager"/>
</filterChains>
</service>
<!--Questionarios New-->
<service>
<name>loadQuestionarioAdmin</name>
2642,6 → 2846,61
 
 
<service>
<name>QuestionarioPutAssignedAnswers</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>putAssignedAnswers</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="QuestionarioClearancesPre"/>
</filterChains>
</service>
<service>
<name>QuestionarioRevertAssignationDetails</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>revertAssignationDetails</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="QuestionarioClearancesPre"/>
</filterChains>
</service>
<service>
<name>QuestionarioStartProcessement</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>startProcessement</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="QuestionarioClearancesPre"/>
</filterChains>
</service>
<service>
<name>QuestionarioStopProcessement</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>stopProcessement</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="QuestionarioClearancesPre"/>
</filterChains>
</service>
 
 
 
<service>
<name>RunJobSelectCourses</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<description></description>
2715,9 → 2974,77
<chain name="QuestionarioClearancesPre"/>
</filterChains>
</service>
<service>
<name>QuestionarioSalvarResposta</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>salvarResposta</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
</filterChains>
</service>
 
 
<service>
<name>QuestionarioSendMessage</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>sendMessage</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="AdminsOrQuestionarioAdminsOrPedagogico"/>
</filterChains>
</service>
 
<service>
<name>QuestionarioSendMessageCursoAfeto</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>sendMessageCursoAfeto</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="AdminsOrQuestionarioAdminsOrPedagogico"/>
</filterChains>
</service>
 
<service>
<name>QuestionarioSendMessageUnidadeAfeta</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>sendMessageUnidadeAfeta</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="AdminsOrQuestionarioAdminsOrPedagogico"/>
</filterChains>
</service>
 
<service>
<name>QuestionarioSendMessageAllProcessing</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>sendMessageAllProcessing</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
<chain name="AdminsOrQuestionarioAdminsOrPedagogico"/>
</filterChains>
</service>
 
<service>
<name>SalvarFicheiro</name>
<implementationClass>pt.estgp.estgweb.services.paginasseccoes.SalvarFicheiro</implementationClass>
<description>Salvar Ficheiro</description>
2730,4 → 3057,7
 
 
 
 
 
 
</serviceDefinitions>
/branches/v3/impl/conf/berserk/fd.xml
12,6 → 12,12
<isTransactional>false</isTransactional>
</filter>
<filter>
<name>EventManager</name>
<implementationClass>pt.estgp.estgweb.filters.filters.EventManager</implementationClass>
<description>Checks if the requester contains certain roles</description>
<isTransactional>false</isTransactional>
</filter>
<filter>
<name>ExistObject</name>
<implementationClass>pt.estgp.estgweb.filters.filters.ExistLoadClass</implementationClass>
<description>Checks if the object exist if not throws NotFoundException</description>
/branches/v3/impl/conf/berserk/fcd.xml
28,6 → 28,21
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
<filterChain>
<name>ServicesStudiesPlans</name>
<expression>AuthenticatedUsers &amp;&amp; (RoleUsers("all") || RoleUsers("admin") || RoleUsers("servicesStudiesPlans"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
<filterChain>
<name>ServicesCoursesManagement</name>
<expression>AuthenticatedUsers &amp;&amp; (RoleUsers("all") || RoleUsers("admin") || RoleUsers("servicesCoursesManagement"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
 
<filterChain>
<name>Supers</name>
<expression>AuthenticatedUsers &amp;&amp; RoleUsers("super")</expression>
<description>Super Users Control Chain</description>
510,6 → 525,35
</filterChain>
 
 
<filterChain>
<name>AdminsOrQuestionarioAdminsOrPedagogico</name>
<expression>AuthenticatedUsers &amp;&amp; (RoleUsers("admin") || RoleUsers("questionarios.admin") || RoleUsers("pedagogicCouncil.president"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
 
 
<filterChain>
<name>EventClassManager</name>
<expression>AuthenticatedUsers &amp;&amp; (RoleUsers("admin") || RoleUsers("all") || RoleUsers("event_class_manager"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
 
<filterChain>
<name>EventManager</name>
<expression>AuthenticatedUsers &amp;&amp; (EventManager("eventClassId","event") || RoleUsers("all") || RoleUsers("admin"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
 
 
 
 
 
 
 
</filterChainsDefinitions>
/branches/v3/impl/src/java/jomm/web/utils/TopNav.java
26,20 → 26,24
return navPlaces;
}
 
public void addNavPlace(String url, String messageKey)
public NavPlace addNavPlace(String url, String messageKey)
{
NavPlace n = new NavPlace(url,messageKey,navPlaces.size());
navPlaces.add(n);
return n;
}
public void addNavPlace(String url, String messageKey,String arg)
 
public NavPlace addNavPlace(String url, String messageKey,String arg)
{
NavPlace n = new NavPlace(url,messageKey,navPlaces.size(),arg);
navPlaces.add(n);
return n;
}
public void addNavPlace(String url, String messageKey,String arg0,String arg1)
public NavPlace addNavPlace(String url, String messageKey,String arg0,String arg1)
{
NavPlace n = new NavPlace(url,messageKey,navPlaces.size(),arg0,arg1);
navPlaces.add(n);
return n;
}
 
public String getTitle() {
/branches/v3/impl/src/java/jomm/web/utils/NavPlace.java
21,6 → 21,7
private String key;
private String arg0 = null;
private String arg1 = null;
private String icon = null;
 
public NavPlace(String url,String key)
{
149,7 → 150,7
}
catch(Exception e)
{
logger.error(e,e);
logger.info("Message " + msg + " does not exist in MessageProperties will use key");
}
if(msg == null)
return key;
166,6 → 167,11
return (String) request.getAttribute(AuxiliaryQueryString);
}
 
public String getIcon() {
return icon;
}
 
 
public void setIcon(String icon) {
this.icon = icon;
}
}
/branches/v3/impl/src/java/jomm/web/tags/ErrorsForJsonTag.java
New file
0,0 → 1,291
/*
* $Id: ErrorsTag.java 471754 2006-11-06 14:55:09Z husted $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package jomm.web.tags;
 
import org.apache.struts.Globals;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.taglib.TagUtils;
import org.apache.struts.taglib.html.Constants;
import org.apache.struts.util.MessageResources;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.util.Iterator;
 
/**
* Custom tag that renders error messages if an appropriate request attribute
* has been created. The tag looks for a request attribute with a reserved
* key, and assumes that it is either a String, a String array, containing
* message keys to be looked up in the module's MessageResources, or an object
* of type <code>org.apache.struts.action.ActionErrors</code>. <p> The
* following optional message keys will be utilized if corresponding messages
* exist for them in the application resources:
*
* <ul>
*
* <li><b>errors.header</b> - If present, the corresponding message will be
* rendered prior to the individual list of error messages.</li>
*
* <li><b>errors.footer</b> - If present, the corresponding message will be
* rendered following the individual list of error messages.</li>
*
* <li><b>errors.prefix</b> - If present, the corresponding message will be
* rendered before each individual error message.</li>
*
* <li><b>errors.suffix</b> - If present, the corresponding message will be
* rendered after each individual error message.</li>
*
* </ul>
*
* @version $Rev: 471754 $ $Date: 2005-08-21 19:08:45 -0400 (Sun, 21 Aug 2005)
* $
*/
public class ErrorsForJsonTag extends TagSupport {
/**
* The message resources for this package.
*/
protected static MessageResources messages =
MessageResources.getMessageResources(Constants.Package
+ ".LocalStrings");
 
// ----------------------------------------------------------- Properties
 
/**
* The servlet context attribute key for our resources.
*/
protected String bundle = null;
 
/**
* The session attribute key for our locale.
*/
protected String locale = Globals.LOCALE_KEY;
 
/**
* The request attribute key for our error messages (if any).
*/
protected String name = Globals.ERROR_KEY;
 
/**
* The name of the property for which error messages should be returned,
* or <code>null</code> to return all errors.
*/
protected String property = null;
 
/**
* The message resource key for errors header.
*/
protected String header = null;
 
/**
* The message resource key for errors footer.
*/
protected String footer = null;
 
/**
* The message resource key for errors prefix.
*/
protected String prefix = null;
 
/**
* The message resource key for errors suffix.
*/
protected String suffix = null;
 
public String getBundle() {
return (this.bundle);
}
 
public void setBundle(String bundle) {
this.bundle = bundle;
}
 
public String getLocale() {
return (this.locale);
}
 
public void setLocale(String locale) {
this.locale = locale;
}
 
public String getName() {
return (this.name);
}
 
public void setName(String name) {
this.name = name;
}
 
public String getProperty() {
return (this.property);
}
 
public void setProperty(String property) {
this.property = property;
}
 
public String getHeader() {
return (header == null) ? "errors.header.for.json" : header;
}
 
public void setHeader(String header) {
this.header = header;
}
 
public String getFooter() {
return (footer == null) ? "errors.footer.for.json" : footer;
}
 
public void setFooter(String footer) {
this.footer = footer;
}
 
public String getPrefix() {
return (prefix == null) ? "errors.prefix.for.json" : prefix;
}
 
public void setPrefix(String prefix) {
this.prefix = prefix;
}
 
public String getSuffix() {
return (suffix == null) ? "errors.suffix.for.json" : suffix;
}
 
public void setSuffix(String suffix) {
this.suffix = suffix;
}
 
// ------------------------------------------------------- Public Methods
 
/**
* Render the specified error messages if there are any.
*
* @throws javax.servlet.jsp.JspException if a JSP exception has occurred
*/
public int doStartTag() throws JspException {
// Were any error messages specified?
ActionMessages messages;
 
try {
messages =
TagUtils.getInstance().getActionMessages(pageContext, Globals.ERROR_KEY);
} catch (JspException e) {
TagUtils.getInstance().saveException(pageContext, e);
throw e;
}
 
if ((messages == null) || messages.isEmpty()) {
return (EVAL_BODY_INCLUDE);
}
 
boolean headerPresent =
TagUtils.getInstance().present(pageContext, bundle, locale,
getHeader());
 
boolean footerPresent =
TagUtils.getInstance().present(pageContext, bundle, locale,
getFooter());
 
boolean prefixPresent =
TagUtils.getInstance().present(pageContext, bundle, locale,
getPrefix());
 
boolean suffixPresent =
TagUtils.getInstance().present(pageContext, bundle, locale,
getSuffix());
 
// Render the error messages appropriately
StringBuffer results = new StringBuffer();
boolean headerDone = false;
String message;
Iterator reports =
(property == null) ? messages.get() : messages.get(property);
 
while (reports.hasNext()) {
ActionMessage report = (ActionMessage) reports.next();
 
if (!headerDone) {
if (headerPresent) {
message =
TagUtils.getInstance().message(pageContext, bundle,
locale, getHeader());
 
results.append(message);
}
 
headerDone = true;
}
 
if (prefixPresent) {
message =
TagUtils.getInstance().message(pageContext, bundle, locale,
getPrefix());
results.append(message);
}
 
if (report.isResource()) {
message =
TagUtils.getInstance().message(pageContext, bundle, locale,
report.getKey(), report.getValues());
} else {
message = report.getKey();
}
 
if (message != null) {
results.append(message);
}
 
if (suffixPresent) {
message =
TagUtils.getInstance().message(pageContext, bundle, locale,
getSuffix());
results.append(message);
}
}
 
if (headerDone && footerPresent) {
message =
TagUtils.getInstance().message(pageContext, bundle, locale,
getFooter());
results.append(message);
}
 
TagUtils.getInstance().write(pageContext, results.toString());
 
return (EVAL_BODY_INCLUDE);
}
 
/**
* Release any acquired resources.
*/
public void release() {
super.release();
bundle = Globals.MESSAGES_KEY;
locale = Globals.LOCALE_KEY;
name = Globals.ERROR_KEY;
property = null;
header = null;
footer = null;
prefix = null;
suffix = null;
}
}
Property changes:
Added: svn:executable
+ *
/branches/v3/impl/src/java/pt/estgp/estgweb/utils/EmailPersonalizedCertificated.java
New file
0,0 → 1,131
package pt.estgp.estgweb.utils;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
 
import javax.mail.Message;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
 
/**
* @author Jorge Machado
* @date 20/Mar/2008
* @time 18:32:21
* @see pt.estgp.estgweb.utils
*/
public class EmailPersonalizedCertificated extends Email implements Serializable
{
 
 
private static final Logger logger = Logger.getLogger(EmailPersonalizedCertificated.class);
 
 
/**FIELDS FOR PERSONALIZED EMAILS**/
private String urlPatternWithoutCetificate = null;
private List<Long> userIds = null;
 
 
 
public EmailPersonalizedCertificated cloneEmailForJob(){
EmailPersonalizedCertificated email = new EmailPersonalizedCertificated(subject, from, emailTemplateName, arguments);
email = (EmailPersonalizedCertificated) super.cloneEmailForJob(email);
email.urlPatternWithoutCetificate = this.urlPatternWithoutCetificate;
if(this.userIds != null)
{
email.userIds = new ArrayList<Long>();
email.userIds.addAll(this.userIds);
}
return email;
}
 
public EmailPersonalizedCertificated()
{
}
 
public EmailPersonalizedCertificated(String urlPatternWithoutCetificate,
List<Long> userIds)
{
this.urlPatternWithoutCetificate = urlPatternWithoutCetificate;
this.userIds = filterUserIds(userIds);
}
 
 
public EmailPersonalizedCertificated(String subject, String from, String mailTemplateName, List<String> arguments)
{
super( subject, new ArrayList<String>(), from, mailTemplateName, arguments, Message.RecipientType.TO);
}
 
public EmailPersonalizedCertificated(String subject, String from, String mailTemplateName, List<String> arguments,
String urlPatternWithoutCetificate,
List<Long> userIds)
{
super( subject, new ArrayList<String>(), from, mailTemplateName, arguments, Message.RecipientType.TO);
this.urlPatternWithoutCetificate = urlPatternWithoutCetificate;
this.userIds = filterUserIds(userIds);
}
 
 
 
public boolean isSystemAssumingTestEmail() {
return systemAssumingTestEmail;
}
 
public String getFromName() {
return fromName;
}
 
public void setFromName(String fromName) {
this.fromName = fromName;
}
 
public String getSubject()
{
return subject;
}
 
public List<String> getRecipients()
{
return recipients;
}
 
public void setRecipients(List<String> recipients)
{
systemAssumingTestEmail = true;//ja nao estao sobre
this.recipients = filterRecipients(recipients);
 
}
 
public String getUrlPatternWithoutCetificate() {
return urlPatternWithoutCetificate;
}
 
public void setUrlPatternWithoutCetificate(String urlPatternWithoutCetificate) {
this.urlPatternWithoutCetificate = urlPatternWithoutCetificate;
}
 
public List<Long> getUserIds() {
return userIds;
}
 
public void setUserIds(List<Long> userIds) {
this.userIds = filterUserIds(userIds);
}
 
/**
* Garante que os users Idss não são usados em testes
 
* @return
*/
 
 
protected List<Long> filterUserIds(List<Long> userIds)
{
if(Globals.TEST_ENVIRONEMENT)
{
userIds = new ArrayList<Long>();
userIds.add(new Long(1));//Adding super user
}
return userIds;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/utils/Email.java
1,20 → 1,16
package pt.estgp.estgweb.utils;
 
import jomm.utils.TemplateUtils;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.services.email.SendEmailService;
 
import javax.mail.*;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import java.util.Properties;
import javax.mail.Message;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.text.MessageFormat;
import java.io.Serializable;
 
import pt.estgp.estgweb.Globals;
 
/**
* @author Jorge Machado
* @date 20/Mar/2008
25,16 → 21,42
{
 
 
private boolean isHtml = false;
private String subject;
private List<String> recipients;
private Message.RecipientType type = Message.RecipientType.TO;
private String from;
private String emailTemplateName;
private List<String> arguments;
private String fromName = null;
private static final Logger logger = Logger.getLogger(Email.class);
 
protected boolean systemAssumingTestEmail = false;
protected boolean isHtml = false;
protected String subject;
protected List<String> recipients;
protected List<String> recipientsCC = null;
protected Message.RecipientType type = Message.RecipientType.TO;
protected String from;
protected String emailTemplateName;
protected List<String> arguments;
protected String fromName = null;
 
 
 
 
 
public Email cloneEmailForJob(){
Email email = new Email(subject,recipients,from,emailTemplateName,arguments,type);
return cloneEmailForJob(email);
}
public Email cloneEmailForJob(Email email){
 
email.systemAssumingTestEmail = this.systemAssumingTestEmail;
email.isHtml = this.isHtml;
email.subject = this.subject;
email.recipients = this.recipients;
email.type = this.type;
email.from = this.from;
email.emailTemplateName = this.emailTemplateName;
email.arguments = this.arguments;
email.fromName = this.fromName;
return email;
}
 
 
public boolean isHtml() {
return isHtml;
}
43,10 → 65,13
isHtml = html;
}
 
public Email() {
}
 
public Email(String subject, List<String> recipients, String from, String mailTemplateName, List<String> arguments)
{
this.subject = subject;
this.recipients = recipients;
this.recipients = filterRecipients(recipients, arguments, mailTemplateName);;
this.from = from;
this.emailTemplateName = mailTemplateName;
this.arguments = arguments;
56,12 → 81,48
{
this.type = type;
this.subject = subject;
this.recipients = recipients;
this.recipients = filterRecipients(recipients, arguments, mailTemplateName);
this.from = from;
this.emailTemplateName = mailTemplateName;
this.arguments = arguments;
 
 
}
 
protected List<String> filterRecipients(List<String> recipients,List<String> arguments,String template)
{
if(Globals.TEST_ENVIRONEMENT)
{
systemAssumingTestEmail = true;
logger.info("SISTEMA EM MODO DE TESTES, iria enviar email para os seguintes recipientes:");
System.out.println(recipients);
logger.info("Mensagem que ia ser enviada:");
logger.info(SendEmailService.getEmailTextMessage(template, arguments));
logger.info("SISTEMA EM MODO DE TESTES: Vai enviar apenas para o mail de testes");
recipients = new ArrayList<String>();
recipients.add(Globals.ADMIN_EMAIL);
}
return recipients;
}
protected List<String> filterRecipients(List<String> recipients)
{
if(Globals.TEST_ENVIRONEMENT)
{
systemAssumingTestEmail = true;
logger.info("SISTEMA EM MODO DE TESTES, iria enviar email para os seguintes recipientes:");
System.out.println(recipients);
logger.info("Nao se sabe a Mensagem que ia ser enviada");
logger.info("SISTEMA EM MODO DE TESTES: Vai enviar apenas para o mail de testes");
recipients = new ArrayList<String>();
recipients.add(Globals.ADMIN_EMAIL);
}
return recipients;
}
 
public boolean isSystemAssumingTestEmail() {
return systemAssumingTestEmail;
}
 
public String getFromName() {
return fromName;
}
82,7 → 143,9
 
public void setRecipients(List<String> recipients)
{
this.recipients = recipients;
systemAssumingTestEmail = true;//ja nao estao sobre
this.recipients = filterRecipients(recipients);
 
}
 
public String getFrom()
132,6 → 195,17
 
public void setType(Message.RecipientType type)
{
this.type = type;
//TODO WHEN BACK TO BCC REMOVE this
this.type = Message.RecipientType.TO;
//this.type = type;
}
 
 
public List<String> getRecipientsCC() {
return recipientsCC;
}
 
public void setRecipientsCC(List<String> recipientsCC) {
this.recipientsCC = recipientsCC;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/Globals.java
125,7 → 125,7
public static final String TMP_DIR = ConfigProperties.getProperty("tmp.dir");
public static final String DATA_DIR = ConfigProperties.getProperty("data.dir");
public static final String JOB_SERVICES_LOG_DIR = ConfigProperties.getProperty("data.dir") + java.io.File.separator + "jobslogs";
;
 
public static final String EMAIL_SERVER_HOST = ConfigProperties.getProperty("email.server");
public static final String EMAIL_SERVER_SECURITY = ConfigProperties.getProperty("email.server.security");
public static final int EMAIL_SERVER_SECURITY_TLS = ConfigProperties.getIntProperty("email.server.security.tls");
138,7 → 138,17
public static final String EMAIL_SERVER_USERNAME = ConfigProperties.getProperty("email.user");
public static final String EMAIL_SERVER_PASSWORD = ConfigProperties.getProperty("email.password");
 
 
 
 
 
public static final String ADMIN_EMAIL = ConfigProperties.getProperty("admin.email");
public static final String ADMIN_EMAIL_2 = ConfigProperties.getProperty("admin.email.2");
 
public static final boolean SYSTEM_EMAIL_USE_SECURITY = ConfigProperties.getBooleanProperty("email.use.security");
public static final boolean SYSTEM_EMAIL_USE_ROUND_ROBIN = ConfigProperties.getBooleanProperty("email.use.round.robin");
public static final String SYSTEM_EMAIL_BOX = ConfigProperties.getProperty("email.from");
 
public static final String ANNOUNCEMENT_TYPE_NEWS = "news";
public static final String ANNOUNCEMENT_TYPE_TOP_FLASH_NEWS = "top.flash.news";
public static final String ANNOUNCEMENT_TYPE_BOTTOM_FLASH_NEWS = "bottom.flash.news";
181,7 → 191,19
public static final String SIGES_WEBSERVICE_SECRET = ConfigProperties.getProperty("ws.siges.secret");
 
 
public static final String SIGES_TIPO_ALUNO_NORMAL = ConfigProperties.getProperty("siges.tipo.aluno.normal");
public static final String SIGES_TIPO_ALUNO_BOLSEIRO = ConfigProperties.getProperty("siges.tipo.aluno.bolseiro");
public static final String SIGES_TIPO_ALUNO_MILITAR = ConfigProperties.getProperty("siges.tipo.aluno.militar");
public static final String SIGES_TIPO_ALUNO_TRABALHADOR_ESTUDANTE = ConfigProperties.getProperty("siges.tipo.aluno.trabalhador.estudante");
public static final String SIGES_TIPO_ALUNO_DIRIGENTE_ASSOCIATIVO = ConfigProperties.getProperty("siges.tipo.aluno.dirigente.associativo");
public static final String SIGES_TIPO_ALUNO_DEFICIENTE = ConfigProperties.getProperty("siges.tipo.aluno.deficiente");
public static final String SIGES_TIPO_ALUNO_BOMBEIRO = ConfigProperties.getProperty("siges.tipo.aluno.bombeiro");
public static final String SIGES_TIPO_ALUNO_VASCODAGAMA = ConfigProperties.getProperty("siges.tipo.vascodagama");
public static final String SIGES_TIPO_ALUNO_ERASMUS = ConfigProperties.getProperty("siges.tipo.erasmus");
 
 
 
 
public static final long URL_STAT_CHART_EXPIRE_INTERVAL = ConfigProperties.getIntProperty("url.stat.image.expire.interval.time.minutes");
public static final String URL_STAT_CHART_TMP_DIR = ConfigProperties.getProperty("url.stat.tmp.dir");
public static final int URL_STAT_CACHE_SIZE = ConfigProperties.getIntProperty("url.stat.click.cache.size");
345,9 → 367,13
public static final String EMAIL_COURSEUNIT_ANNOUNCEMENT_TEMPLATE_PT = "courseUnitAnnouncement_pt.txt";
public static final String EMAIL_COURSEUNIT_ANNOUNCEMENT_TEMPLATE_EN = "courseUnitAnnouncement_en.txt";
 
public static final String EMAIL_MESSAGE_TEMPLATE_EN = "message_en.txt";
public static final String EMAIL_MESSAGE_TEMPLATE_PT = "message_pt.txt";
public static final String EMAIL_MESSAGE_TEMPLATE_EN = "message_en.txt";
 
 
public static final String EMAIL_MESSAGE_IPP_TEMPLATE_PT_CERTIFICATED = "message_ipp_pt_certificated.txt";
public static final String EMAIL_MESSAGE_IPP_TEMPLATE_PT = "message_ipp_pt.txt";
 
public static final String EMAIL_COURSEUNIT_WORK_SUBJECT_PT = ConfigProperties.getProperty("email.courseunit.work.subject.pt");
public static final String EMAIL_COURSEUNIT_WORK_SUBJECT_EN = ConfigProperties.getProperty("email.courseunit.work.subject.en");
public static final String EMAIL_COURSEUNIT_WORK_RELATIVE_URL = ConfigProperties.getProperty("email.courseunit.work.relative.url");
419,18 → 445,26
 
public static final String ROLE_INVITED = "invited";
 
public static final String SYSTEM_EMAIL_CERTIFICATED_HOME_PAGE = ConfigProperties.getProperty("system.mail.standard.certificated.home.page");
public static final String SYSTEM_THEME = ConfigProperties.getProperty("system.theme");
public static final String AUTHENTICATE_SERVICE = ConfigProperties.getProperty("authentication.policy.service");
public static final String AUTHENTICATE_SERVICE_USERNAME_KEY = ConfigProperties.getProperty("authentication.policy.username.msg.key");
public static final String AUTHENTICATE_SERVICE_PASSWORD_KEY = ConfigProperties.getProperty("authentication.policy.password.msg.key");
public static final String SYSTEM_REDIRECTIONS_POLICY_INDEX_WELCOME = ConfigProperties.getProperty("system.redirections.policy.index.welcome");
public static final String SYSTEM_REDIRECTIONS_POLICY_AUTHENTICATION_ACTION = ConfigProperties.getProperty("system.redirections.policy.authentication.action");
public static final String SYSTEM_REDIRECTIONS_POLICY_AUTHENTICATION_LOGOUT_ACTION = ConfigProperties.getProperty("system.redirections.policy.authentication.logout.action");
 
 
 
public static final boolean MODO_PAE_ENABLED = ConfigProperties.getBooleanProperty("mode.pae.enabled");
public static final String QUESTIONARIOS_GERAIS = "questionarios.gerais";
public static final String QUESTIONARIOS_ADMIN = "questionarios.admin";
public static final String QUESTIONARIOS_ASSIGNEMENTS_ADMIN = "questionarios.atribuicoes.admin";
public static final String QUESTIONARIOS_ASSIGNEMENTS_CHECK_STUDENTS_ADMIN = "questionarios.atribuicoes.admin";
public static final String QUESTIONARIOS_ASSIGNEMENTS_CHECK_TEACHERS_ADMIN = "questionarios.atribuicoes.check_teachers";
public static final String QUESTIONARIOS_TIPOLOGIAS_ADMIN = "questionarios.tipologias.admin";
 
public static final String ROLE_PRESIDENTE_CONCELHO_PEDAGOGICO = "pedagogicCouncil.president";
 
public static final boolean USE_XSL_CACHE =ConfigProperties.getBooleanProperty("xsl.use.cache");
 
 
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/CoursesService.java
1,31 → 1,39
package pt.estgp.estgweb.services.courses;
 
import com.owlike.genson.Genson;
import com.owlike.genson.TransformationException;
import com.owlike.genson.reflect.VisibilityFilter;
import jomm.dao.impl.AbstractDao;
import jomm.utils.FilesUtils;
import jomm.utils.StreamsUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.Course;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.RepositoryFileImpl;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseView;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.courses.xsd.Curso;
import pt.estgp.estgweb.services.courses.xsd.SemestreImpl;
import pt.estgp.estgweb.services.courses.xsd.UnidadeType;
import pt.estgp.estgweb.services.data.IRepositoryFile;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.expceptions.AlreadyExistsException;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Dom4jUtil;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
import java.net.URL;
import java.util.*;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
48,48 → 56,61
RepositoryService repositoryService = new RepositoryService();
 
 
public CourseView loadCourse(long id, boolean initUnits) throws ServiceException
/**
* Servico e subservico para termos acesso as variaveis de controlo
* @param id
* @param initUnits
* @return
* @throws ServiceException
*/
public CourseView loadCourse(long id, boolean initUnits)
throws ServiceException
{
return loadCourse(id,initUnits,false);
}
public CourseView loadCourseAndStudiesPlans(long id, boolean initUnits)
throws ServiceException
{
return loadCourse(id,initUnits,true);
}
 
 
private CourseView loadCourse(long id, boolean initUnits,boolean loadStudiesPlans) throws ServiceException
{
Course c = DaoFactory.getCourseDaoImpl().get(id);
 
if(c != null)
{
CourseView cV = new CourseView(c,initUnits);
if(c.getStudiesPlan() != null)
{
RepositoryFileImpl repositoryFile = repositoryService.loadView(c.getStudiesPlan());
cV.setStudiesPlan(repositoryFile);
}
 
return cV;
return getCourseView(initUnits, c,loadStudiesPlans);
}
return null;
}
 
public List<String> loadImportYears(UserSession userSession) throws ServiceException
/**
* Servico e subservico para termos acesso as variaveis de controlo
* @param code
* @param initUnits
* @return
* @throws ServiceException
*/
 
public CourseView loadCourseByCode(String code, boolean initUnits) throws ServiceException
{
List<String> importYears = DaoFactory.getCourseDaoImpl().loadImportYears();
List<String> imStrings = new ArrayList<String>();
for(String importYear: importYears)
{
imStrings.add(importYear);
}
return imStrings;
return loadCourseByCode(code,initUnits,false);
}
public CourseView loadCourseByCodeAndStudiesPlans(String code, boolean initUnits) throws ServiceException
{
return loadCourseByCode(code,initUnits,true);
}
 
public CourseView loadCourseByCode(String code, boolean initUnits) throws ServiceException
 
private CourseView loadCourseByCode(String code, boolean initUnits,boolean loadStudiesPlans) throws ServiceException
{
try{
Course c = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
if(c != null)
{
CourseView cV = new CourseView(c,initUnits);
if(c.getStudiesPlan() != null)
{
RepositoryFileImpl repositoryFile = repositoryService.loadView(c.getStudiesPlan());
cV.setStudiesPlan(repositoryFile);
}
return cV;
return getCourseView(initUnits, c, loadStudiesPlans);
}
}
catch(Throwable e)
100,13 → 121,53
return null;
}
 
/**
* Carrega efetivamente o curso nos servicos load e load by code
* @param initUnits
* @param c
* @return
*/
 
private CourseView getCourseView(boolean initUnits, Course c,boolean loadStudiesPlans) {
CourseView cV = new CourseView(c,initUnits);
/*
* todo Parte antig antigo XML do plano de estudos para remover futuramente*/
if(c.getStudiesPlan() != null)
{
RepositoryFileImpl repositoryFile = repositoryService.loadView(c.getStudiesPlan());
cV.setStudiesPlan(repositoryFile);
}
if(loadStudiesPlans && c.getStudiesPlans() != null && c.getStudiesPlans().size() > 0)
{
for(CourseStudiesPlan sp : c.getStudiesPlans())
{
sp.getVersion();
cV.getCourseStudiesPlans().add(sp);
}
}
 
return cV;
}
 
public List<String> loadImportYears(UserSession userSession) throws ServiceException
{
List<String> importYears = DaoFactory.getCourseDaoImpl().loadImportYears();
List<String> imStrings = new ArrayList<String>();
for(String importYear: importYears)
{
imStrings.add(importYear);
}
return imStrings;
}
 
 
 
public CourseView submitCourse(CourseView courseView,
InputStream stream,
String name,
int size,
String contentType,
UserSession userSession) throws ServiceException
{
UserSession userSession) throws ServiceException, JAXBException, TransformationException, IOException {
Course c;
if(courseView.getId() > 0)
{
123,6 → 184,23
 
String htmlTrasformationResult = null;
 
//Stream que pode vir do upload da UIde Admin de Cursos
htmlTrasformationResult = uploadStudiesPlan(stream, name, size, contentType, userSession, c,false,null);
courseView.persistViewInObject(c);
CourseView cv = loadCourse(c.getId(),false);
cv.setHtmlResult(htmlTrasformationResult);
 
/**
* New## generating course json
*/
generateCourseJson(c);
 
return cv;
}
 
private String uploadStudiesPlan(InputStream stream, String name, int size, String contentType, UserSession userSession, Course c,boolean forceUrlFichas, String systemUrl) throws JAXBException, TransformationException {
String htmlTrasformationResult = null;
//APENAS NO CASO DO AMDIN FAZER UPLOAD DE UM XML
if(stream != null && size > 0)
{
String extension = FilesUtils.getExtension(name);
135,39 → 213,290
{
repositoryService.updateRepositoryFile(c.getStudiesPlan(), stream, contentType, extension, size, name, "course.studies.plan " + c.getName(), ResourceAccessControlEnum.publicDomain);
}
IRepositoryFile repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
stream = repositoryFile.getInput();
try
htmlTrasformationResult = generateHtmlCache(userSession, c);
//####New#### Generating XML with JaxB
//ISTO SO É CHAMADO NO CASO DE SE FAZER UPLOAD DE UM NOVO PLANO PELO MECANISMO ANTIGO
generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, c, forceUrlFichas, systemUrl);
}
return htmlTrasformationResult;
}
 
 
 
private void generateCourseJson(Course cAux) throws IOException, TransformationException {
CourseImpl c = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(cAux);
 
if(c.getValidationRole() != null && c.getValidationRole().trim().length() > 0)
{
List<Teacher> courseComissionProxys = DaoFactory.getUserDaoImpl().loadRoleTeachers(c.getValidationRole());
List<Teacher> courseComission = new ArrayList<Teacher>();
for(Teacher t: courseComissionProxys)
{
Document dom = Dom4jUtil.parse(stream);
Map<String,Object> parameters = new HashMap<String,Object>();
parameters.put("COURSE_SIGES_CODE",c.getCode());
String html = Dom4jUtil.styleDocument(dom, Globals.TEMPLATE_COURSE_XSL_PATH,parameters);
c.setCacheWebDocument(html);
courseComission.add(DaoFactory.getTeacherDaoImpl().narrow(t));
}
catch (Exception e)
c.setCourseComission(courseComission);
}
//Getting Coordinator from proxy
Teacher t = c.getCoordinator();
if(t != null)
t.getName();
else
{
logger.warn("Course does not have coordinator");
}
 
String jsonCourse = getGensonCourse().serialize(c);
c.setJson(jsonCourse);
}
 
private String generateHtmlCache(UserSession userSession, Course c) {
String htmlTrasformationResult = null;
InputStream stream;IRepositoryFile repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
stream = repositoryFile.getInput();
try
{
Document dom = Dom4jUtil.parse(stream);
Map<String,Object> parameters = new HashMap<String,Object>();
parameters.put("COURSE_SIGES_CODE",c.getCode());
String html = Dom4jUtil.styleDocument(dom, Globals.TEMPLATE_COURSE_XSL_PATH,parameters);
c.setCacheWebDocument(html);
}
catch (Exception e)
{
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
e.printStackTrace(printWriter);
htmlTrasformationResult = "<div class=\"error\"><pre>" + e.toString() + "\n" + printWriter.toString() + "</pre></div>";
printWriter.close();
}
try
{
stream.close();
}
catch (IOException e)
{
logger.error(e,e);
}
return htmlTrasformationResult;
}
 
/**
* ##NEW METHOD###
* Gera o XML normalizado para o JAXB a partir do XML importado do XML do plano XML quese usou no upload
* para garantir que está bem formado
* @param userSession
* @param c
* @return
* @throws JAXBException if XML is not weel formed
*/
private void generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(UserSession userSession, Course c, boolean forceFichaCurricularUrlSet, String systemUrlForUnitPrograms) throws JAXBException, TransformationException
{
CourseStudiesPlan courseStudiesPlan;
if(c.getStudiesPlan() == null || c.getStudiesPlan().trim().length() == 0)
{
//ESTE É O STREAM DO PLANO DE UPLOAD
logger.warn("Course does not have studies plan XML file stream to use in update");
return;
}
 
if(c.getStudiesPlans() == null || c.getStudiesPlans().size() == 0)
{
logger.info("Generating first study plan");
courseStudiesPlan = DomainObjectFactory.createCourseStudiesPlanImpl();
courseStudiesPlan.setVersion(1);
courseStudiesPlan.setVersionDescription("Auto gerado durante a importação de um XML com o plano de estudos a " + new Date().toString());
courseStudiesPlan.setCourse(c);
if(c.getStudiesPlans() == null)
c.setStudiesPlans(new HashSet<CourseStudiesPlan>());
c.getStudiesPlans().add(courseStudiesPlan);
DaoFactory.getCourseStudiesPlanDaoImpl().save(courseStudiesPlan);
}
else
{
courseStudiesPlan = c.getStudiesPlans().iterator().next();
logger.info("Updating Study Plan version " + courseStudiesPlan.getVersion());
}
 
InputStream stream;
IRepositoryFile repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
long lastVersion = repositoryService.loadView(c.getStudiesPlan()).getLastVersion().getId();
//stream = repositoryFile.getInput();
//TODO TIRAR
//JUST FOR DEBUG
/* try {
System.out.println(StreamsUtils.readString(stream));
stream.close();
} catch (IOException e) {
e.printStackTrace();
}*/
repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
stream = repositoryFile.getInput();
 
try {
JAXBContext jc = JAXBContext.newInstance(Curso.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
//Just in case lets update SigesCode
Curso curso = (Curso) unmarshaller.unmarshal(stream);
curso.setSiges(c.getCode());
curso.setNome(c.getName());
curso.setDep(c.getArea());
 
//##NOVO PARA GERAR LINK SE NAO EXISTIR
generateAutoUrlFichasCurriculares(curso,systemUrlForUnitPrograms,forceFichaCurricularUrlSet);
 
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
marshaller.marshal(curso, sw);
//SETTING XML in COURSE STUDIES PLAN
courseStudiesPlan.setXml(sw.toString());
 
 
String json = getGensonPlanoEstudos().serialize(curso);
//SETTING JSON in COURSE STUDIES PLAN
courseStudiesPlan.setJson(json);
 
} catch (JAXBException e) {
logger.error(e,e);
System.out.print("check XML for possible errors for repositoryStream:" + c.getStudiesPlan() + " file version: " + lastVersion);
throw e;
} catch (TransformationException e) {
logger.error(e, e);
throw e;
} catch (IOException e) {
e.printStackTrace();
}
try
{
stream.close();
}
catch (IOException e)
{
logger.error(e,e);
}
}
 
 
/**
* Apenas é chamado quando se tenta injectar um programa a partir de um upload que foi feito
* pelo user ou pela sincronização remota
* @param curso
* @param systemUrl
* @param force
*/
private void generateAutoUrlFichasCurriculares(Curso curso,String systemUrl,boolean force)
{
for(Curso.Semestre s :curso.getSemestre())
{
for(Curso.Semestre.Perfil p :s.getPerfil())
{
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
e.printStackTrace(printWriter);
htmlTrasformationResult = "<div class=\"error\"><pre>" + e.toString() + "\n" + printWriter.toString() + "</pre></div>";
printWriter.close();
for(UnidadeType unidadeType : p.getUnidade())
{
generateAutoUrlUnidade(unidadeType,systemUrl,curso,s,force);
}
}
try
for(UnidadeType unidadeType : s.getUnidade())
{
stream.close();
generateAutoUrlUnidade(unidadeType,systemUrl,curso,s,force);
}
catch (IOException e)
{
logger.error(e,e);
}
}
courseView.persistViewInObject(c);
CourseView cv = loadCourse(c.getId(),false);
cv.setHtmlResult(htmlTrasformationResult);
return cv;
}
 
private void generateAutoUrlUnidade(UnidadeType unidadeType,String systemUrl,Curso curso,Curso.Semestre semestre,boolean force)
{
if(force || unidadeType.getUrlFichaCurricular() == null || unidadeType.getUrlFichaCurricular().trim().length()==0)
{
logger.info("GENERATING FICHA CURRICULAR URL For " + unidadeType.getNome());
String url = systemUrl != null ? systemUrl : "";
if(!url.endsWith("/"))
url = url + "/";
 
//Nao fornece o ano pois o servico irá assumir o ultimo
unidadeType.setUrlFichaCurricular(url + "startLoadCourseUnitProgramSiges.do?unitCode=" + unidadeType.getSiges() + "&courseCode=" + curso.getSiges() + "&semestre=" + semestre.getId());
unidadeType.setUrlUnidadeCurricular(url + "startLoadCourseUnitSiges.do?unitCode=" + unidadeType.getSiges() + "&courseCode=" + curso.getSiges() + "&semestre=" + semestre.getId());
}
}
 
 
private static Genson getGensonPlanoEstudos(){
Genson genson = new Genson.Builder()
.exclude("class")
.exclude("siges", Curso.class)
.exclude("nome",Curso.class)
.exclude("dep")
.exclude("removed",UnidadeType.class)
.exclude("perfilId",Curso.Semestre.Perfil.class)
.exclude("semestreId",Curso.Semestre.class)
.create();
return genson;
}
 
 
 
private static Genson getGensonCourse(){
Genson genson = new Genson.Builder()
.exclude(Object.class)
.setUseFields(false)
.setUseGettersAndSetters(true)
.setMethodFilter(VisibilityFilter.PACKAGE_PUBLIC)
.exclude("admin")
.exclude("autoBlock")
.exclude("autoBlockMode")
.exclude("manualBlock")
.exclude("newUser")
.exclude("student")
.exclude("superuser")
.exclude("superuserOrAdmin")
.exclude("teacher")
.exclude("unitCheck")
.exclude("id")
 
/* .exclude(Course.class)
.exclude(CourseImpl.class)
.exclude(GenericUser.class)
.exclude(User.class)
.exclude(UserImpl.class)
.exclude(Teacher.class)
.exclude(TeacherImpl.class)
.exclude(SigesUser.class)
.exclude(SigesUserImpl.class)
.exclude(GenericUser.class)
.exclude(GenericUserImpl.class)
*/
.exclude("id", Course.class)
.exclude("status", Course.class)
.exclude("showStudiesPlan", Course.class)
.include("degreeForJsonApi", CourseImpl.class)
.include("schoolForJsonApi", CourseImpl.class)
.include("statusForJsonApi", CourseImpl.class)
 
.include("name", Course.class)
.include("nameEn", Course.class)
.include("nameEs", Course.class)
.include("nameFr", Course.class)
.include("department", Course.class)
.exclude("active", CourseDepartment.class)
.include("sigla", CourseDepartment.class)
.include("name", CourseDepartment.class)
.include("nameEn", CourseDepartment.class)
.include("nameEs", CourseDepartment.class)
.include("nameFr", CourseDepartment.class)
.include("code", Course.class)
.include("validationRole", Course.class)
 
.include("courseComission", CourseImpl.class)
 
.include("name", GenericUser.class)
.include("email", GenericUser.class)
.include("sigesCode", SigesUser.class)
.include("coordinator", Course.class)
.create();
 
return genson;
}
 
 
 
public List<CourseView> loadCourses() throws ServiceException
{
List<Course> courses = DaoFactory.getCourseDaoImpl().findAllOrderByName();
237,4 → 566,573
 
 
 
/** JSON API **/
/**
* @SERVICE@
*
* @param school
* @param type
* @return
* @throws JSONException
*/
public JSONObject getActiveCoursesForJsonApi(String school,String type) throws JSONException {
String institutionalCode = null;
String degree = null;
if(school != null && school.length() > 0)
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse." + school);
 
if(type != null && type.length() > 0)
degree = ConfigProperties.getProperty("course.inverse." + type);
 
List<Course> courses = DaoFactory.getCourseDaoImpl().findAllShowStudiesPlanCoursesOrderByNameEvenWithoutCourseUnit(institutionalCode, degree);
JSONObject coursesResponse = new JSONObject();
 
JSONArray coursesArray = new JSONArray();
for(Course cAux: courses)
{
CourseImpl c = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(cAux);
JSONObject courseJson = new JSONObject();
courseJson.put("name",c.getName());
courseJson.put("code",c.getCode());
courseJson.put("schoolForJsonApi",c.getSchoolForJsonApi());
courseJson.put("degreeForJsonApi",c.getDegreeForJsonApi());
courseJson.put("statusForJsonApi",c.getStatusForJsonApi());
courseJson.put("getDetailedInfoUrl","/wsjson/api?service=getCourse&code=" + c.getCode());
coursesArray.put(courseJson);
 
}
coursesResponse.put("status","ok");
coursesResponse.put("courses",coursesArray);
 
return coursesResponse;
}
 
/**
*
* * Serviço invocado para obter o JSON de um curso
* O JSON tem dois campos o courseInfo e o plano de estudos colocados separadamente
*
* Atenção o plano de estudos usado é o ultimo considerando o seu ID
* Nota: O plano de Estudos é uma classe persistente que tem apenas versão e descrição
* deverá ter como campo o XML e o JSON já gerados do plano de estudos que comporta
*
* @param code
* @return
* @throws JSONException
* @throws IOException
* @throws TransformationException
* @throws JAXBException
*/
public JSONObject getCourseDetailForJsonApi(String code) throws JSONException, IOException, TransformationException, JAXBException {
 
Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
 
 
JSONObject coursesResponse = new JSONObject();
 
if(course.getJson() == null)
{
logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will generate");
new CoursesService().generateCourseJson(course);
}
 
if(course.getJson() != null)
{
JSONObject courseObj = new JSONObject(course.getJson());
coursesResponse.put("courseInfo",courseObj);
//Este caso apenas se dá se o plano nunca tiver sido editado ou sincronizado
//Nesse caso o sistema irá tentar obtê-lo da stream do repositorio
if(course.getStudiesPlans() == null || course.getStudiesPlans().size() == 0)
{
logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will try generate from studies plan OLD Stream");
UserSession userSession = DomainObjectFactory.createUserSessionImpl();
userSession.setUser(DaoFactory.getUserDaoImpl().load(new Long(1)));
new CoursesService().generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, course, false, null);
}
 
if(course.getStudiesPlans() != null )
{
CourseStudiesPlan studiesPlan = course.getStudiesPlans().iterator().next();
JSONObject studiesPlanObj;
if(studiesPlan.getJson() != null)
{
studiesPlanObj = new JSONObject(studiesPlan.getJson());
studiesPlanObj.put("version",studiesPlan.getVersion());
coursesResponse.put("courseStudiesPlan",studiesPlanObj);
}
else
{
studiesPlanObj = new JSONObject();
studiesPlanObj.put("fault","Zero contents for this version");
studiesPlanObj.put("version",studiesPlan.getVersion());
coursesResponse.put("courseStudiesPlan",studiesPlanObj);
}
coursesResponse.put("courseStudiesPlan",studiesPlanObj);
 
}
else
{
coursesResponse.put("status","JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE");
}
}
else
{
coursesResponse.put("status","JSON NOT EXIST FOR COURSE, PLEASE OPEN AND SAVE COURSE IN ADMINISTRATION");
}
return coursesResponse;
}
 
/**
* @SERVICE@
*
* @param code
* @return
* @throws JSONException
*/
public String getCourseStudiesPlanXml(String code,String renew) throws JSONException {
 
Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
 
if(renew != null || course.getStudiesPlans() == null || course.getStudiesPlans().size() == 0)
{
logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will generate");
UserSession userSession = DomainObjectFactory.createUserSessionImpl();
userSession.setUser(DaoFactory.getUserDaoImpl().load(new Long(1)));
try {
generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, course, false, null);
} catch (JAXBException e) {
logger.error(e,e);
return "<error>" + e.toString() + ". see log for details</error>";
} catch (TransformationException e) {
logger.error(e, e);
return "<error>" + e.toString() + ". see log for details</error>";
}
}
if(course.getStudiesPlans() != null && course.getStudiesPlans().size() > 0)
{
return course.getStudiesPlans().iterator().next().getXml();
}
return "<error>Does not exixt</error>";
 
}
 
 
/**
* @SERVICE@
*
* @param systemUrl
* @param setActive
* @return
* @throws IOException
* @throws JSONException
* @throws TransformationException
* @throws JAXBException
*/
 
public String sincronizeCoursesStudiesPlans(String systemUrl,boolean setActive,UserSession sess) throws IOException, JSONException, TransformationException, JAXBException {
 
StringBuilder log = new StringBuilder();
URL url = new URL(systemUrl + "/wsjson/api?service=listCourses");
InputStream is = url.openStream();
String str = StreamsUtils.readString(is);
JSONObject obj = new JSONObject(str);
JSONArray courses = obj.getJSONArray("courses");
for(int i = 0; i < courses.length();i++)
{
String code = "";
try{
JSONObject course = courses.getJSONObject(i);
code = course.getString("code");
Course c = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
if(c == null)
{
String msg = "SKIPING - Course " + code + " " + course.getString("name") + " does not exist in this system";
log.append("<info>" + msg+"</info>");
logger.info(msg);
}
else
{
String msg = "UPDATING - Course " + code + " " + course.getString("name") + " exist in this system";
log.append("<info>" + msg+"</info>");
logger.info(msg);
 
//#############UPDATING Course Comission Members
updateCourseComissionMembersAndCourseInfo(systemUrl, code, c);
 
//#############UPDATING STUDIES PLAN
updateStudiesPlanFromRemoteSystem(systemUrl, setActive, log, course, code, c);
 
 
}
}
catch(Throwable e)
{
logger.error("UPDATE COURSE: " + i + " code: " + code + " FAILED");
logger.error(e,e);
}
}
return log.toString();
 
}
 
private void updateStudiesPlanFromRemoteSystem(String systemUrl, boolean setActive, StringBuilder log, JSONObject course, String code, Course c) throws IOException, JSONException, TransformationException, JAXBException {
String msg;
InputStream stream = new URL(systemUrl + "/wsjson/api?service=getStudiesPlanXml&code=" + code + "&renew=true").openStream();
String studiesPlan = StreamsUtils.readString(stream);
int len = studiesPlan.length();
if(studiesPlan == null || studiesPlan.trim().length() == 0 || studiesPlan.contains("<error>"))
{
msg = "Course " + code + " " + course.getString("name") + " dont has studies plan";
log.append("<warn>" + msg+"</warn>");
logger.warn(msg);
}
else
{
msg = "Found studies plan for " + code + " " + course.getString("name") + " will update ";
log.append("<info>" + msg+"</info>");
logger.info(msg);
if(setActive)
{
msg = "Setting course to active";
log.append("<info>" + msg+"</info>");
logger.info(msg);
c.setStatus(true);
}
//System.out.println(studiesPlan);
msg = "GENERATING COURSE JSON ....";
log.append("<info>" + msg+"</info>");
logger.info(msg);
new CoursesService().generateCourseJson(c);
 
msg="GENERATING COURSE STUDIES PLAN JSON ....";
log.append("<info>" + msg+"</info>");
logger.info(msg);
stream.close();
stream = new URL(systemUrl + "/wsjson/api?service=getStudiesPlanXml&code=" + code).openStream();
UserSession userSession = DomainObjectFactory.createUserSessionImpl();
userSession.setUser(DaoFactory.getUserDaoImpl().load(new Long(1)));
new CoursesService().uploadStudiesPlan(stream, "curso_" + code + ".xml", len,"appication/xml", userSession,c,true,systemUrl);
}
}
 
 
/**
* Update courseComission Members
* @param systemUrl
* @param code
* @param c
* @throws IOException
* @throws JSONException
*/
private void updateCourseComissionMembersAndCourseInfo(String systemUrl, String code, Course c) throws IOException, JSONException
{
 
URL urlCourseDetails = new URL(systemUrl + "/wsjson/api?service=getCourse&code=" + code);
InputStream isCourseDetails = urlCourseDetails.openStream();
String strCourseDetails = StreamsUtils.readString(isCourseDetails);
JSONObject objCourseDetails = new JSONObject(strCourseDetails);
 
//DEPARTMENT
JSONObject department = objCourseDetails.getJSONObject("courseInfo").getJSONObject("department");
if(department != null)
{
String sigla = department.getString("sigla");
if(sigla != null)
{
CourseDepartment department1 = DaoFactory.getCourseDepartmentDaoImpl().findBySigla(sigla);
if(department1 != null)
{
c.setDepartment(department1);
}
}
}
 
 
String validationRole = objCourseDetails.getJSONObject("courseInfo").getString("validationRole");
 
 
 
 
if(validationRole == null)
{
logger.info("validationRole is not defined");
}
else
{
logger.info("found validationRole: " + validationRole);
c.setValidationRole(validationRole);
 
JSONObject coordinator = objCourseDetails.getJSONObject("courseInfo").getJSONObject("coordinator");
JSONArray courseComission = objCourseDetails.getJSONObject("courseInfo").getJSONArray("courseComission");
 
Teacher coordinatorPersistent = findPersonFromCourseDetails(coordinator);
if(coordinatorPersistent == null)
{
logger.warn("Coordinator does not exist in this system ");
}
else
{
c.setCoordinator(coordinatorPersistent);
}
 
List<User> users = DaoFactory.getUserDaoImpl().loadRoleUsers(validationRole);
logger.info("Encontrados " + users.size() + " docentes com o papel de comissao " + validationRole + " vai remover");
for(User u: users)
{
logger.info("Removendo role a " + u.getName());
u.removeRole(validationRole);
}
 
for(int j = 0 ; j < courseComission.length(); j++)
{
JSONObject memberComission = courseComission.getJSONObject(j);
Teacher memberPersistent = findPersonFromCourseDetails(memberComission);
if(memberPersistent == null)
{
logger.info("Member does not exist in this system ");
}
else
{
logger.info("Adding role of course comission member");
if(!memberPersistent.hasRole(validationRole))
{
memberPersistent.addRole(validationRole);
}
}
}
}
}
 
private Teacher findPersonFromCourseDetails(JSONObject coordinator) {
int code;
try {
if(coordinator.has("sigesCode"))
{
code = coordinator.getInt("sigesCode");
}
else
{
logger.warn("there is no sigesCode for this person " + coordinator.toString());
return null;
}
} catch (JSONException e){
return null;
} catch (NumberFormatException e){
return null;
}
return DaoFactory.getTeacherDaoImpl().loadBySigesCode(code);
}
 
 
 
/*
* Studies Plans Administration Services
*
*/
public void addNewStudiesPlan(long courseId,CourseStudiesPlan studiesPlan,UserSession session)
{
Course c = DaoFactory.getCourseDaoImpl().load(courseId);
studiesPlan.setCourse(c);
c.getStudiesPlans().add(studiesPlan);
DaoFactory.getCourseStudiesPlanDaoImpl().save(studiesPlan);
}
 
public CourseStudiesPlanImpl cloneVersionFrom(long sourcePlanId, long targetPlanId, long courseId, UserSession session)
{
Course course = DaoFactory.getCourseDaoImpl().load(courseId);
CourseStudiesPlan source = null;
CourseStudiesPlan target = null;
for(CourseStudiesPlan plan: course.getStudiesPlans())
{
if(plan.getId() == sourcePlanId)
source = plan;
else if(plan.getId() == targetPlanId)
target = plan;
}
target.setXml(source.getXml());
target.setJson(source.getJson());
return (CourseStudiesPlanImpl) DaoFactory.getCourseStudiesPlanDaoImpl().narrow(target);
}
 
public Curso loadCursoPlanoFromXml(String xml)
{
try {
if(xml != null)
{
JAXBContext jc = JAXBContext.newInstance(Curso.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Curso curso = (Curso) unmarshaller.unmarshal(new StringReader(xml));
return curso;
}
return null;
} catch (JAXBException e) {
logger.error(e,e);
return null;
}
}
 
/**
* Persist the edited studies plan
* Updates studiesPlanVersion
* Updates studiesPlanVersionDescription
* Updates PlanoEstudos XML and JSON
*
* @param courseId
* @param coursePlanId
* @param planoEditado
* @param courseStudiesPlanEditado
* @return
*/
public Course savePlanoEstudosEditado(long courseId, long coursePlanId, Curso planoEditado, CourseStudiesPlan courseStudiesPlanEditado,UserSession session)
{
try {
Course course = DaoFactory.getCourseDaoImpl().load(courseId);
 
for(CourseStudiesPlan courseStudiesPlanPersistente: course.getStudiesPlans())
{
if(courseStudiesPlanPersistente.getId() == coursePlanId)
{
courseStudiesPlanPersistente.setVersion(courseStudiesPlanEditado.getVersion());
courseStudiesPlanPersistente.setVersionDescription(courseStudiesPlanEditado.getVersionDescription());
 
//REMOVED UNIDADES TO REMOVE
for(Curso.Semestre semestre:planoEditado.getSemestre())
{
Iterator<UnidadeType> uIter = semestre.getUnidade().iterator();
while(uIter.hasNext())
{
UnidadeType unidade = uIter.next();
if(unidade.getRemoved() != null && unidade.getRemoved().equals("true"))
uIter.remove();
}
for(Curso.Semestre.Perfil perfil: semestre.getPerfil())
{
Iterator<UnidadeType> uIter2 = perfil.getUnidade().iterator();
while(uIter2.hasNext())
{
UnidadeType unidade = uIter2.next();
if(unidade.getRemoved() != null && unidade.getRemoved().equals("true"))
uIter2.remove();
}
}
}
//Garante-se mas depois não vai para o JSON
planoEditado.setSiges(course.getCode());//GARANTIR QUE O CODIGO SIGEST ESTA CORRECTO
planoEditado.setNome(course.getName());
planoEditado.setDep(course.getArea());
//planoEditado.setDepDesc("");
//planoEditado.setDepDescEn("");
//planoEditado.setDepDescEs("");
//planoEditado.setDepDescFr("");
JAXBContext jc = JAXBContext.newInstance(Curso.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter xml = new StringWriter();
marshaller.marshal(planoEditado,xml);
 
courseStudiesPlanPersistente.setXml(xml.toString());
String json = getGensonPlanoEstudos().serialize(planoEditado);
//SETTING JSON in COURSE STUDIES PLAN
courseStudiesPlanPersistente.setJson(json);
break;
}
}
return course;
} catch (JAXBException e) {
logger.error(e,e);
return null;
} catch (TransformationException e) {
logger.error(e,e);
return null;
} catch (IOException e) {
logger.error(e,e);
return null;
}
}
 
public void generateFreshJsonPlanosEstudosFromXml(UserSession session)
{
List<CourseStudiesPlan> coursePlans = DaoFactory.getCourseStudiesPlanDaoImpl().findAll();
for(CourseStudiesPlan courseStudiesPlanPersistente: coursePlans)
{
try
{
logger.info("Generating JSON for " + courseStudiesPlanPersistente.getCourse().getName() + " version: " + courseStudiesPlanPersistente.getVersion());
Curso cursoPlano = loadCursoPlanoFromXml(courseStudiesPlanPersistente.getXml());
if(cursoPlano != null)
{
for(Curso.Semestre s : cursoPlano.getSemestre())
{
SemestreImpl.setDescriptionsDefaults(s);
}
//send to XML again
JAXBContext jc = JAXBContext.newInstance(Curso.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter xml = new StringWriter();
marshaller.marshal(cursoPlano,xml);
courseStudiesPlanPersistente.setXml(xml.toString());
String json = getGensonPlanoEstudos().serialize(cursoPlano);
//SETTING JSON in COURSE STUDIES PLAN
courseStudiesPlanPersistente.setJson(json);
}
 
}
catch(Throwable e)
{
logger.error(e,e);
}
}
 
logger.info("GENERATING JSON FOR CLASS COURSE");
for(Course course: DaoFactory.getCourseDaoImpl().findAll())
{
try {
logger.info("generating json for course: " + course.getName() + " (" + course.getCode() + ")");
generateCourseJson(course);
} catch (IOException e) {
logger.error(e,e);
} catch (TransformationException e) {
logger.error(e, e);
}
}
}
 
 
 
public List<CourseDepartment> loadDepartments()
{
List<CourseDepartment> departments = DaoFactory.getCourseDepartmentDaoImpl().findAll();
for(CourseDepartment dep: departments)
dep.getName();
return departments;
 
}
 
 
public Teacher addTeacherCommission(String teacherId,String courseId, UserSession session)
{
Course course = DaoFactory.getCourseDaoImpl().load(new Long(courseId));
Teacher t = DaoFactory.getTeacherDaoImpl().load(new Long(teacherId));
t.addRole(course.getValidationRole());
return t;
}
 
public Teacher removeTeacherCommission(String teacherId,String courseId, UserSession session)
{
Course course = DaoFactory.getCourseDaoImpl().load(new Long(courseId));
Teacher t = DaoFactory.getTeacherDaoImpl().load(new Long(teacherId));
t.removeRole(course.getValidationRole());
return t;
}
 
public static void main(String[] args)
{
AbstractDao.getCurrentSession().beginTransaction();
new CoursesService().generateFreshJsonPlanosEstudosFromXml(null);
AbstractDao.getCurrentSession().getTransaction().commit();
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/UpdateDepartmentsTask.java
New file
0,0 → 1,171
package pt.estgp.estgweb.services.courses;
 
import jomm.dao.impl.AbstractDao;
import pt.estgp.estgweb.domain.CourseDepartment;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.dao.impl.CourseDepartmentDaoImpl;
import pt.estgp.estgweb.utils.ConfigProperties;
 
/**
* Created by jorgemachado on 15/09/16.
*
* to be called from ANT tasks
*
*
* UPDATE DO MYSQL PARA OS DEPARTAMENTOS
*
* 1 - FAZER O UPDATE HIBERNATE SQL - Ira criar a tabela de departamentos
* As chaves estrangeiras não poderão ser criadas porque existem falhas de linkagem
* 2 - Correr esta tarefa - Irá criar os departamentos ant -f inportRoutines.xml updateCourseDepartments
* 3 - Correr novamente o update hibernate sql e a chave será atualizada
*/
public class UpdateDepartmentsTask
{
public static void main(String [] args)
{
 
AbstractDao.getCurrentSession().beginTransaction();
 
 
new UpdateDepartmentsTask().updateDepartmentsDefault();
 
AbstractDao.getCurrentSession().getTransaction().commit();
 
}
 
/**
* Check default departments if they already exist in database
* ESECS
* a) Comunicação, Artes e Tecnologias; CAT
* b) Educação e Formação; EF
* c) Intervenção e Desenvolvimento Social. IDS
*
* ESTG
* a) Tecnologias e Design TD
* b) Ciências Empresariais, Sociais e Humanas”. CESH
*
* ESAE
* a) Agricultura e Recursos Naturais ARN
* b) Ciência e Tecnologia Animal CTA
*
* ESSP
*
* a) Ciências e Tecnologias da Saúde
*
* Properties
* institution.code.prefix.inverse.ESTG=1
institution.code.prefix.inverse.ESAE=2
institution.code.prefix.inverse.ESECS=3
institution.code.prefix.inverse.ESS=4
 
*/
public void updateDepartmentsDefault()
{
 
CourseDepartmentDaoImpl dao = DaoFactory.getCourseDepartmentDaoImpl();
 
/*
* ESECS
* */
String sigla = "cat";
String nome = "Comunicação, Artes e Tecnologias";
String nomeEn = "Comunication Arts and Technology";
String nomeEs = "Comunicación, Artes y Tecnologías";
String nomeFr = "Communication, Arts et Technologies";
String institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESECS");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
sigla = "ef";
nome = "Educação e Formação";
nomeEn = "Education and training";
nomeEs = "Educación y formación";
nomeFr = "Éducation et formation";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESECS");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
sigla = "ids";
nome = "Intervenção e Desenvolvimento Social";
nomeEn = "Intervention and Social Development";
nomeEs = "Intervención y Desarrollo Social";
nomeFr = "Intervention et du Développement social";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESECS");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
 
/**
* ESTG
*/
sigla = "td";
nome = "Tecnologias e Design";
nomeEn = "Technology and Design";
nomeEs = "Tecnología y Diseño";
nomeFr = "Technologie et Design";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESTG");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
sigla = "cesh";
nome = "Ciências Empresariais, Sociais e Humanas";
nomeEn = "Business Sciences, Social and Human";
nomeEs = "Ciencias empresariales, Social y Humano";
nomeFr = "Entreprise Sciences, Sciences sociales et humaines";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESTG");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
 
/**
* ESAE
*/
sigla = "arn";
nome = "Agricultura e Recursos Naturais";
nomeEn = "Agriculture and Natural Resources";
nomeEs = "Agricultura y Recursos Naturales";
nomeFr = "Agriculture et ressources naturelles";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESAE");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
sigla = "cta";
nome = "Ciência e Tecnologia Animal";
nomeEn = "Animal Science and Technology";
nomeEs = "Ciencia y Tecnología Animal";
nomeFr = "Animal Science et technologie";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESAE");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
 
 
/**
* ESSP
*/
sigla = "cts";
nome = "Ciências e Tecnologias da Saúde";
nomeEn = "Science and Health Technologies";
nomeEs = "Ciencia y Salud Tecnologías";
nomeFr = "Sciences et technologies de la santé";
institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse.ESS");
 
createDepartment(dao, sigla, nome, nomeEn, nomeEs, nomeFr, institutionalCode);
}
 
private void createDepartment(CourseDepartmentDaoImpl dao, String sigla, String nome, String nomeEn, String nomeEs, String nomeFr, String institutionalCode) {
CourseDepartment courseDepartment = dao.findBySigla(sigla);
if(courseDepartment == null)
{
courseDepartment = DomainObjectFactory.createCourseDepartmentImpl();
courseDepartment.setSigla(sigla);
courseDepartment.setInstitutionalCode(institutionalCode);
courseDepartment.setName(nome);
courseDepartment.setNameEn(nomeEn);
courseDepartment.setNameEs(nomeEs);
courseDepartment.setNameFr(nomeFr);
courseDepartment.setActive(true);
dao.save(courseDepartment);
}
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/xsd/PerfilImpl.java
New file
0,0 → 1,18
package pt.estgp.estgweb.services.courses.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
import java.util.List;
 
/**
* Created by jorgemachado on 15/09/16.
*/
public class PerfilImpl extends Curso.Semestre.Perfil {
 
public List<UnidadeType> getUnidade() {
if (unidade == null) {
unidade = new DynamicArrayList<UnidadeType>(UnidadeImpl.class);
}
return this.unidade;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/xsd/SemestreImpl.java
New file
0,0 → 1,117
package pt.estgp.estgweb.services.courses.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
import java.util.List;
 
/**
* Created by jorgemachado on 15/09/16.
*/
public class SemestreImpl extends Curso.Semestre
{
 
public List<UnidadeType> getUnidade() {
if (unidade == null) {
unidade = new DynamicArrayList<UnidadeType>(UnidadeImpl.class);
}
return this.unidade;
}
 
public List<Curso.Semestre.Perfil> getPerfil() {
if (perfil == null) {
perfil = new DynamicArrayList<Perfil>(PerfilImpl.class);
}
return this.perfil;
}
 
private static String getSemestreDescAux(String id)
{
if(id.equals("S1"))
return "Semestre 1";
else if(id.equals("S2"))
return "Semestre 2";
else if(id.equals("S3"))
return "Semestre 3";
else if(id.equals("S4"))
return "Semestre 4";
else if(id.equals("S5"))
return "Semestre 5";
else if(id.equals("S6"))
return "Semestre 6";
else if(id.equals("T1"))
return "Trimestre 1";
else if(id.equals("T2"))
return "Trimestre 2";
else if(id.equals("T3"))
return "Trimestre 3";
else if(id.equals("T4"))
return "Trimestre 4";
else if(id.equals("T5"))
return "Trimestre 5";
else if(id.equals("T6"))
return "Trimestre 6";
else if(id.equals("T7"))
return "Trimestre 7";
else if(id.equals("T8"))
return "Trimestre 8";
 
return "";
}
 
private static String getSemestreDescAuxEn(String id)
{
if(id.equals("S1"))
return "Semester 1";
else if(id.equals("S2"))
return "Semester 2";
else if(id.equals("S3"))
return "Semester 3";
else if(id.equals("S4"))
return "Semester 4";
else if(id.equals("S5"))
return "Semester 5";
else if(id.equals("S6"))
return "Semester 6";
else if(id.equals("T1"))
return "Quarter 1";
else if(id.equals("T2"))
return "Quarter 2";
else if(id.equals("T3"))
return "Quarter 3";
else if(id.equals("T4"))
return "Quarter 4";
else if(id.equals("T5"))
return "Quarter 5";
else if(id.equals("T6"))
return "Quarter 6";
else if(id.equals("T7"))
return "Quarter 7";
else if(id.equals("T8"))
return "Quarter 8";
 
return "";
}
 
 
 
 
public void setId(String semestre)
{
 
super.setId(semestre);
setDescriptionsDefaults(this);
}
 
public static void setDescriptionsDefaults(Curso.Semestre semestre)
{
if(!semestre.getId().equals("OP"))
{
semestre.setSemestreDesc(getSemestreDescAux(semestre.getId()));
semestre.setSemestreDescEn(getSemestreDescAuxEn(semestre.getId()));
semestre.setSemestreDescEs(getSemestreDescAux(semestre.getId()));
semestre.setSemestreDescFr(getSemestreDescAux(semestre.getId()));
}
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/xsd/UnidadeImpl.java
New file
0,0 → 1,14
package pt.estgp.estgweb.services.courses.xsd;
 
/**
* Created by jorgemachado on 15/09/16.
*/
public class UnidadeImpl extends UnidadeType {
public UnidadeType.HorasContacto getHorasContacto() {
 
if(horasContacto == null)
horasContacto = new HorasContacto();
return horasContacto;
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/xsd/CursoImpl.java
New file
0,0 → 1,21
package pt.estgp.estgweb.services.courses.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
import java.util.List;
 
/**
* Created by jorgemachado on 15/09/16.
*/
public class CursoImpl extends Curso
{
public List<Semestre> getSemestre() {
if (semestre == null) {
semestre = new DynamicArrayList<Semestre>(SemestreImpl.class);
}
return this.semestre;
 
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courseunits/SaveCourseUnitEvaluation.java
215,7 → 215,7
}
else
{
repositoryService.updateRepositoryFile(cu.getEvaluationStreamId(), new FileInputStream(path), "application/pdf", "pdf", ((int)new File(path).length()),cu.getCode() + "-evaluation.pdf", "evaluation.evaluation.description " + cu.getName(), ResourceAccessControlEnum.privateDomain);
repositoryService.updateRepositoryFile(cu.getEvaluationStreamId(), new FileInputStream(path), "application/pdf", "pdf", ((int)new File(path).length()),cu.getCode() + "-evaluation.pdf", "evaluation.evaluation.description " + cu.getName(), ResourceAccessControlEnum.courseunitEvaluationDomain);
}
 
//Obrigar a ser falso
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courseunits/CreateCourseUnitAdminService.java
48,7 → 48,7
}
cUV.persistViewAdminInObject(courseUnit);
 
courseUnit.setInstitutionCode("" + DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode());
 
//por o curso
//por os profs
//por alunos
/branches/v3/impl/src/java/pt/estgp/estgweb/services/email/impl/EmailTransport.java
New file
0,0 → 1,135
package pt.estgp.estgweb.services.email.impl;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
 
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import java.util.Properties;
 
/**
* Created by jorgemachado on 13/06/16.
*/
public class EmailTransport
{
 
private static final Logger logger = Logger.getLogger(EmailTransport.class);
 
Session session = null;
Transport transport = null;
 
String sendFromAddress;
String password;
String identifier;
 
public EmailTransport(String identifier, String sendFromAddress,String password)
{
this.identifier = identifier;
this.sendFromAddress = sendFromAddress;
this.password = password;
}
 
public synchronized Transport getEmailTransport()
{
if(session == null || transport == null || !transport.isConnected())
{
logger.info("Transport(" + identifier + ") CONNECTION TO TRANSPORT DOES NOT EXIST OR FAIL WILL REOPEN : " + sendFromAddress + " password: " + password);
}
else
{
System.out.println("Transport(" + identifier + ") OK --> RETURNING Transport");
return transport;
}
 
 
 
 
// Set up properties for mail session
//Properties props = System.getProperties();
Properties props = new Properties();
props.put("mail.smtp.host", Globals.EMAIL_SERVER_HOST);
props.setProperty("mail.transport.protocol", "smtp");//todo new
javax.mail.Authenticator authenticator = null;
if(Globals.SYSTEM_EMAIL_USE_SECURITY && Globals.EMAIL_SERVER_SECURITY != null && Globals.EMAIL_SERVER_SECURITY.compareTo("TLS")==0)
{
logger.info("Transport(" + identifier + ") Using Email Security TLS");
 
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.port", ""+ Globals.EMAIL_SERVER_SECURITY_TLS);
authenticator = new javax.mail.Authenticator() {
 
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Email from:" + sendFromAddress + " pass:" + password);
return new PasswordAuthentication(sendFromAddress, password);
}
};
}
else if(Globals.SYSTEM_EMAIL_USE_SECURITY && Globals.EMAIL_SERVER_SECURITY != null && Globals.EMAIL_SERVER_SECURITY.compareTo("SSL")==0)
{
logger.info("Transport(" + identifier + ") Using Email Security SSL");
 
props.put("mail.smtp.socketFactory.port", Globals.EMAIL_SERVER_SECURITY_SSL);
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", Globals.EMAIL_SERVER_SECURITY_SSL);
authenticator = new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Email from:" + sendFromAddress + " pass:" + password);
 
return new PasswordAuthentication(sendFromAddress,password);
}
};
}
else
{
 
}
 
 
 
System.out.println("Transport(" + identifier + ") Autenticator != null :" + (authenticator != null));
// Get session
/*Session session = authenticator != null ?
Session.getDefaultInstance(props, authenticator)
: Session.getDefaultInstance(props) ;
*/
 
session = authenticator != null ?
Session.getInstance(props, authenticator)
: Session.getInstance(props) ;
 
try {
transport = session.getTransport("smtp");
System.out.println("Transport(" + identifier + ") before connect isConnected:" + transport.isConnected());
transport.connect();
System.out.println("Transport(" + identifier + ") after connect isConnected:" + transport.isConnected());
} catch (MessagingException e) {
logger.error(e,e);
return null;
}
 
session.setDebug(true);
session.setDebugOut(System.out);
return transport;
}
 
public String getIdentifier() {
return identifier;
}
 
public Session getSession() {
return session;
}
 
public Transport getTransport() {
return transport;
}
 
public String getSendFromAddress() {
return sendFromAddress;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/email/impl/EmailTransportPool.java
New file
0,0 → 1,89
package pt.estgp.estgweb.services.email.impl;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
 
import javax.mail.Transport;
import java.util.ArrayList;
import java.util.List;
 
/**
* Created by jorgemachado on 13/06/16.
*/
public class EmailTransportPool
{
private static final Logger logger = Logger.getLogger(EmailTransportPool.class);
 
private List<EmailTransport> pool = new ArrayList<EmailTransport>();
 
//SINGLETON INSTANCE
static EmailTransportPool instance = new EmailTransportPool();
 
public static EmailTransportPool getInstance(){
return instance;
}
 
String[] serverEmails;
 
private EmailTransportPool()
{
serverEmails = new String[Globals.EMAIL_SERVER_USER_COUNT];
for(int i = 1;i<= Globals.EMAIL_SERVER_USER_COUNT;i++)
{
serverEmails[i-1] = Globals.EMAIL_SERVER_USER_PREFIX + i + Globals.EMAIL_SERVER_USER_SUFIX;
}
 
if(Globals.SYSTEM_EMAIL_USE_ROUND_ROBIN)
{
for(String emailFrom: serverEmails)
{
String pass = Globals.EMAIL_SERVER_PASSWORD;
logger.info("POOL: Adding to POOL " + emailFrom + " with pass: " + pass);
createTransport(emailFrom,emailFrom,pass);
}
}
else
{
logger.info("POOL: Will use only system mail box");
createTransport(Globals.SYSTEM_EMAIL_BOX,Globals.SYSTEM_EMAIL_BOX,Globals.EMAIL_SERVER_PASSWORD);
}
}
 
private void createTransport(String identifier, String emailFrom, String emailServerPassword)
{
EmailTransport emailTransport = new EmailTransport(identifier,emailFrom,emailServerPassword);
pool.add(emailTransport);
}
 
int indexPool = -1;
 
public synchronized EmailTransport getAvailableTransportFromPool()
{
int tries = pool.size();
while(tries > 0)
{
tries--;
 
indexPool++;
 
if(indexPool >= pool.size())
indexPool = 0;
 
EmailTransport emailTransport = pool.get(indexPool);
 
Transport transport = emailTransport.getEmailTransport();
if(transport.isConnected())
{
logger.warn("EMAIL POOL: Transport (" + emailTransport.getIdentifier() + ") is OK connected, will return this one");
return emailTransport;
}
else
{
logger.warn("EMAIL POOL: Transport (" + emailTransport.getIdentifier() + ") is not connected, will try another");
}
}
logger.warn("EMAIL POOL: Transport (There are no available transports)");
return null;
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/email/EMAILJob.java
33,50 → 33,66
 
 
 
//TODO WHEN BACK TO BCC REMOVE this to 20 and remove Thread
private static final int NUMBER_EMAILS_TO = 1;
private static final int pauseTime = 1000;
 
 
public void runJob()
{
if(Globals.TEST_ENVIRONEMENT)
{
String warn = "System in TEST Environement - will not send EMAIL";
logger.warn(warn);
return;
}
try
{
List<String> recipientsOriginal = new ArrayList<String>();
List<String> recipients = new ArrayList<String>();
recipients.addAll(email.getRecipients());
recipientsOriginal.addAll(email.getRecipients());
while(recipients.size() > 0)
{
List<String> recipientsToSend = new ArrayList<String>();
final Email cloned = email.cloneEmailForJob();
logger.info("Opening new Thread to send emails");
new Thread(
new Runnable() {
@Override
public void run() {
if(Globals.TEST_ENVIRONEMENT && !cloned.isSystemAssumingTestEmail())
{
String warn = "System in TEST Environement - will not send EMAIL";
logger.warn(warn);
return;
}
try
{
List<String> recipientsOriginal = new ArrayList<String>();
List<String> recipients = new ArrayList<String>();
recipients.addAll(cloned.getRecipients());
recipientsOriginal.addAll(cloned.getRecipients());
while(recipients.size() > 0)
{
List<String> recipientsToSend = new ArrayList<String>();
 
int contador = 0;
Iterator<String> iter = recipients.iterator();
while(iter.hasNext() && contador < 20)
{
recipientsToSend.add(iter.next());
iter.remove();
contador++;
int contador = 0;
Iterator<String> iter = recipients.iterator();
while(iter.hasNext() && contador < NUMBER_EMAILS_TO)
{
recipientsToSend.add(iter.next());
iter.remove();
contador++;
}
cloned.setRecipients(recipientsToSend);
new SendEmailService().sendEmail(cloned);
try {
Thread.sleep(pauseTime);
} catch (InterruptedException e) {
logger.error(e,e);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error(e,e);
}
cloned.setRecipients(recipientsOriginal);
}
catch (ServiceException e)
{
logger.error("Sending EMAIL:" + e.toString(),e);
}
}
}
email.setRecipients(recipientsToSend);
new SendEmailService().sendEmail(email);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error(e,e);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error(e,e);
}
email.setRecipients(recipientsOriginal);
}
catch (ServiceException e)
{
logger.error("Sending EMAIL:" + e.toString(),e);
}
).start();
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/email/SendEmailService.java
5,13 → 5,17
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.enums.LangEnum;
import pt.estgp.estgweb.services.email.impl.EmailTransport;
import pt.estgp.estgweb.services.email.impl.EmailTransportPool;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.estgp.estgweb.utils.EmailPersonalizedCertificated;
import pt.estgp.estgweb.web.utils.DatesUtils;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import javax.mail.*;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
19,7 → 23,6
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
 
/**
* @author Jorge Machado
33,16 → 36,123
 
private static final String gradeUnitTemplate = Globals.TEMPLATE_EMAIL_PATH + "/" + Globals.EMAIL_GRADE_UNIT_TEMPLATE;
 
static String[] serverEmails;
/*static String sendFromAddress;*/
 
public SendEmailService() {
 
 
}
 
/*static String[] serverEmails;
static int serverEmailPos = -1;
static Session session = null;
static Transport transport = null;
 
static{
 
static
{
serverEmails = new String[Globals.EMAIL_SERVER_USER_COUNT];
for(int i = 1;i<= Globals.EMAIL_SERVER_USER_COUNT;i++)
{
serverEmails[i-1] = Globals.EMAIL_SERVER_USER_PREFIX + i + Globals.EMAIL_SERVER_USER_SUFIX;
}
}
 
public static synchronized Transport getEmailTransport()
{
 
 
if(session == null || transport == null || !transport.isConnected())
{
sendFromAddress = Globals.SYSTEM_EMAIL_USE_ROUND_ROBIN ?
getRoundRobinEmailUser() : Globals.SYSTEM_EMAIL_BOX;
 
logger.info("CONNECTION TO TRANSPORT FAIL WILL REOPEN : " + sendFromAddress + " using round robin: " + Globals.SYSTEM_EMAIL_USE_ROUND_ROBIN);
}
else
{
System.out.println("TRANSPORT OK RETURNING");
return transport;
}
 
 
 
 
// Set up properties for mail session
//Properties props = System.getProperties();
Properties props = new Properties();
props.put("mail.smtp.host", Globals.EMAIL_SERVER_HOST);
props.setProperty("mail.transport.protocol", "smtp");//todo new
final String username = Globals.EMAIL_SERVER_USERNAME;
final String password = Globals.EMAIL_SERVER_PASSWORD;
javax.mail.Authenticator authenticator = null;
if(Globals.SYSTEM_EMAIL_USE_SECURITY && Globals.EMAIL_SERVER_SECURITY != null && Globals.EMAIL_SERVER_SECURITY.compareTo("TLS")==0)
{
logger.info("Using Email Security TLS");
 
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.port", ""+ Globals.EMAIL_SERVER_SECURITY_TLS);
authenticator = new javax.mail.Authenticator() {
 
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Email from:" + sendFromAddress + " pass:" + password);
return new PasswordAuthentication(sendFromAddress, password);
}
};
}
else if(Globals.SYSTEM_EMAIL_USE_SECURITY && Globals.EMAIL_SERVER_SECURITY != null && Globals.EMAIL_SERVER_SECURITY.compareTo("SSL")==0)
{
logger.info("Using Email Security SSL");
 
props.put("mail.smtp.socketFactory.port", Globals.EMAIL_SERVER_SECURITY_SSL);
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", Globals.EMAIL_SERVER_SECURITY_SSL);
authenticator = new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Email from:" + sendFromAddress + " pass:" + password);
 
return new PasswordAuthentication(sendFromAddress,password);
}
};
}
else
{
 
}
 
 
 
System.out.println("Autenticator != null :" + (authenticator != null));
// Get session
//Session session = authenticator != null ?
// Session.getDefaultInstance(props, authenticator)
// : Session.getDefaultInstance(props) ;
 
 
session = authenticator != null ?
Session.getInstance(props, authenticator)
: Session.getInstance(props) ;
 
try {
 
System.out.println("toString:" + session.getTransport("smtp").toString());
transport = session.getTransport("smtp");
System.out.println("before connect isConnected:" + transport.isConnected());
transport.connect();
System.out.println("after connect isConnected:" + transport.isConnected());
} catch (MessagingException e) {
logger.error(e,e);
return null;
}
 
session.setDebug(true);
session.setDebugOut(System.out);
return transport;
 
}
private static synchronized String getRoundRobinEmailUser()
{
serverEmailPos++;
52,64 → 162,31
}
return serverEmails[serverEmailPos];
}
*/
 
public void sendEmail(Email email) throws ServiceException
{
if(Globals.TEST_ENVIRONEMENT)
sendEmail(email,null,null);
}
public void sendEmail(Email email,String url,String nome) throws ServiceException
{
if(Globals.TEST_ENVIRONEMENT && !email.isSystemAssumingTestEmail())
{
String warn = "System in TEST Environement - will not send EMAIL";
logger.warn(warn);
return;
}
try{
final String sendFromAddress = getRoundRobinEmailUser();
 
// Set up properties for mail session
Properties props = System.getProperties();
props.put("mail.smtp.host", Globals.EMAIL_SERVER_HOST);
final String username = Globals.EMAIL_SERVER_USERNAME;
final String password = Globals.EMAIL_SERVER_PASSWORD;
javax.mail.Authenticator authenticator = null;
if(Globals.EMAIL_SERVER_SECURITY != null && Globals.EMAIL_SERVER_SECURITY.compareTo("TLS")==0)
{
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.port", ""+ Globals.EMAIL_SERVER_SECURITY_TLS);
authenticator = new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(sendFromAddress, password);
}
};
}
else if(Globals.EMAIL_SERVER_SECURITY != null && Globals.EMAIL_SERVER_SECURITY.compareTo("SSL")==0)
{
props.put("mail.smtp.socketFactory.port", Globals.EMAIL_SERVER_SECURITY_SSL);
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", Globals.EMAIL_SERVER_SECURITY_SSL);
authenticator = new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(sendFromAddress,password);
}
};
}
else
{
//Transport transport = getEmailTransport();
//MimeMessage message = new MimeMessage(session);
 
}
EmailTransport emailTransport = EmailTransportPool.getInstance().getAvailableTransportFromPool();
MimeMessage message = new MimeMessage(emailTransport.getSession());
 
 
 
 
 
 
// Get session
Session session = Session.getDefaultInstance(props, authenticator);
session.setDebug(true);
session.setDebugOut(System.out);
 
// Create message
MimeMessage message = new MimeMessage(session);
// Set the recipients of the message
boolean valid = false;
for (String recipient : email.getRecipients())
117,23 → 194,41
if(Email.validEmail(recipient))
{
valid=true;
message.addRecipient(email.getType(),new InternetAddress(recipient));
logger.info("Adding recipient to transport:"+recipient);
message.addRecipient(Message.RecipientType.TO,new InternetAddress(recipient));
logger.info("Adding recipient (" + email.getType().toString() + ") to transport:"+recipient);
}
}
 
if(email.getRecipientsCC() != null)
{
for (String recipient : email.getRecipientsCC())
{
if(Email.validEmail(recipient))
{
//valid=true;
message.addRecipient(Message.RecipientType.CC,new InternetAddress(recipient));
logger.info("Adding recipient CC (" + email.getType().toString() + ") to transport:"+recipient);
}
}
}
if(valid)
{
 
String content = TemplateUtils.getOrLoadTemplate(Globals.TEMPLATE_EMAIL_PATH + "/" + email.getEmailTemplateName());
// Format the mail message
String fullMessage = MessageFormat.format(content, email.getArguments().toArray());
String fullMessage = getEmailTextMessage(email);
 
if(url != null && nome != null)
{
logger.info("Requesting certificated Email, will replace fields in template");
fullMessage = fullMessage.replaceAll("@USER_NOME@",nome);
fullMessage = fullMessage.replaceAll("@URL@",url);
}
 
 
logger.info("FROM:" + email.getFrom() + " but using: " + sendFromAddress);
 
logger.info("FROM:" + email.getFrom() + " but using: " + emailTransport.getSendFromAddress());
//if(email.getFromName() != null)
try {
message.setFrom(new InternetAddress(sendFromAddress,sendFromAddress));
message.setFrom(new InternetAddress(emailTransport.getSendFromAddress(),emailTransport.getSendFromAddress()));
} catch (UnsupportedEncodingException e) {
logger.error(e,e);
//message.setFrom(new InternetAddress(sendFromAddress));
146,13 → 241,13
{
 
fullMessage += email.getFrom() != null && email.getFrom().length()>0 && !email.getFrom().equals(Globals.SYSTEM_EMAIL_BOX) ? "<br/><br/>Responda para " + email.getFrom() : "<br/><br/>Por favor não responda a este email";
fullMessage += " <br/> <br/> <h5> Mensagem Segura - enviada através da Google Apps Api através de baco 2015 </h5>";
fullMessage += " <br/> <br/> <h5> Mensagem Segura - enviada através da Google Apps Api </h5>";
 
}
else
{
fullMessage += email.getFrom() != null && email.getFrom().length()>0 && !email.getFrom().equals(Globals.SYSTEM_EMAIL_BOX) ? "\n\nResponda para " + email.getFrom() : "\n\nPor favor não responda a este email";
fullMessage += " \n\n Mensagem Segura - enviada através da Google Apps Api através de baco 2015";
fullMessage += " \n\n Mensagem Segura - enviada através da Google Apps Api ";
}
 
message.setText(fullMessage,"utf-8");
171,7 → 266,9
 
 
 
Transport.send(message);
emailTransport.getTransport().send(message);
//session.getTransport("smtp").sendMessage(message,message.getAllRecipients());
//session.getTransport().close();
}
}
catch(MessagingException e)
181,6 → 278,22
}
}
 
private static String getEmailTextMessage(Email email)
{
return getEmailTextMessage( email.getEmailTemplateName(), email.getArguments().toArray());
}
 
public static String getEmailTextMessage(String template,List<String> arguments)
{
return getEmailTextMessage(template, arguments.toArray());
}
public static String getEmailTextMessage(String template,Object[] arguments)
{
String content = TemplateUtils.getOrLoadTemplate(Globals.TEMPLATE_EMAIL_PATH + "/" +template);
// Format the mail message
return MessageFormat.format(content, arguments);
}
 
public Email getSendUrlToFriendEmail(String url, String from, LangEnum langEnum, List<String> recipients)
{
List<String> arguments = new ArrayList<String>();
293,6 → 406,95
return email;
}
 
public Email getMessageEmailAdulteredFromEmailIpp(String fromEmail, String from, String subject,String text, List<String> emails, User user)
{
// # 0 : From
// # 1 : Subject
// # 2 : Text
// # 3 : FromEmail Adultered in message
// # 4 : URL todo with certificate
List<String> arguments = new ArrayList<String>();
arguments.add(from);
arguments.add(subject);
arguments.add(text);
arguments.add(fromEmail);
 
String template;
 
template = Globals.EMAIL_MESSAGE_IPP_TEMPLATE_PT;
 
 
List<String> recipients = new ArrayList<String>();
for(String e: emails)
{
if(Email.validEmail(e))
recipients.add(e);
}
 
logger.info("subject: " + subject);
if(fromEmail == null)
logger.info("user: " + user.getEmail());
else
logger.info("user altered to: " + fromEmail);
logger.info("template: " + template);
logger.info("arguments:");
for(String arg: arguments)
logger.info(arg);
logger.info("recipients:");
for(String rec: recipients)
logger.info(rec);
logger.info("arguments end");
fromEmail = fromEmail == null ? user.getEmail() : fromEmail;
Email email = new Email(subject ,recipients,fromEmail,template,arguments,Message.RecipientType.TO);
email.setFromName(from + " (PAE-IPP)");
return email;
}
 
public EmailPersonalizedCertificated getMessageEmailAdulteredFromEmailIppCertificated(
String fromEmail, String from, String subject,String text, User user,
List<Long> userIds,
String url
)
{
// # 0 : From
// # 1 : Subject
// # 2 : Text
// # 3 : FromEmail Adultered in message
// # 4 : URL todo with certificate
List<String> arguments = new ArrayList<String>();
arguments.add(from);
arguments.add(subject);
arguments.add(text);
arguments.add(fromEmail);
 
String template;
 
template = Globals.EMAIL_MESSAGE_IPP_TEMPLATE_PT_CERTIFICATED;
 
 
logger.info("Preparing batch work for Personalized Emails Certificated");
logger.info("subject: " + subject);
if(fromEmail == null)
logger.info("user: " + user.getEmail());
else
logger.info("user altered to: " + fromEmail);
logger.info("template: " + template);
logger.info("arguments:");
for(String arg: arguments)
logger.info(arg);
logger.info("userIds:" + userIds);
logger.info("arguments end");
fromEmail = fromEmail == null ? user.getEmail() : fromEmail;
EmailPersonalizedCertificated email = new EmailPersonalizedCertificated(subject ,fromEmail,template,arguments,
url,
userIds);
email.setFromName(from + " (PAE-IPP)");
 
return email;
}
 
 
 
public Email getMessageEmailOld(String from, String subject,String text, LangEnum langEnum, String target, List<User> users, User user)
{
// # 0 : From
/branches/v3/impl/src/java/pt/estgp/estgweb/services/email/Emails.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/branches/v3/impl/src/java/pt/estgp/estgweb/services/email/EMAILJobPersonalizedCertificated.java
New file
0,0 → 1,143
package pt.estgp.estgweb.services.email;
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.authenticate.AuthenticateService;
import pt.estgp.estgweb.services.jobs.JobHandler;
import pt.estgp.estgweb.utils.Email;
import pt.estgp.estgweb.utils.EmailPersonalizedCertificated;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
 
/**
* @author Jorge Machado
* @date 11/Jul/2008
* @see pt.estgp.estgweb.services.sms
*/
public class EMAILJobPersonalizedCertificated implements JobHandler, Serializable
{
private static final Logger logger = Logger.getLogger(EMAILJobPersonalizedCertificated.class);
 
private EmailPersonalizedCertificated email;
 
 
 
 
public EMAILJobPersonalizedCertificated(EmailPersonalizedCertificated email)
{
this.email = email;
}
 
 
private static final int pauseTime = 1000;
 
 
public void runJob()
{
final EmailPersonalizedCertificated cloned = email.cloneEmailForJob();
 
 
logger.info("Opening new Thread to send emails");
new Thread(
new Runnable() {
@Override
public void run() {
if(Globals.TEST_ENVIRONEMENT && !cloned.isSystemAssumingTestEmail())
{
String warn = "System in TEST Environement - will not send EMAIL";
logger.warn(warn);
return;
}
try
{
String URL_PREFIX = cloned.getUrlPatternWithoutCetificate();
if(URL_PREFIX.indexOf("?") < 0)
URL_PREFIX = URL_PREFIX + "?certificate=";
else
URL_PREFIX = URL_PREFIX + "&certificate=";
 
cloned.setRecipients(new ArrayList<String>());
 
SendEmailService sendEmailService = new SendEmailService();
 
int count = 0;
int size = cloned.getUserIds().size();
for(long userId: cloned.getUserIds())
{
count++;
logger.info("Users completed: " + count + "/" + size + " --> " + (100.0 * ((float)count) / ((float)size)) + "%");
 
try{
AbstractDao.getCurrentSession().beginTransaction();
AbstractDao.getCurrentSession().clear();
User user = DaoFactory.getUserDaoImpl().load(userId);
String certificate = new AuthenticateService().createCertificate(user);
String emailStr = user.getEmail();
String outEmail = user.getOutEmail();
String preferrefEmail = user.getPreferrefEmail();
String toEmail = null;
 
if(preferrefEmail != null && Email.validEmail(preferrefEmail))
toEmail = preferrefEmail;
else if(emailStr != null && Email.validEmail(emailStr))
toEmail = emailStr;
else if(outEmail != null && Email.validEmail(outEmail))
toEmail = outEmail;
String nome = user.getName();
AbstractDao.getCurrentSession().getTransaction().commit();
 
if(toEmail != null)
{
List<String> ccEmails = new ArrayList<String>();
if(emailStr != null && Email.validEmail(emailStr) && !toEmail.equals(emailStr))
ccEmails.add(emailStr);
if(outEmail != null && Email.validEmail(outEmail) && !toEmail.equals(outEmail))
ccEmails.add(outEmail);
 
 
cloned.setRecipientsCC(ccEmails);
cloned.getRecipients().clear();
cloned.getRecipients().add(toEmail);
 
String finalUrl = URL_PREFIX + certificate;
 
sendEmailService.sendEmail(cloned, finalUrl, nome);
 
try {
logger.info("Watting to send another email: sent to" + toEmail);
//Thread.sleep(pauseTime);
Thread.sleep(pauseTime);
} catch (InterruptedException e) {
logger.error(e,e);
}
}
 
 
}catch(Throwable e)
{
logger.error(e,e);
}
 
}
 
logger.info("No more user ids to send email. exiting");
 
 
}
catch (Throwable e)
{
logger.error("Sending EMAIL:" + e.toString(),e);
}
}
}
).start();
}
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportStudentsService.java
59,6 → 59,7
int studentsChangeBI = 0;
int unitsAddedToStudents = 0;
int alunosErasmusCadeirasEcontradas = 0;
int alunosSemTurmaParaAUnidades = 0;
int turmaMoreThanOneRegularCourse = 0;
int unidadesProcuradasNumCursoAleatorio = 0;
List<String> turmasMoreThanOneCourse = new ArrayList<String>();
67,6 → 68,8
int estudantesComCadeirasSemTurma = 0;
int turmasComCodigoNullRemovidas = 0;
int unidadesSoComAlunosExtra = 0;
int turmasVindasANullDoSIGES = 0;
int turmasVindasANullDoSIGESEncontradasNoutroCampo = 0;
 
 
 
102,6 → 105,8
turmasComCodigoNullRemovidas = 0;
unidadesSoComAlunosExtra = 0;
unidadesProcuradasNumCursoAleatorio = 0;
alunosSemTurmaParaAUnidades = 0;
turmasVindasANullDoSIGES = 0;
ImportCourseService.resetCourseYearTurmaPolicy();
 
 
162,6 → 167,9
newUser = true;
}
 
//if(alunoSiges.getCodigo() == 11211)
// System.out.println("Aqui");
 
persist(alunoSiges, s, newUser,year,institutionCode,activeImportYearParaVerificacaoDePropinasEmDia,logMessages,service);
 
if(studentComUnidadesRepetidas)
263,7 → 271,19
serviceLogInfo("#Units not Removed because localy added: " + unitsLocalAddedNotRemoved);
serviceLogInfo("#Units not Added because localy removed: " + unitsLocallyRemovedNotAdded);
serviceLogInfo("#Alunos com Unidades repetidas: " + unitsRepeated);
serviceLogInfo("#ERASMUS Sum Subscriptions Replaced: " + alunosErasmusCadeirasEcontradas);
serviceLogWarn("#ERASMUS Sum Subscriptions Replaced: " + alunosErasmusCadeirasEcontradas);
if(turmasVindasANullDoSIGES > 0)
{
serviceLogError("######!!!!!Turmas a NULL NO SIGES " + turmasVindasANullDoSIGES + " - POSSIVEL CAMPO DE TURMA diferente de TURMA_T na tabela T_INSCR, procure no LOG pela frase: (turmasVindasANullDoSIGES) ");
}
if(turmasVindasANullDoSIGESEncontradasNoutroCampo > 0)
{
serviceLogInfo("######!!!!!Foram no entanto encontradas noutro campo P L TP O C S E: " + turmasVindasANullDoSIGESEncontradasNoutroCampo + " turmas ver mais info no LOG");
}
if(alunosSemTurmaParaAUnidades > 0)
{
serviceLogError("######!!!!!Alunos com Unidade mas sem Turma: " + alunosSemTurmaParaAUnidades + " -> verificar situação junto da administração de software do PAE - procure no LOG pela frase:(alunosSemTurmaParaAUnidades)");
}
if(unidadesProcuradasNumCursoAleatorio > 0)
serviceLogInfo("######!!!!!Unidades atribuidas com curso aleatoriamente escolhido derivado a duvidas: " + unidadesProcuradasNumCursoAleatorio + " (procurar por \"tem mais de um curso vamos procurar num qualquer\")");
if(turmaMoreThanOneRegularCourse > 0)
325,6 → 345,18
logger.info("#Units not Added because localy removed: " + unitsLocallyRemovedNotAdded);
logger.info("#Alunos com Unidades repetidas: " + unitsRepeated);
logger.info("#ERASMUS Sum Subscriptions Replaced: " + alunosErasmusCadeirasEcontradas);
if(turmasVindasANullDoSIGES > 0)
{
logger.error("######!!!!!Turmas a NULL NO SIGES " + turmasVindasANullDoSIGES + " - POSSIVEL CAMPO DE TURMA diferente de TURMA_T na tabela T_INSCR procure no LOG pela frase: (turmasVindasANullDoSIGES) ");
}
if(turmasVindasANullDoSIGESEncontradasNoutroCampo > 0)
{
logger.info("######!!!!!Foram no entanto encontradas noutro campo P L TP O C S E: " + turmasVindasANullDoSIGESEncontradasNoutroCampo + " turmas ver mais info no LOG");
}
if(alunosSemTurmaParaAUnidades > 0)
{
logger.error("######!!!!!Alunos com Unidade mas sem Turma: " + alunosSemTurmaParaAUnidades + " -> verificar situação junto da administração de software do PAE - procure no LOG pela frase:(alunosSemTurmaParaAUnidades)");
}
if(unidadesProcuradasNumCursoAleatorio > 0)
logger.warn("######!!!!!Unidades atribuidas com curso aleatoriamente escolhido derivado a duvidas: " + unidadesProcuradasNumCursoAleatorio + " (procurar por \"tem mais de um curso vamos procurar num qualquer\")");
 
510,16 → 542,18
"where courseunit.importYear=\"" + year + "\" and courseunit.institutionCode = \"" + institutionCode + "\" and turmas.studentId is null ");
ResultSet rs = ps.executeQuery();
List<Integer> longs = new ArrayList<Integer>();
//alunosSemTurmaParaAUnidades = longs.size();
while(rs.next())
{
longs.add(rs.getInt("sigesCode"));
}
alunosSemTurmaParaAUnidades = longs.size();
rs.close();
ps.close();
 
if(longs.size() > 0)
{
String msgS = "Existem estudantes no BACO com unidades sem turma respectiva ano: " + year + " institution:" + institutionCode + " possiveis adicionados manualmente, confirmar";
String msgS = "(alunosSemTurmaParaAUnidades) ATENÇÃO_ Existem estudantes no BACO com unidades sem turma respectiva ano: " + year + " institution:" + institutionCode + " possiveis adicionados manualmente, confirmar";
serviceLogWarn(msgS);
logger.warn(msgS);
msgS = "";
568,8 → 602,8
estudantesDesaparecidosDoSigesNesteAno++;
Student s = DaoFactory.getStudentDaoImpl().loadBySigesCode(c);
StudentImpl studentImpl = (StudentImpl) DaoFactory.getStudentDaoImpl().narrow(s);
removerUnidadesQueDesapareceramNoSiges(year, new HashSet<CourseUnit>(), studentImpl);
consistirTurmasAluno(studentImpl, year, new HashMap<CourseUnit, String>());
removerUnidadesQueDesapareceramNoSiges(year, new HashSet<CourseUnit>(), studentImpl,institutionCode);
consistirTurmasAluno(studentImpl, year, new HashMap<CourseUnit, String>(),institutionCode);
}
}
else
835,8 → 869,8
serviceLogWarn("ATENTION STUDENT WITH ZERO UNITS: codigo " + alunoSiges.getCodigo());
logger.warn("ATENTION STUDENT WITH ZERO UNITS: codigo " + alunoSiges.getCodigo());
StudentImpl studentImpl = (StudentImpl) DaoFactory.getStudentDaoImpl().narrow(student);
removerUnidadesQueDesapareceramNoSiges(year, new HashSet<CourseUnit>(), studentImpl);
consistirTurmasAluno(studentImpl, year, new HashMap<CourseUnit, String>());
removerUnidadesQueDesapareceramNoSiges(year, new HashSet<CourseUnit>(), studentImpl,institutionCode);
consistirTurmasAluno(studentImpl, year, new HashMap<CourseUnit, String>(),institutionCode);
}
else
{
866,7 → 900,7
 
//PASSO 4 - Remover unidades deste ano que nao vem do SIGES e que nao foram adicionadas localmente
//turmas separadas : Seguro a verificação de existencia é feita pelo id da unidade curricular no baco nas verificacoes para remocoes
removerUnidadesQueDesapareceramNoSiges(year, unitsFromSigesPersistentInBaco, studentImpl);
removerUnidadesQueDesapareceramNoSiges(year, unitsFromSigesPersistentInBaco, studentImpl,institutionCode);
 
//PASSO 5 - Consistir Turmas do Aluno com novas cadeiras - Turmas do aluno sem cadeira correspondente sao apagadas, novas sao adicionadas
//Este metodo vai necessitar de obter as turmas das unidades que vieram do SIGES atraves do mapa map_CourseUnit_x_Turma
874,11 → 908,11
//em termos de relacoes com turmas na classe CourseUnitTurma
//deste modo se alguma unidade foi adicionada localmente poderá nao ser removida no PASSO 4 e nao havera correspondente
//para a turma nesta tabela map_CourseUnit_x_Turma logo essas turmas nessas unidades nao serao mechidas, um aviso e emitido
consistirTurmasAluno(studentImpl, year, map_CourseUnit_x_Turma);
consistirTurmasAluno(studentImpl, year, map_CourseUnit_x_Turma,institutionCode);
}
}
 
private void consistirTurmasAluno(StudentImpl student, String year, Map<CourseUnit, String> map_CourseUnit_x_Turma) {
private void consistirTurmasAluno(StudentImpl student, String year, Map<CourseUnit, String> map_CourseUnit_x_Turma, int institutionCode) {
//PASSO 1 Para cada cadeira onde o aluno se encontra inscrito
// obter a turma onde o aluno esta' colocado, se nao existir criar e afectar a turma
//PASSO 2 Colocar o aluno nessa turma se ele ainda lá nao estiver
890,15 → 924,13
Map<CourseUnitTurma,Boolean> turmasAfectadas = new HashMap<CourseUnitTurma,Boolean>();
for(CourseUnit cu: student.getSubscribedUnits())
{
if(cu.getImportYear().equals(year))
if(cu.getImportYear().equals(year) && cu.getInstitutionCode().equals(""+institutionCode))
{
if(cu.getTurmas() == null)
{
cu.setTurmas(new HashSet<CourseUnitTurma>());
}
 
// TODO O CODIGO DA TURMA AQUI VEM ANUL NUM CASO QUALQUER ESQUISITO VER O QUE E NO RUN
 
String codigoTurma = map_CourseUnit_x_Turma.get(cu);
if(student.isLocalUnit(cu) && codigoTurma == null)
{
906,14 → 938,14
//mas foi mantida porque foi adicionada manualmente
//deste modo usaremos a turma antiga
//e nao afetaremos uma turma nao afetada, esta nao sera verificada
String msg = "Atenção turma com código null nao sera verificada e' local unit:" + cu.getCode() + " aluno:" + student.getSigesCode();
String msg = "Atenção turma não encontrada para uma unidade do aluno, A unidade não foi importada do SIGES logo não há turma mas nao sera verificada porque e' uma local unit:" + cu.getCode() + " aluno:" + student.getSigesCode();
serviceLogInfo(msg);
logger.info(msg);
}
else if(codigoTurma == null)
{
//Este caso nao deverá acontecer porque no PASSO 4 da persistencia apenas nao se removem as adicionadas localmente
String msg = "Atenção turma com código null e nao e' local unit:" + cu.getCode() + " aluno:" + student.getSigesCode();
String msg = "Atenção turma não encontrada para uma unidade do aluno. A Unidade não foi importada do SIGES ou vinha com turma NULL, logo nao se sabe a turma do aluno para escolher, e não e' uma unidade LOCALMENTE ADICIONADA logo devia vir do SIGES ou ter sido removida - unit:" + cu.getCode() + " aluno:" + student.getSigesCode();
serviceLogError(msg);
logger.error(msg);
}
943,7 → 975,7
while(iter.hasNext())
{
CourseUnitTurmaImpl turma = iter.next();
if(turma.getCourseUnit().getImportYear().equals(year))
if(turma.getCourseUnit().getImportYear().equals(year) && turma.getCourseUnit().getInstitutionCode().equals(institutionCode+""))
{
if(student.isLocalUnit(turma.getCourseUnit()) && turmasAfectadas.get(turma) == null)
{
1006,12 → 1038,12
* @param unitsFromSigesPersistentInBaco
* @param student
*/
private void removerUnidadesQueDesapareceramNoSiges(String year, Set<CourseUnit> unitsFromSigesPersistentInBaco, StudentImpl student) {
private void removerUnidadesQueDesapareceramNoSiges(String year, Set<CourseUnit> unitsFromSigesPersistentInBaco, StudentImpl student,int institutionCode) {
Iterator<CourseUnit> iterNowUnits = student.getSubscribedUnits().iterator();
while(iterNowUnits.hasNext())
{
CourseUnit cUNow = iterNowUnits.next();
if(cUNow.getImportYear().equals(year))
if(cUNow.getImportYear().equals(year) && cUNow.getInstitutionCode().equals(""+institutionCode))
//Apenas tentamos apagar as unidades do ano corrente.
//Este servico trabalha com unidades importadas do ano que e passado como argumento
//Se importamos unidades desse ano, as dos outros anos nao vem na lista, logo
1104,6 → 1136,22
Set<CourseUnit> unitsFromSigesPersistentInBaco = new HashSet<CourseUnit>();
for (Disciplina disciplina : alunoSiges.getDisciplinasInscrito())
{
if(disciplina.getCdTurma() == null)
{
turmasVindasANullDoSIGES++;
String msg = "(turmasVindasANullDoSIGES) ATENÇÃO ERRO: Existe uma turma a null numa inscrição vinda do SIGES, procurar razão: unidade:" + disciplina.getCodigo() + " estudante:" + student.getSigesCode() + " possivelmente campo de turma em uso é errado, Vamos tentar usar o campo de outra TURMA P, L, TP, P, O, C, E, S";
serviceLogWarn(msg);
logger.warn(msg);
if(disciplina.getOutraTurma() != null)
{
turmasVindasANullDoSIGESEncontradasNoutroCampo++;
disciplina.setCdTurma(disciplina.getOutraTurma());
msg = "Encontrada Outra Turma: Atenção vai ser usada a turma " + disciplina.getOutraTurmaCode();
serviceLogWarn(msg);
logger.warn(msg);
}
}
 
boolean cursoFicticio = isCursoFicticio(disciplina.getCodigoCurso().intValue());
Integer codigoDoCurso = disciplina.getCodigoCurso().intValue();
 
1214,7 → 1262,8
{
for(CourseUnit found: courseUnits)
{
map_CourseUnit_x_Turma.put(found,disciplina.getCdTurma());
String turma = disciplina.getCdTurma();
map_CourseUnit_x_Turma.put(found, turma);
}
 
unitsFromSigesPersistentInBaco.addAll(courseUnits);
1306,6 → 1355,31
 
 
}
 
if(alunoSiges.getTiposAlunosRepresentados() != null)
{
for(Aluno.TipoAluno tipo:alunoSiges.getTiposAlunosRepresentados())
{
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_NORMAL))
student.setTipoAlunoNormal(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_ERASMUS))
student.setTipoAlunoErasmus(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_TRABALHADOR_ESTUDANTE))
student.setTipoAlunoTrabalhadorEstudante(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_BOLSEIRO))
student.setTipoAlunoBolseiro(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_BOMBEIRO))
student.setTipoAlunoBombeiro(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_DEFICIENTE))
student.setTipoAlunoDeficiente(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_DIRIGENTE_ASSOCIATIVO))
student.setTipoAlunoDirigenteAssociativo(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_MILITAR))
student.setTipoAlunoMilitar(true);
if(tipo.getCodigoTipoAluno().equals(Globals.SIGES_TIPO_ALUNO_VASCODAGAMA))
student.setTipoAlunoVascodagama(true);
}
}
}
 
/*private CourseUnit tryFindCourseUnitWithOutTurma(DefaultLogMessages logMessages, String cdDuracao, String codigo,String codigoCurso,String cdLectivo,String cdTurma)
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/oracle/dao/AlunoDao.java
79,7 → 79,13
if (conn == null) {
conn = getCurrentConnection();
}
PreparedStatement catCMD = conn.prepareStatement("SELECT DISTINCT CSE.T_ALUNOS.CD_ALUNO AS CD_ALUNO FROM CSE.T_ALUNOS INNER JOIN (CSE.T_INSCRI INNER JOIN CSE.T_TBDISCIP ON CSE.T_INSCRI.CD_DISCIP = CSE.T_TBDISCIP.CD_DISCIP) ON CSE.T_ALUNOS.CD_ALUNO = CSE.T_INSCRI.CD_ALUNO WHERE (((CSE.T_TBDISCIP.CD_INSTITUIC)=" + codigoInstituicao + ") AND ((CSE.T_INSCRI.CD_LECTIVO)='" + ano + "') AND ((CSE.T_ALUNOS.CD_SITUA_PAR)=1) AND ((CSE.T_INSCRI.CD_STATUS)<>5))");
PreparedStatement catCMD = conn.prepareStatement("SELECT DISTINCT " +
" CSE.T_ALUNOS.CD_ALUNO AS CD_ALUNO " +
"FROM CSE.T_ALUNOS " +
"INNER JOIN (CSE.T_INSCRI INNER JOIN CSE.T_TBDISCIP ON CSE.T_INSCRI.CD_DISCIP = CSE.T_TBDISCIP.CD_DISCIP) ON CSE.T_ALUNOS.CD_ALUNO = CSE.T_INSCRI.CD_ALUNO " +
"WHERE (((CSE.T_TBDISCIP.CD_INSTITUIC)=" + codigoInstituicao + ") AND ((CSE.T_INSCRI.CD_LECTIVO)='" + ano + "') " +
/*AND ((CSE.T_ALUNOS.CD_SITUA_PAR)=1)*/
" AND ((CSE.T_INSCRI.CD_STATUS)<>5))");
ResultSet aReader = catCMD.executeQuery();
while (aReader.next()) {
codigos.add(getDecimal("CD_ALUNO", aReader));
101,12 → 107,19
if (conn == null) {
conn = getCurrentConnection();
}
PreparedStatement catCMD = conn.prepareStatement("SELECT * FROM " + getTable() + " INNER JOIN SIGES.T_INDIVIDUO on SIGES.T_INDIVIDUO.ID_INDIVIDUO = CSE.T_ALUNOS.ID_INDIVIDUO where CD_SITUA_PAR = 1 AND " + getIdColumn() + "=" + codigo);
PreparedStatement catCMD = conn.prepareStatement("SELECT * FROM " + getTable() + " " +
"INNER JOIN SIGES.T_INDIVIDUO on SIGES.T_INDIVIDUO.ID_INDIVIDUO = CSE.T_ALUNOS.ID_INDIVIDUO " +
"where /*CD_SITUA_PAR = 1 AND*/ " + getIdColumn() + "=" + codigo);
ResultSet aReader = catCMD.executeQuery();
 
 
if (aReader.next()) {
Aluno a = load(aReader);
a.disciplinasInscrito = loadDiscilpinasInscrito(codigo, codigoInstituicao, ano);
a.historicos = getHistorico(codigo);
 
obtainTiposAlunoRepresentados(codigo, ano, conn, a);
 
aReader.close();
return a;
}
119,6 → 132,34
return null;
}
 
private void obtainTiposAlunoRepresentados(Integer codigo, String ano, Connection conn, Aluno a) throws SQLException {
PreparedStatement tiposAluno = conn.prepareStatement(
"SELECT DISTINCT CSE.T_TIPALUNO.CD_TIP_ALU AS CD_TIP_ALU, CSE.T_TBTIPALU.DS_TIP_ALU AS DS_TIP_ALU " +
" FROM CSE.T_TIPALUNO " +
" LEFT OUTER JOIN CSE.T_TBTIPALU ON CSE.T_TIPALUNO.CD_TIP_ALU = CSE.T_TBTIPALU.CD_TIP_ALU " +
" where CSE.T_TIPALUNO.CD_ALUNO = " + codigo + " " +
" AND CSE.T_TIPALUNO.CD_LECTIVO = '" + ano + "'");
 
 
ResultSet aReaderTiposAluno = tiposAluno.executeQuery();
a.setTiposAlunosRepresentados(new ArrayList<Aluno.TipoAluno>());
while(aReaderTiposAluno.next())
{
 
Integer cdTipAluno = getDecimal("CD_TIP_ALU",aReaderTiposAluno);
if(cdTipAluno != null && cdTipAluno > 0)
{
Aluno.TipoAluno tipoAluno = new Aluno.TipoAluno();
tipoAluno.setCodigoTipoAluno(""+cdTipAluno);
tipoAluno.setDescTipoAluno(getString("DS_TIP_ALU", aReaderTiposAluno));
a.getTiposAlunosRepresentados().add(tipoAluno);
}
 
}
aReaderTiposAluno.close();
tiposAluno.close();
}
 
/*Mudar a lista para uma lista de Códigos com pelo menos CD_LECTIVO, CD_DISCIP, CD_CURSO, CD_TURMA*/
/*Do lado do Baco as Disciplinas são criadas uma por (CD_LECTIVO, CODIGO, CURSO, SEMESTRE) ficam anexadas todas as turmas encontradas*/
/* O Serviço de Leituras de Sumarios pede apenas os detalhe_aula com codigos de turma igual ao pedido e CD_LECTIVO = actual */
133,14 → 174,23
" CSE.T_INSCRI.CD_TURMA_T AS CD_TURMA, " +
" CSE.T_INSCRI.CD_TURMA_P, " +
" CSE.T_INSCRI.CD_TURMA_L, " +
" CSE.T_INSCRI.CD_TURMA_TP " +
" FROM CSE.T_INSCRI INNER JOIN CSE.T_TBDISCIP ON CSE.T_INSCRI.CD_DISCIP = CSE.T_TBDISCIP.CD_DISCIP" +
" CSE.T_INSCRI.CD_TURMA_TP, " +
" CSE.T_INSCRI.CD_TURMA_S, " +
" CSE.T_INSCRI.CD_TURMA_C, " +
" CSE.T_INSCRI.CD_TURMA_O, " +
" CSE.T_INSCRI.CD_TURMA_E " +
" FROM CSE.T_INSCRI INNER JOIN CSE.T_TBDISCIP ON CSE.T_INSCRI.CD_DISCIP = CSE.T_TBDISCIP.CD_DISCIP " +
//" INNER JOIN CSE.T_CURSOS ON CSE.T_CURSOS.CD_CURSO = CSE.T_INSCRI.CD_CURSO " +
 
" WHERE CSE.T_INSCRI.CD_ALUNO = " + codigo + " " +
" AND" +
" CSE.T_TBDISCIP.CD_INSTITUIC= " + codigoInstituicao + " AND " +
" CSE.T_INSCRI.CD_LECTIVO='" + ano + "' AND " +
" CSE.T_INSCRI.CD_STATUS<>5 AND " +
" (CSE.T_INSCRI.CD_TIPDIS = 2 OR CSE.T_INSCRI.CD_TIPDIS = 1 OR CSE.T_INSCRI.CD_TIPDIS = 6) ");
" (CSE.T_INSCRI.CD_TIPDIS = 2 OR CSE.T_INSCRI.CD_TIPDIS = 1 OR CSE.T_INSCRI.CD_TIPDIS = 6) "
 
 
);
//CD_TIPDISC = 1 Inscricoes normais
//CD_TIPDISC = 2 Nao conta para media
//CD_TIPDISC = 3 Qualitativa
160,6 → 210,42
d.cdTipoDisciplina = getDecimal("CD_TIPDIS", aReader);
d.cdDuracao = getString("CD_DURACAO", aReader);
d.cdTurma = getString("CD_TURMA", aReader);
 
if(getString("CD_TURMA_P", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_P", aReader);
d.outraTurmaCode = "P";
}
else if(getString("CD_TURMA_L", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_L", aReader);
d.outraTurmaCode = "L";
}
else if(getString("CD_TURMA_TP", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_TP", aReader);
d.outraTurmaCode = "TP";
}
else if(getString("CD_TURMA_S", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_S", aReader);
d.outraTurmaCode = "S";
}
else if(getString("CD_TURMA_C", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_C", aReader);
d.outraTurmaCode = "C";
}
else if(getString("CD_TURMA_O", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_O", aReader);
d.outraTurmaCode = "O";
}
else if(getString("CD_TURMA_E", aReader) != null)
{
d.outraTurma = getString("CD_TURMA_E", aReader);
d.outraTurmaCode = "E";
}
disciplinas.add(d);
}
//close the reader
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/oracle/dao/DisciplinaDao.java
4,6 → 4,7
import pt.estgp.estgweb.services.sigesimports.oracle.domain.Disciplina;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasHorario;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasSumario;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasTurma;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
87,7 → 88,7
"CSE.T_INSCRI INNER JOIN CSE.T_TBDISCIP ON CSE.T_INSCRI.CD_DISCIP=CSE.T_TBDISCIP.CD_DISCIP " +
"INNER JOIN CSE.T_CURSOS ON CSE.T_CURSOS.CD_CURSO = CSE.T_INSCRI.CD_CURSO " +
"WHERE "+
" (((((CSE.T_TBDISCIP.CD_INSTITUIC)=" + codigoInstituicao + ") AND ((CSE.T_INSCRI.CD_LECTIVO)='" + ano + "')) AND CSE.T_INSCRI.CD_DURACAO = '" + semestre + "') AND ((CSE.T_INSCRI.CD_STATUS)<>5) AND (CSE.T_INSCRI.CD_TIPDIS = 2 OR CSE.T_INSCRI.CD_TIPDIS = 1))";
" (((((CSE.T_CURSOS.CD_INSTITUIC)=" + codigoInstituicao + ") AND ((CSE.T_INSCRI.CD_LECTIVO)='" + ano + "')) AND CSE.T_INSCRI.CD_DURACAO = '" + semestre + "') AND ((CSE.T_INSCRI.CD_STATUS)<>5) AND (CSE.T_INSCRI.CD_TIPDIS = 2 OR CSE.T_INSCRI.CD_TIPDIS = 1))";
/**\//SO QUEREMOS 1 e 2
* eliminamos tb inscricoes nao regulares STATUS <> 5</>
* As restantes 5 e 6 so servem para depois procurar a Real para atribuir ao aluno
121,6 → 122,7
d.setTipologiasHorario(loadTipologiasHorario(ano,semestre,d.getCodigoCurso(),d.getCodigo(),conn));
d.setTipologiasSumario(loadTipologiasSumarios(ano,semestre,d.getCodigoCurso(),d.getCodigo(),conn));
d.setTipologiasHorarioTrabalho(loadTipologiasHorarioTrabalho(ano,semestre,d.getCodigoCurso(),d.getCodigo(),conn));
d.setTipologiasTdocTurma(loadTipologiasTdocTurma(codigoInstituicao, ano, semestre, d.getCodigoCurso(), d.getCodigo(), conn));
disciplinas.add(d);
}
//close the reader
193,7 → 195,10
ps.close();
return tipologiasHorario;
}
 
 
private TipologiasSumario loadTipologiasSumarios(String ano,
String semestre,
Integer codigoCurso,
270,6 → 275,12
 
/**
* So muda do de cima porque usa a entrada TipoDeOcupação do Horario de Trabalho
* Os códigos que vêm desta query são Tipos de Ocupação necessitam de mapeamento
* ver no app.properties
*
* por vezes vem o código 1 não deve ser confundido com as teóricas que são aulas esse código não é usado no mapeamento
* é descartado por ser pouco descriminatório e não estar na lista dos possiveis
* de sumariar
* @param ano
* @param semestre
* @param codigoCurso
350,5 → 361,46
ps.close();
return tipologiasSumario;
}
 
 
 
private TipologiasTurma loadTipologiasTdocTurma(Integer codigoInstituicao,
String ano,
String semestre,
Integer codigoCurso,
Integer codigoDisciplina,
Connection conn) throws SQLException {
TipologiasTurma tipologiasTurma = new TipologiasTurma();
tipologiasTurma.setTipologias(new ArrayList<TipologiasTurma.TipologiaTurma>());
 
PreparedStatement queryTurmas = conn.prepareStatement
("SELECT DISTINCT CSD.T_DOC_TURMA.CD_DOCENTE AS CD_DOCENTE, CSD.T_DOC_TURMA.CD_TURMA AS CD_TURMA " +
" FROM (CSD.T_DOC_TURMA " +
" INNER JOIN CSE.T_TBDISCIP ON CSE.T_TBDISCIP.CD_DISCIP = CSD.T_DOC_TURMA.CD_DISCIP) " +
" WHERE " +
" CSE.T_TBDISCIP.CD_DISCIP = " + codigoDisciplina + " " +
" AND CSD.T_DOC_TURMA.CD_CURSO = '" + codigoCurso + "'" +
" AND CSD.T_DOC_TURMA.CD_DURACAO = '" + semestre + "'" +
" AND CSD.T_DOC_TURMA.CD_LECTIVO='" + ano + "'" +
" AND CSE.T_TBDISCIP.CD_INSTITUIC=" + codigoInstituicao + " "
);
ResultSet turmas = queryTurmas.executeQuery();
while(turmas.next())
{
TipologiasTurma.TipologiaTurma th = new TipologiasTurma.TipologiaTurma();
th.setCdTurma(getString("CD_TURMA",turmas));
th.setCdDocente(getDecimal("CD_DOCENTE", turmas));
if(th.getCdTurma() != null && th.getCdDocente() > 0)
tipologiasTurma.getTipologias().add(th);
else
logger.error("Tipologia invalida encontrada na disciplina: (" + codigoDisciplina + "): " + th.toString());
 
}
turmas.close();
queryTurmas.close();
 
 
return tipologiasTurma;
}
}
 
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/oracle/dao/DocenteDao.java
205,6 → 205,26
//d.cdTipologia = getDecimal("CD_TIPO_AULA", aReader);
//d.codigoFuncaoDocente = getDecimal("CD_FUNCAO_DOC",aReader);
disciplinas.add(d);
 
PreparedStatement queryTurmas = conn.prepareStatement
("SELECT DISTINCT CSD.T_DOC_TURMA.CD_TURMA AS CD_TURMA " +
" FROM (CSD.T_DOC_TURMA " +
" INNER JOIN CSE.T_TBDISCIP ON CSE.T_TBDISCIP.CD_DISCIP = CSD.T_DOC_TURMA.CD_DISCIP) " +
" WHERE " +
" CSE.T_TBDISCIP.CD_DISCIP = " + d.codigo + " " +
" AND CSD.T_DOC_TURMA.CD_CURSO = '" + d.codigoCurso + "'" +
" AND CSD.T_DOC_TURMA.CD_DURACAO = '" + d.cdDuracao + "'" +
" AND CSD.T_DOC_TURMA.CD_LECTIVO='" + ano + "'" +
" AND CSE.T_TBDISCIP.CD_INSTITUIC=" + codigoInstituicao + " " +
" AND CSD.T_DOC_TURMA.CD_DOCENTE = " + codigo );
ResultSet turmas = queryTurmas.executeQuery();
while(turmas.next())
{
d.turmasDocente.add(turmas.getString("CD_TURMA"));
}
turmas.close();
queryTurmas.close();
 
}
//close the reader
aReader.close();
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/oracle/domain/Disciplina.java
1,5 → 1,7
package pt.estgp.estgweb.services.sigesimports.oracle.domain;
 
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 07/01/16.
*/
13,8 → 15,19
public String cdDuracao;
public Integer codigoInstituicao;
public String cdTurma;
public String outraTurma;
public String outraTurmaCode;
 
public String codigoTipoAlunoT;
public String codigoTipoAlunoTP;
 
public String descTipoAlunoT;
public String descTipoAlunoTP;
 
 
public ArrayList<String> turmasDocente = new ArrayList<String>();
 
 
public String nome;
public String nomeCurso;
public String grauCurso;
57,12 → 70,55
public TipologiasHorario tipologiasHorario;
public TipologiasSumario tipologiasSumario;
public TipologiasSumario tipologiasHorarioTrabalho;
public TipologiasTurma tipologiasTdocTurma;
 
public Disciplina()
{
 
}
 
 
public TipologiasTurma getTipologiasTdocTurma() {
return tipologiasTdocTurma;
}
 
public void setTipologiasTdocTurma(TipologiasTurma tipologiasTdocTurma) {
this.tipologiasTdocTurma = tipologiasTdocTurma;
}
 
 
public String getCodigoTipoAlunoT() {
return codigoTipoAlunoT;
}
 
public void setCodigoTipoAlunoT(String codigoTipoAlunoT) {
this.codigoTipoAlunoT = codigoTipoAlunoT;
}
 
public String getCodigoTipoAlunoTP() {
return codigoTipoAlunoTP;
}
 
public void setCodigoTipoAlunoTP(String codigoTipoAlunoTP) {
this.codigoTipoAlunoTP = codigoTipoAlunoTP;
}
 
public String getDescTipoAlunoT() {
return descTipoAlunoT;
}
 
public void setDescTipoAlunoT(String descTipoAlunoT) {
this.descTipoAlunoT = descTipoAlunoT;
}
 
public String getDescTipoAlunoTP() {
return descTipoAlunoTP;
}
 
public void setDescTipoAlunoTP(String descTipoAlunoTP) {
this.descTipoAlunoTP = descTipoAlunoTP;
}
 
public void setCodigo(Integer codigo) {
this.codigo = codigo;
}
183,6 → 239,22
this.grauCurso = grauCurso;
}
 
public String getOutraTurma() {
return outraTurma;
}
 
public void setOutraTurma(String outraTurma) {
this.outraTurma = outraTurma;
}
 
public String getOutraTurmaCode() {
return outraTurmaCode;
}
 
public void setOutraTurmaCode(String outraTurmaCode) {
this.outraTurmaCode = outraTurmaCode;
}
 
@Override
public String toString() {
return "Disciplina{" +
192,6 → 264,7
", cdDuracao='" + cdDuracao + '\'' +
", codigoInstituicao=" + codigoInstituicao +
", cdTurma='" + cdTurma + '\'' +
", cdOutraTurma='" + outraTurma + '\'' +
", nome='" + nome + '\'' +
", nomeCurso='" + nomeCurso + '\'' +
", grauCurso='" + grauCurso + '\'' +
200,4 → 273,6
", cdTipologia=" + cdTipologia +
'}';
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/oracle/domain/TipologiasTurma.java
New file
0,0 → 1,52
package pt.estgp.estgweb.services.sigesimports.oracle.domain;
 
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 08/03/16.
*/
public class TipologiasTurma
{
 
private ArrayList<TipologiaTurma> tipologias;
 
public ArrayList<TipologiaTurma> getTipologias()
{
return tipologias;
}
 
public void setTipologias(ArrayList<TipologiaTurma> tipologias) {
this.tipologias = tipologias;
}
 
public static class TipologiaTurma
{
String cdTurma;
Integer cdDocente;
 
public String getCdTurma() {
return cdTurma;
}
 
public void setCdTurma(String cdTurma) {
this.cdTurma = cdTurma;
}
 
public Integer getCdDocente() {
return cdDocente;
}
 
public void setCdDocente(Integer cdDocente) {
this.cdDocente = cdDocente;
}
 
 
@Override
public String toString() {
return "TipologiaHorario{" +
"cdTurma='" + cdTurma + '\'' +
", cdDocente=" + cdDocente +
'}';
}
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/oracle/domain/Aluno.java
21,6 → 21,7
public String usernameNetpa;
public ArrayList<Disciplina> disciplinasInscrito;
public ArrayList<AlunoHistorico> historicos;
public ArrayList<TipoAluno> tiposAlunosRepresentados;
 
public Aluno()
{
29,6 → 30,14
//
}
 
public ArrayList<TipoAluno> getTiposAlunosRepresentados() {
return tiposAlunosRepresentados;
}
 
public void setTiposAlunosRepresentados(ArrayList<TipoAluno> tiposAlunosRepresentados) {
this.tiposAlunosRepresentados = tiposAlunosRepresentados;
}
 
public Integer getCodigo() {
return codigo;
}
80,4 → 89,27
public ArrayList<AlunoHistorico> getHistoricos() {
return historicos;
}
 
public static class TipoAluno
{
public String codigoTipoAluno;
public String descTipoAluno;
 
 
public String getCodigoTipoAluno() {
return codigoTipoAluno;
}
 
public void setCodigoTipoAluno(String codigoTipoAluno) {
this.codigoTipoAluno = codigoTipoAluno;
}
 
public String getDescTipoAluno() {
return descTipoAluno;
}
 
public void setDescTipoAluno(String descTipoAluno) {
this.descTipoAluno = descTipoAluno;
}
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportTeachersService.java
152,7 → 152,7
 
try
{
persist(d, t, newUser,year,logMessages);
persist(d, t, newUser,year,logMessages,institutionCode);
}
catch (Exception e)
{
283,7 → 283,7
* @param institutionCode
* @param codigos
*/
private void removerUnidadesDosDesaparecidosDoSiges(String year, int institutionCode, List<Integer> codigos) {
private void removerUnidadesDosDesaparecidosDoSiges(String year, int institutionCode, List<Integer> codigos) {
String msgS;
List<Integer> codesInBaco = DaoFactory.getTeacherDaoImpl().findAllSigesCodesYear(year,institutionCode);
codesInBaco.removeAll(codigos);
305,7 → 305,7
professoresDesaparecidosDoSigesNesteAno++;
Teacher t = DaoFactory.getTeacherDaoImpl().loadBySigesCode(c);
TeacherImpl teacherImpl = (TeacherImpl) DaoFactory.getTeacherDaoImpl().narrow(t);
removerUnidadesQueDesapareceramNoSiges(year, teacherImpl, new HashSet<CourseUnit>());
removerUnidadesQueDesapareceramNoSiges(year, teacherImpl, new HashSet<CourseUnit>(),institutionCode);
//consistirTurmasAluno(studentImpl, year, new HashMap<CourseUnit, String>());
}
}
435,7 → 435,7
* @param teacher teacher
* @throws Exception .
*/
private void persist(Docente teacherSiges, Teacher teacher, boolean newUser, String year,DefaultLogMessages logmessages) throws Exception
private void persist(Docente teacherSiges, Teacher teacher, boolean newUser, String year,DefaultLogMessages logmessages,int institutionCode) throws Exception
{
String msgS;
try
451,7 → 451,7
/******Logging****/
 
TeacherImpl tImpl = (TeacherImpl) DaoFactory.getTeacherDaoImpl().narrow(teacher);
removerUnidadesQueDesapareceramNoSiges(year, tImpl, new HashSet<CourseUnit>());
removerUnidadesQueDesapareceramNoSiges(year, tImpl, new HashSet<CourseUnit>(),institutionCode);
}
else
{
471,7 → 471,7
//PASSO 3
adicionarCadeirasNovasAoDocente(tImpl, unitsFromSigesPersistentInBaco);
//PASSO 4
removerUnidadesQueDesapareceramNoSiges(year, tImpl, unitsFromSigesPersistentInBaco);
removerUnidadesQueDesapareceramNoSiges(year, tImpl, unitsFromSigesPersistentInBaco,institutionCode);
 
}
 
480,19 → 480,18
catch (Exception e)
{
logger.error(e, e);
List<String> emails = new ArrayList<String>();
emails.add(ConfigProperties.getProperty("admin.email"));
List<String> emails = ConfigProperties.getListValues("admin.email");
List<String> arguments = new ArrayList<String>();
String cause = e.getCause() == null ? "" : e.getCause().toString();
arguments.add((e.toString() + "\n" + cause).replace("\n","<br/>"));
Email email = new Email("Erro de importa��o de professores",emails,"baco@estgp.pt","messageToAdmin_pt.txt",arguments);
Email email = new Email("Erro de importacao de professores",emails,"baco@estgp.pt","messageToAdmin_pt.txt",arguments);
new SendEmailService().sendEmail(email);
throw e;
}
 
}
 
private void removerUnidadesQueDesapareceramNoSiges(String year, Teacher teacher, Set<CourseUnit> units)
private void removerUnidadesQueDesapareceramNoSiges(String year, Teacher teacher, Set<CourseUnit> units,int institutionCode)
{
//Remover unidades deste ano que nao vem do SIGES e que nao foram adicionadas localmente
Iterator<CourseUnit> iterNowUnits = teacher.getTeachedUnits().iterator();
500,7 → 499,7
while(iterNowUnits.hasNext())
{
CourseUnit cUNow = iterNowUnits.next();
if(cUNow.getImportYear().equals(year))
if(cUNow.getImportYear().equals(year) && cUNow.getInstitutionCode().equals(institutionCode+""))
{
//Apenas tentamos apagar as unidades do ano corrente.
//Este servico trabalha com unidades importadas do ano que e passado como argumento
672,13 → 671,20
//na criacao de questionarios é natural que falhe alguma coisa por haver aqui unidades a mais
//por isso devera ser ai feita a verificacao destes casos
boolean separateTurmas = ImportCourseService.loadCourseYearTurmasPolicy(disciplina.getCodigoCurso(), year, logmessages, this);
/*
este procedimento requer que a turma venha do siges, neste momento nao vem
if(separateTurmas)
loadedunits = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUniqueWithTurma("" + disciplina.getCodigo(), "" + disciplina.getCodigoCurso(), "" + disciplina.getCdDuracao(), "" + disciplina.getCdLectivo(),disciplina.getCdTurma());
else
loadedunits = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + disciplina.getCodigo(), "" + disciplina.getCodigoCurso(), "" + disciplina.getCdDuracao(), "" + disciplina.getCdLectivo());
*/
 
//este procedimento requer que a turma venha do siges, neste momento nao vem
//Este procedimento foi colocado por mim a 6 de Junho para que os questionarios tenham os profs certos nas disciplinas
//e não em duplicado, daqui para baixo o código nunca compara com separateTurmas, o mapa apenas é acedido aqui
//porque daqui para baixo uma vez carregadas as turmas persistentes do SIGES apenas o id é comparado para ver se fica ou se é removida
//Vamos apenas ter de verificar que o código de turma vem na associação do docente à turma.
//NAO DA A TURMA NUNCA VEM DO SIGENS PARA NAO DUPLICAR TURMAS NO JOIN
//RESOVE-SE NA ATRIBUICAO DE RESPOSTAS DOS QUESTINARIOS SO SE METE O QUE TEM SUMARIO SE O CURSO FOR DE TURMAS
//SEPARADAS
//if(separateTurmas)
// loadedunits = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUniqueWithTurma("" + disciplina.getCodigo(), "" + disciplina.getCodigoCurso(), "" + disciplina.getCdDuracao(), "" + disciplina.getCdLectivo(),disciplina.getCdTurma());
//else
// loadedunits = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + disciplina.getCodigo(), "" + disciplina.getCodigoCurso(), "" + disciplina.getCdDuracao(), "" + disciplina.getCdLectivo());
 
loadedunits = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + disciplina.getCodigo(), "" + disciplina.getCodigoCurso(), "" + disciplina.getCdDuracao(), "" + disciplina.getCdLectivo());
/*******Logging************************/
if(loadedunits.size() > 1 && !separateTurmas)
/branches/v3/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportCourseService.java
19,6 → 19,7
import pt.estgp.estgweb.services.sigesimports.oracle.domain.Disciplina;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasHorario;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasSumario;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasTurma;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.utl.ist.berserk.logic.serviceManager.IService;
257,7 → 258,7
* @param logMessages
* @return
*/
protected static boolean loadCourseYearTurmasPolicy(int codigoDoCurso,String year,DefaultLogMessages logMessages,ServiceJob service) {
public static boolean loadCourseYearTurmasPolicy(int codigoDoCurso,String year,DefaultLogMessages logMessages,ServiceJob service) {
 
Boolean turmasSeparated = courseYearTurmasPolicy.get(codigoDoCurso + "-" + year);
if(turmasSeparated != null)
432,7 → 433,7
else
c.setCdTurma("");
c.setName(d.getNome());
c.setInstitutionCode("" + institutionCode);
c.setInstitutionCode("" + d.getCodigoInstituicao());//MUDADO AQUI
c.setCode("" + d.getCodigo().intValue());
c.setCourseCode("" + d.getCodigoCurso());
c.setCourseName("" + d.getNomeCurso());
453,6 → 454,18
if(t == null)
t = new CourseUnitImpl.Tipologias();
 
t.setTipologiasTdocTurma(new ArrayList<CourseUnitImpl.Tipologia>());
for(TipologiasTurma.TipologiaTurma tipologiaTurma : d.getTipologiasTdocTurma().getTipologias())
{
CourseUnitImpl.Tipologia tipoSum = new CourseUnitImpl.Tipologia();
tipoSum.setOcorrencias(1);
tipoSum.setDsTipologia("Aulas");
tipoSum.setCdTurma(tipologiaTurma.getCdTurma());
tipoSum.setCdDocente("" + tipologiaTurma.getCdDocente());
tipoSum.setCdTipologia("1");
tipoSum.setTdocturma(true);
t.getTipologiasTdocTurma().add(tipoSum);
}
t.setTipologiasSumarios(new ArrayList<CourseUnitImpl.Tipologia>());
for(TipologiasSumario.TipologiaSumario tipologiaSumario : d.getTipologiasSumario().getTipologias())
{
/branches/v3/impl/src/java/pt/estgp/estgweb/services/users/LoadUsersService.java
66,7 → 66,17
return null;
return UserView.getViews(users);
}
public List<UserView> LoadTeachersWithUnitsInLast3Years() throws ServiceException
{
//area no more implemented
List<Long> usersIds = DaoFactory.getTeacherDaoImpl().loadByAreaWithUnitsInLast3Years(DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear());
if(usersIds == null)
return null;
return UserView.getViewsFromIds(usersIds);
}
 
 
 
public List<UserView> load(String role) throws ServiceException
{
List<User> users = DaoFactory.getUserDaoImpl().loadRoleUsers(role);
/branches/v3/impl/src/java/pt/estgp/estgweb/services/users/CreateUserService.java
6,10 → 6,10
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.common.CommonServicesManager;
import pt.estgp.estgweb.services.expceptions.AlreadyExistsException;
import pt.estgp.estgweb.services.expceptions.FieldException;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.common.CommonServicesManager;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.Date;
60,4 → 60,18
else
logger.info(userSession.getUser().getName() + " - Creating user:" + user.getUsername() + " " + user.getName());
}
 
 
public User addRole2User(Long userId, String role, UserSession userSession) throws ServiceException
{
User u = DaoFactory.getUserDaoImpl().load(userId);
u.addRole(role);
return u;
}
public User removeRole2User(Long userId, String role, UserSession userSession) throws ServiceException
{
User u = DaoFactory.getUserDaoImpl().load(userId);
u.removeRole(role);
return u;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/users/UserRoleConfigService.java
179,6 → 179,10
"user.role.questionarios.admin=Questionários - Super Administrador\n" +
"user.role.questionarios.gerais=Questionários - Permissões Básicas (necessário)\n" +
"user.role.servicesPrograms=Gestão de Programas Curriculares\n" +
"user.role.servicesStudiesPlans=Gestão de Planos de Estudos\n" +
"user.role.servicesCoursesManagement=Gestão de Cursos\n" +
"user.role.event_class_manager=Gestão de Classes de Eventos\n" +
"user.role.event_manager_nfc=Gestão de Eventos do Nucleo de Formacao Continua\n" +
"user.role.administrativeCouncil=Membro da Direcção\n" +
"user.role.administrativeCouncil.director=Director\n" +
"user.role.administrativeCouncil.vice=Vice Director\n" +
/branches/v3/impl/src/java/pt/estgp/estgweb/services/events/EventsService.java
New file
0,0 → 1,194
package pt.estgp.estgweb.services.events;
 
import jomm.utils.FilesUtils;
import org.apache.log4j.Logger;
import org.apache.struts.upload.FormFile;
import pt.estgp.estgweb.domain.EventClass;
import pt.estgp.estgweb.domain.EventFormacoes;
import pt.estgp.estgweb.domain.EventGeneric;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.web.exceptions.NotAuthorizedException;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.IOException;
 
/**
* Created by jorgemachado on 04/10/16.
*/
public class EventsService implements IService
{
private static final Logger logger = Logger.getLogger(EventsService.class);
 
public void save(EventClass eventClass, UserSession userSession)
{
if(eventClass.getId() <= 0)
{
DaoFactory.getEventClassDaoImpl().save(eventClass);
}
else
{
EventClass persistent = DaoFactory.getEventClassDaoImpl().load(eventClass.getId());
persistent.setName(eventClass.getName());
persistent.setDescription(eventClass.getDescription());
persistent.setManagersRole(eventClass.getManagersRole());
persistent.setEventosFormacoes(eventClass.isEventosFormacoes());
persistent.setEventosGenericos(eventClass.isEventosGenericos());
}
}
 
public void delete(long eventClassId, UserSession userSession) throws NotAuthorizedException {
 
EventClass persistent = DaoFactory.getEventClassDaoImpl().load(eventClassId);
if(persistent.getEvents().size() > 0)
{
throw new NotAuthorizedException("Existem eventos nesta classe");
}
else
{
DaoFactory.getEventClassDaoImpl().delete(persistent);
}
}
 
public void saveEvent(long eventClassId,EventGeneric event, FormFile flyer, UserSession userSession)
{
System.out.println("Serviço de gravação de eventos OK");
System.out.println(event.getDataAberturaFormulario());
System.out.println(event.getDataFechoFormulario());
System.out.println(event.getDataPublicacao());
System.out.println(event.getDataInicio());
EventClass eventClass;
EventGeneric eventPersistent;
if(event.getId() <= 0)
{
eventClass = DaoFactory.getEventClassDaoImpl().load(eventClassId);
event.setEventClass(eventClass);
event.setOwner(userSession.getUser());
if(event instanceof EventFormacoes)
{
DaoFactory.getEventFormacoesDaoImpl().save((EventFormacoes) event);
}
else if(event instanceof EventGeneric)
{
DaoFactory.getEventGenericDaoImpl().save(event);
}
updateFlyer(event, flyer, userSession);
eventPersistent = event;
}
else
{
eventPersistent = DaoFactory.getEventGenericDaoImpl().load(event.getId());
eventClass = eventPersistent.getEventClass();
updateEventFields(event,eventPersistent,flyer,userSession);
}
//todo falta docentes apenas depois de estar o evento gravado por razões de já haver unidade
logger.info("Propiedades do Evento Gravadas e Flyer actualizado, vamos iniciar operações de actividade curricular");
//EVENTO SALVO
 
}
 
private void updateEventFields(EventGeneric event, EventGeneric eventPersistent,FormFile flyer,UserSession userSession)
{
eventPersistent.setAtivo(event.isAtivo());
 
//CONTROLO
eventPersistent.setDataPublicacao(event.getDataPublicacao());
eventPersistent.setDataAberturaFormulario(event.getDataAberturaFormulario());
eventPersistent.setDataFechoFormulario(event.getDataFechoFormulario());
eventPersistent.setCategory(event.getCategory());
eventPersistent.setSubCategory(event.getSubCategory());
eventPersistent.setRegisteredUsersOnly(event.isRegisteredUsersOnly());
 
 
eventPersistent.setTitle(event.getTitle());
eventPersistent.setDescription(event.getDescription());
eventPersistent.setObservacoes(event.getObservacoes());
eventPersistent.setLocais(event.getLocais());
eventPersistent.setDataInicio(event.getDataInicio());
eventPersistent.setPreInformation(event.getPreInformation());
eventPersistent.setAfterRegisterInformation(event.getAfterRegisterInformation());
 
updateFlyer(eventPersistent, flyer, userSession);
 
 
eventPersistent.setDataNascimento(event.isDataNascimento());
eventPersistent.setEmpresa(event.isEmpresa());
eventPersistent.setEscolaridade(event.isEscolaridade());
eventPersistent.setProfissao(event.isProfissao());
eventPersistent.setSexo(event.isSexo());
eventPersistent.setTelefone1(event.isTelefone1());
eventPersistent.setTelefone2(event.isTelefone2());
eventPersistent.setPais(event.isPais());
eventPersistent.setMorada(event.isMorada());
eventPersistent.setNif(event.isNif());
eventPersistent.setBi(event.isBi());
 
if(event instanceof EventFormacoes)
{
EventFormacoes eventFormacoes = (EventFormacoes) event;
EventFormacoes eventPersistentFormacoes = (EventFormacoes) eventPersistent;
 
eventPersistentFormacoes.setReferencia(eventFormacoes.getReferencia());
eventPersistentFormacoes.setUnidadeOrganica(eventFormacoes.getUnidadeOrganica());
eventPersistentFormacoes.setLocalDeRealizacao(eventFormacoes.getLocalDeRealizacao());
eventPersistentFormacoes.setDominio(eventFormacoes.getDominio());
eventPersistentFormacoes.setOutroDominio(eventFormacoes.getOutroDominio());
eventPersistentFormacoes.setDestinatarios(eventFormacoes.getDestinatarios());
eventPersistentFormacoes.setConteudos(eventFormacoes.getConteudos());
 
//CONTROLO FINANCEIRO
eventPersistentFormacoes.setStatus(eventFormacoes.getStatus());
eventPersistentFormacoes.setNumeroVagas(eventFormacoes.getNumeroVagas());
eventPersistentFormacoes.setDuracaoHoras(eventFormacoes.getDuracaoHoras());
eventPersistentFormacoes.setEcts(eventFormacoes.getEcts());
eventPersistentFormacoes.setDiasDuracao(eventFormacoes.getDiasDuracao());
eventPersistentFormacoes.setCustoFormacao(eventFormacoes.getCustoFormacao());
eventPersistentFormacoes.setPrecoFormando(eventFormacoes.getPrecoFormando());
eventPersistentFormacoes.setPercentagemMinimaLucro(eventFormacoes.getPercentagemMinimaLucro());
}
}
 
private void updateFlyer(EventGeneric eventPersistent, FormFile flyer, UserSession userSession) {
if(flyer != null && flyer.getFileSize() > 0)
{
RepositoryService repositoryService = new RepositoryService();
if(eventPersistent.getFlyerRepositoryStream() != null && eventPersistent.getFlyerRepositoryStream().trim().length() > 0)
{
try {
repositoryService.updateRepositoryFile(
eventPersistent.getFlyerRepositoryStream(),
flyer.getInputStream(),
flyer.getContentType(),
FilesUtils.getExtension(flyer.getFileName()),
flyer.getFileSize(),
flyer.getFileName(),
"Flyer de formacao " + eventPersistent.getTitle(),
ResourceAccessControlEnum.publicDomain
);
} catch (IOException e) {
logger.error(e,e);
}
}
else
{
try {
String repositoryIdentifier = repositoryService.storeRepositoryFile(
flyer.getInputStream(),
flyer.getContentType(),
FilesUtils.getExtension(flyer.getFileName()),
flyer.getFileSize(),
flyer.getFileName(),
"Flyer de formacao " + eventPersistent.getTitle(),
ResourceAccessControlEnum.publicDomain,
userSession
);
eventPersistent.setFlyerRepositoryStream(repositoryIdentifier);
} catch (IOException e) {
logger.error(e,e);
}
}
}
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/questionarios/pedagogico/TeachersAnswersProcessor.java
New file
0,0 → 1,91
package pt.estgp.estgweb.services.questionarios.pedagogico;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.QuestionarioImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
 
/**
* Created by jorgemachado on 28/05/16.
*/
public class TeachersAnswersProcessor extends ServiceJob {
 
private static Logger logger = Logger.getLogger(TeachersAnswersProcessor.class);
/**
*
* @return
* @throws Throwable
*/
@Override
protected ILogMessages runJobServiceTask() throws Throwable
{
 
DefaultLogMessages logMessages = new DefaultLogMessages();
long questionarioId = Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
 
 
//Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre
 
/**logging**/
String msg = "Starting running service answers generation for questionario: " + q.getId() + " - " + q.getiAnswersProcessorClass().getTitle();
serviceLogInfo(msg);
logger.info(msg);
/**logging**/
 
/*List<String> newCourseCodesList = new ArrayList<String>();
int count = 0;
int totalCourses = coursesList.length;
for(String courseStrId: coursesList)
{
count++;*/
try{
/*Long courseLong = Long.parseLong(courseStrId);
/** logging **/
//msg = "Loading Course BACO ID: " + courseStrId;
//serviceLogInfo(msg);
//logger.info(msg);
/** logging **/
 
 
 
/** COMMIT OPERATION **/
//setProgress((int)((((float)count)/((float)totalCourses))*100.0f));
//commitPartially();
//DaoFactory.getQuestionarioDaoImpl().update(q);
/** COMMIT OPERATION **/
}
catch(Throwable t)
{
logger.error(t,t);
serviceLogError(t.toString(),t);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.ERROR,t.toString()));
}
 
//}
 
 
//removeUnselectedCourses(q, newCourseCodesList);
 
/** COMMIT OPERATION **/
setProgress(100);
commitPartially();
DaoFactory.getQuestionarioDaoImpl().update(q);
/** COMMIT OPERATION **/
 
//TODO FALTA VERIFICAR SE HA COISAS DEPENDENTES DO COURSES_ASSIGNED TEM DE MUDAR PARA OU ANSWERS ASSIGNED
//OIU ENTAO SO DEPOIS DO REVERT E QUE PODEM VOLTAR A ATRIBUIR RESPOSTAS E ALTERAR SELECAO DE CURSOS
 
msg = "Set courses state as " + QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.name();
serviceLogInfo(msg);
logger.info(msg);
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED);
commitPartially();
 
return logMessages;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/questionarios/pedagogico/AssignAnswersJobService.java
5,10 → 5,6
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.jobs.JobDeamon;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.web.exceptions.NotAuthorizedException;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
19,12 → 15,21
/**
* Created by jorgemachado on 22/03/16.
*/
public class AssignAnswersJobService extends ServiceJob implements IService
public class AssignAnswersJobService implements IService
{
 
public static final Logger logger = Logger.getLogger(AssignAnswersJobService.class);
 
 
/**
* CRIAR O JOB PARA O RUNNER
*
* @param questionarioId
* @param session
* @param questionarioCleared
* @return
* @throws NotAuthorizedException
*/
public QuestionarioImpl runJobAssignAnswers(long questionarioId, UserSession session, QuestionarioImpl questionarioCleared) throws NotAuthorizedException {
 
if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_START_ASSIGN_ANSWERS.name()) )
32,22 → 37,30
throw new NotAuthorizedException("Nao tem autorização para atribuir respostas ao questionario " + questionarioId);
}
 
/*******VERIFICACAO DE RESPOSTAS*********/
long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
if(respostas > 0)
{
logger.warn("Vai falhar tem respostas, deixar correr para avisar o user no log");
}
else
{
//Nao muda de estado porque pode sempre gerar as respostas quando está em estado COURSES_ASSIGNED
( questionarioCleared).setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ASSIGNING_ANSWERS);
}
//CRIAR ATIVIDADE DE ATRIBUICAO DE RESPOSTAS
 
//Nao muda de estado porque pode sempre gerar as respostas quando está em estado COURSES_ASSIGNED
( questionarioCleared).setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ASSIGNING_ANSWERS);
 
 
Set<JobServiceTaskParameter> paramsJob = new HashSet<JobServiceTaskParameter>();
 
 
JobServiceTaskParameterImpl paramJob = DomainObjectFactory.createJobServiceTaskParameterImpl();
paramJob.setName(ServiceJob.JOB_questionario_id_KEY);
paramJob.setDescription("ID do questionário");
paramJob.setObject("" + questionarioId);
paramsJob.add(paramJob);
 
JobServiceTask job = JobDeamon.createServiceJob(AssignAnswersJobService.class, session.getUser(), paramsJob,
JobServiceTask job = JobDeamon.createServiceJob(questionarioCleared.getiAnswersProcessorClass().getJobServiceTaskAnswersProcessor(), session.getUser(), paramsJob,
"Service: Atribuição de Respostas a um questionário Pedagógico");
questionarioCleared.setAnswerGenerationTaskId(job.getId());
 
56,78 → 69,6
 
 
 
/**
*
* @return
* @throws Throwable
*/
@Override
protected ILogMessages runJobServiceTask() throws Throwable
{
 
DefaultLogMessages logMessages = new DefaultLogMessages();
long questionarioId = Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
 
 
//Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre
 
/**logging**/
String msg = "Starting running service answers generation for questionario: " + q.getId() + " - " + q.getiAnswersProcessorClass().getTitle();
serviceLogInfo(msg);
logger.info(msg);
/**logging**/
 
/*List<String> newCourseCodesList = new ArrayList<String>();
int count = 0;
int totalCourses = coursesList.length;
for(String courseStrId: coursesList)
{
count++;*/
try{
/*Long courseLong = Long.parseLong(courseStrId);
/** logging **/
//msg = "Loading Course BACO ID: " + courseStrId;
//serviceLogInfo(msg);
//logger.info(msg);
/** logging **/
 
 
 
/** COMMIT OPERATION **/
//setProgress((int)((((float)count)/((float)totalCourses))*100.0f));
//commitPartially();
//DaoFactory.getQuestionarioDaoImpl().update(q);
/** COMMIT OPERATION **/
}
catch(Throwable t)
{
logger.error(t,t);
serviceLogError(t.toString(),t);
logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.ERROR,t.toString()));
}
 
//}
 
 
//removeUnselectedCourses(q, newCourseCodesList);
 
/** COMMIT OPERATION **/
setProgress(100);
commitPartially();
DaoFactory.getQuestionarioDaoImpl().update(q);
/** COMMIT OPERATION **/
 
//TODO FALTA VERIFICAR SE HA COISAS DEPENDENTES DO COURSES_ASSIGNED TEM DE MUDAR PARA OU ANSWERS ASSIGNED
//OIU ENTAO SO DEPOIS DO REVERT E QUE PODEM VOLTAR A ATRIBUIR RESPOSTAS E ALTERAR SELECAO DE CURSOS
 
msg = "Set courses state as " + QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.name();
serviceLogInfo(msg);
logger.info(msg);
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED);
commitPartially();
 
return logMessages;
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/questionarios/pedagogico/AnswersAlunosProcessor.java
New file
0,0 → 1,411
package pt.estgp.estgweb.services.questionarios.pedagogico;
 
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.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.web.exceptions.NotAuthorizedException;
 
import java.util.*;
 
 
/**
* Created by jorgemachado on 28/05/16.
*/
public class AnswersAlunosProcessor extends ServiceJob {
 
int unidadesNaoUtilizadas = 0;
int unidadesUtilizadas = 0;
int unidadesMarcadas = 0;
int unidadesNaoVistasProf = 0;
int unidadesNaoVistasAlunos = 0;
int cursosUtilizados = 0;
int respostasRequisitadas = 0;
 
private static Logger logger = Logger.getLogger(AnswersAlunosProcessor.class);
 
 
/**
* ############# JOB TASK ############
* ############# JOB TASK ############
* @return
* @throws Throwable
*/
@Override
protected ILogMessages runJobServiceTask() throws Throwable
{
 
long questionarioId = Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
DefaultLogMessages logMessages = new DefaultLogMessages();
 
 
/*****VERIFICACAO DE RESPOSTAS********/
long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
if(respostas > 0)
{
logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
"Operação não permitida, Existem Respostas"));
logger.warn(logMessages.getLastMessage());
serviceLogError(logMessages.getLastMessage());
throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos num questioário com respostas");
}
 
 
unidadesNaoUtilizadas = 0;
unidadesUtilizadas = 0;
unidadesMarcadas = 0;
unidadesNaoVistasProf = 0;
unidadesNaoVistasAlunos = 0;
cursosUtilizados = 0;
respostasRequisitadas = 0;
 
 
 
QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
 
 
//Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre
 
/**logging**/
String msg = "Starting running service answers generation for questionario: " + q.getId() + " - " + q.getiAnswersProcessorClass().getTitle();
serviceLogInfo(msg);
logger.info(msg);
 
List<Long> cursosAfetosIds = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().findCursosAfetosIds(questionarioId);
int count = 0;
 
 
UpdateCoursesAndUnitsJobService.revertAllRespostasCandidatas(questionarioId, this);
 
for(Long cursoAfetoId : cursosAfetosIds)
{
/** COMMIT OPERATION **/
count++;
cursosUtilizados++;
setProgress((int)((((float)count)/((float)cursosAfetosIds.size()))*100.0f));
commitPartially();
/** COMMIT OPERATION **/
 
 
QuestionarioPedagogicoCursoAfeto cu = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().get(cursoAfetoId);
msg = "(+) Iniciando atribuição de respostas de alunos para o curso " + cu.getNome() + " (" + cu.getCodigoCurso() + ") escola " + cu.getNomeInstituicao() + "(" + cu.getCodigoInstituicao() + ")";
logger.info(msg);
serviceLogInfo(msg);
 
 
 
int unidades;
if(cu.getUnidadesAfetas() != null)
{
unidades = cu.getUnidadesAfetas().size();
int countUnidades = 0;
for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
{
countUnidades++;
msg = unidadeCurricularAfeta.isUsar() ? "(+)" : "(----IGNORADA-----)";
msg += "(" + countUnidades + "/" + unidades + ") Iniciando atribuição de Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome();
logger.info(msg);
serviceLogInfo(msg);
 
 
if(!unidadeCurricularAfeta.isUsar())
{
unidadesNaoUtilizadas++;
msg = "!!! A unidade está marcada para NÃO SER UTILIZADA, passando à próxima";
serviceLogWarn(msg);
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.WARNING,msg));
}
else
{
CourseUnitImpl cuImpl = (CourseUnitImpl) DaoFactory.getCourseUnitDaoImpl().narrow(unidadeCurricularAfeta.getCourseUnit());
CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(unidadeCurricularAfeta.getCourseUnit().getCourse());
 
//boolean separateTurmas = false;
//try{
// separateTurmas = ImportCourseService.loadCourseYearTurmasPolicy(Integer.parseInt(unidadeCurricularAfeta.getCursoAfeto().getCodigoCurso()), q.getYear(), logMessages, this);
//}catch(Throwable e)
//{
// msg = "!!! Código de Curso inválido a tentar verificar politica de turmas separadas, vai assumir falso";
// serviceLogError(msg);
// logger.error(msg);
// logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.ERROR,msg));
//}
unidadesUtilizadas++;
verificaAlertasUnidade(logMessages, unidadeCurricularAfeta);
List<CourseUnitImpl.Tipologia> tipologias;
if(unidadeCurricularAfeta.getCursoAfeto().isUsarTipologias())
{
tipologias = cuImpl.getTipologiasClass().obtainMergeTipologias();
//TODO ALTERAR QUANDO GERIRMOS USADAS PARA JA SO SE USAM SUMARIOS
for(CourseUnitImpl.Tipologia tMerge: tipologias)
{
//if(tMerge.isSumario())
//{
tMerge.setUse(true);
// break;
//}
}
}
else
{
tipologias = cuImpl.getTipologiasClass().obtainTipologiasSimples(unidadeCurricularAfeta.getCourseUnit());
//TODO ALTERAR QUANDO GERIRMOS USADAS PARA JA SO SE USAM SUMARIOS
for(CourseUnitImpl.Tipologia tMerge: tipologias)
{
tMerge.setUse(true);
}
}
 
/**
* Iterar as tipologias e tentar criar com as turmas e os docentes
* Os que não derem resultados devolvem falso e são retirados da lista
* A verificação do falso é feita sempre que uma turma falhe a abrir ou tenha zero alunos
*/
Iterator<CourseUnitImpl.Tipologia> iterTipologias = tipologias.iterator();
while(iterTipologias.hasNext())
{
CourseUnitImpl.Tipologia tipologia = iterTipologias.next();
boolean criada = criarTipologiasRequisitadas(logMessages, q, (QuestionarioPedagogicoUnidadeCurricularAfetaImpl) unidadeCurricularAfeta, (QuestionarioPedagogicoCursoAfetoImpl)cu, cuImpl, tipologia);
if(criada)
{
((QuestionarioPedagogicoUnidadeCurricularAfetaImpl)unidadeCurricularAfeta).incStatTipologiasRequisitadas();
((QuestionarioPedagogicoCursoAfetoImpl)cu).incStatTipologiasRequisitadas();
}
else
{
iterTipologias.remove();
}
}
 
//CASO ALGUM TENHA FALHADO VAMOS ENTAO ADICIONA-LOS AS TURMAS TODAS
//OU NAO TENHA VINDO TIPOLOGIA PARA ELE
//todo ESTE PROBLEMA DEVE SER RESOLVIDO COM A ADICAO DE TIPOLOGIAS SIMPLES PARA AS ASSOCIACOES
//todo T_DOC_TURMA Mudar no DisciplinaDao na importação de cursos
Map<String,Teacher> professoresEsperados = new HashMap<String, Teacher>();
for(Teacher t: cuImpl.getTeachers())
{
professoresEsperados.put(t.getSigesCode() + "", t);
}
 
for(CourseUnitImpl.Tipologia tMerge: tipologias)
{
professoresEsperados.remove(tMerge.getCdDocente());
}
List<CourseUnitImpl.Tipologia> tipologiasEmFalta = criarTipologiasRequisitadasSimplesParaProfsForaDasTurmasPorFaltaDeSumarios(logMessages, q, unidadeCurricularAfeta, cuImpl, professoresEsperados);
//tipologias.addAll(tipologiasEmFalta);
 
for(CourseUnitImpl.Tipologia emFalta: tipologiasEmFalta)
{
msg = "Criando tipologia em falta (docente:" + emFalta.getCdDocente() + ", turma: " + emFalta.getCdTurma() + ") para a unidade: " + unidadeCurricularAfeta.getCodigoUnidade() + " " + unidadeCurricularAfeta.getNome() + " do curso de " + unidadeCurricularAfeta.getCursoAfeto().getNome() + "(" + unidadeCurricularAfeta.getCursoAfeto().getCodigoCurso() +")";
serviceLogWarn(msg);
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.WARNING,msg));
((QuestionarioPedagogicoUnidadeCurricularAfetaImpl)unidadeCurricularAfeta).incStatTipologiasRequisitadas();
((QuestionarioPedagogicoCursoAfetoImpl)cu).incStatTipologiasRequisitadas();
criarTipologiasRequisitadas(logMessages, q, (QuestionarioPedagogicoUnidadeCurricularAfetaImpl) unidadeCurricularAfeta, (QuestionarioPedagogicoCursoAfetoImpl)cu, cuImpl, emFalta);
}
 
}
}
}
}
 
/** COMMIT OPERATION **/
setProgress(100);
commitPartially();
DaoFactory.getQuestionarioDaoImpl().update(q);
/** COMMIT OPERATION **/
 
msg = "Set courses state as " + QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.name();
serviceLogInfo(msg);
logger.info(msg);
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED);
commitPartially();
 
 
serviceLogInfo("######################################");
serviceLogInfo("######################################");
serviceLogInfo("#unidadesNaoUtilizadas:" + unidadesNaoUtilizadas);
serviceLogInfo("#unidadesUtilizadas:" + unidadesUtilizadas);
serviceLogInfo("#unidadesMarcadas:" + unidadesMarcadas);
serviceLogInfo("#unidadesNaoVistasProf:" + unidadesNaoVistasProf);
serviceLogInfo("#unidadesNaoVistasAlunos:" + unidadesNaoVistasAlunos);
serviceLogInfo("#cursosUtilizados:" + cursosUtilizados);
serviceLogInfo("#respostasRequisitadas:" + respostasRequisitadas);
 
logger.info("######################################");
logger.info("######################################");
logger.info("#unidadesNaoUtilizadas:" + unidadesNaoUtilizadas);
logger.info("#unidadesUtilizadas:" + unidadesUtilizadas);
logger.info("#unidadesMarcadas:" + unidadesMarcadas);
logger.info("#unidadesNaoVistasProf:" + unidadesNaoVistasProf);
logger.info("#unidadesNaoVistasAlunos:" + unidadesNaoVistasAlunos);
logger.info("#cursosUtilizados:" + cursosUtilizados);
logger.info("#respostasRequisitadas:" + respostasRequisitadas);
return logMessages;
}
 
 
 
private List<CourseUnitImpl.Tipologia> criarTipologiasRequisitadasSimplesParaProfsForaDasTurmasPorFaltaDeSumarios(DefaultLogMessages logMessages, QuestionarioImpl q, QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta, CourseUnitImpl cuImpl, Map<String, Teacher> teachersAffected) {
String msg;
List<CourseUnitImpl.Tipologia> tipologias = new ArrayList<CourseUnitImpl.Tipologia>();
if(teachersAffected.size() > 0)
{
msg = "!!! Existem " + teachersAffected.size() + "professores que não tinham tipologias de sumário associadas na unidade " + cuImpl.getCode() + "(" + cuImpl.getName() + ")" + ", associando uma tipologia simples por turma para este docente";
serviceLogWarn(msg);
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.WARNING,msg));
for(Teacher t: teachersAffected.values())
{
if(cuImpl.getTurmas() != null)
{
for(CourseUnitTurma turma: cuImpl.getTurmas())
{
msg = "!!! Criando tipologia Simples para (Prof: " + t.getSigesCode() + " " + t.getName() + " turma: " + turma.getTurma() + " ) " ;
serviceLogWarn(msg);
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.WARNING,msg));
 
CourseUnitImpl.Tipologia tipo = new CourseUnitImpl.Tipologia();
tipo.setCdDocente(t.getSigesCode() + "");
tipo.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
tipo.setCdTurma(turma.getTurma());
tipo.setDsTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_DS);
tipo.setUse(true);
tipologias.add(tipo);
}
}
}
}
return tipologias;
}
 
/**
* Devolve true se conseguiu criar pelo menos uma resposta a um aluno caso contrario a turma pode não existir ou ser lixo
* @param logMessages
* @param q
* @param unidadeCurricularAfeta
* @param cursoAfeto
* @param cuImpl
* @param tMerge
* @return
*/
private boolean criarTipologiasRequisitadas(DefaultLogMessages logMessages,
QuestionarioImpl q,
QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeCurricularAfeta,
QuestionarioPedagogicoCursoAfetoImpl cursoAfeto,
CourseUnitImpl cuImpl,
CourseUnitImpl.Tipologia tMerge) {
String msg;
if(tMerge.isUse())
{
//todo Criar Tipologia Requisitada
String cdDocente = tMerge.getCdDocente();
String cdTipologia = tMerge.getCdTipologia();
String dsTipologia = tMerge.getDsTipologia();
String cdTurma = tMerge.getCdTurma();
 
QuestionarioPedagogicoTipologiaRequisitadaImpl tipo = DomainObjectFactory.createQuestionarioPedagogicoTipologiaRequisitadaImpl();
tipo.setCdDocente(cdDocente);
tipo.setCdTipologia(cdTipologia);
tipo.setCdTurma(cdTurma);
tipo.setDsTipologia(dsTipologia);
tipo.setUnidadeAfeta(unidadeCurricularAfeta);
try{
CourseUnitImpl.TipologiaPersistent tMergePersistente = cuImpl.loadPersistent(tMerge);
tipo.setNomeDocente(tMergePersistente.getTeacher().getName());
tipo.setDocenteAfeto(tMergePersistente.getTeacher());
tipo.setTurmaAfeta(tMergePersistente.getCourseUnitTurma());
DaoFactory.getQuestionarioPedagogicoTipologiaRequisitadaDaoImpl().save(tipo);
return criarAlunosRequisitados(q, tipo, tMergePersistente.getCourseUnitTurma(),unidadeCurricularAfeta,cursoAfeto);
}
catch(CourseUnitImpl.TipologiaLoadExeption exp)
{
msg = "Tipologia não devolve persistente " + exp.getMessage() + " (docente:" + tMerge.getCdDocente() + ", turma: " + tMerge.getCdTurma() + ") para a unidade: " + unidadeCurricularAfeta.getCodigoUnidade() + " " + unidadeCurricularAfeta.getNome() + " do curso de " + cursoAfeto.getNome() + "(" + cursoAfeto.getCodigoCurso() +")";
serviceLogError(msg);
logger.error(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.ERROR,msg));
return false;
}
 
 
//Depois o home tem de procurar respostas requisitadas sem resposta
//para cada uma vai pelo aluno requisitado buscar a turma o docente e pela
//unidade afeta a unidade e o curso
//apresenta o questionario com o id da resposta requisitada
 
}
return false;
}
 
/**
* Return true se encotrou pelo menos um aluno
* @param q
* @param tipo
* @param turma
* @param unidadeAfeta
* @param cursoAfeto
* @return
*/
private boolean criarAlunosRequisitados(QuestionarioImpl q,
QuestionarioPedagogicoTipologiaRequisitadaImpl tipo,
CourseUnitTurma turma,
QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta,
QuestionarioPedagogicoCursoAfetoImpl cursoAfeto)
{
if(turma.getStudents() != null && turma.getStudents().size()>0)
{
for(Student s: turma.getStudents())
{
unidadeAfeta.incStatRespostasRequisitadas();
cursoAfeto.incStatRespostasRequisitadas();
QuestionarioRespostaRequisitadaImpl respostaRequisitada = DomainObjectFactory.createQuestionarioRespostaRequisitadaImpl();
respostaRequisitada.setQuestionario(q);
respostaRequisitada.setUser(s);
DaoFactory.getQuestionarioRespostaRequisitadaDaoImplImpl().save(respostaRequisitada);
 
QuestionarioPedagogicoAlunoRequisitadoImpl alunoRequisitado = DomainObjectFactory.createQuestionarioPedagogicoAlunoRequisitadoImpl();
alunoRequisitado.setTipologiaRequisitada(tipo);
alunoRequisitado.setAluno(s);
alunoRequisitado.setRespostaRequisitada(respostaRequisitada);
DaoFactory.getQuestionarioPedagogicoAlunoRequisitadoDaoImpl().save(alunoRequisitado);
respostasRequisitadas++;
}
return true;
}
return false;
}
 
private void verificaAlertasUnidade(DefaultLogMessages logMessages, QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta) {
String msg;
if(unidadeCurricularAfeta.isMarked() || !unidadeCurricularAfeta.isVista() || !unidadeCurricularAfeta.isVistaProfs())
{
msg = " !!!! ALERTA :--> ";
if(unidadeCurricularAfeta.isMarked())
{
unidadesMarcadas++;
msg+= " MARCADA ; ";
}
if(!unidadeCurricularAfeta.isVista())
{
unidadesNaoVistasAlunos++;
msg+= " NÃO VISTA ALUNOS ; ";
}
if(!unidadeCurricularAfeta.isVistaProfs())
{
unidadesNaoVistasProf++;
msg+= " NÃO VISTA PROFS ; ";
}
serviceLogWarn(msg);
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.answers.assigning", LogMessageTypeEnum.WARNING,msg));
}
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/questionarios/pedagogico/UpdateCoursesAndUnitsJobService.java
95,13 → 95,33
return new String[0];
}
 
/*************
* CRIAR O JOB PARA O RUNNER
* @param questionarioId
* @param coursesList
* @param session
* @param questionarioCleared
* @return
* @throws NotAuthorizedException
*/
public QuestionarioImpl runJobSelectCourses(long questionarioId,String[] coursesList,UserSession session,QuestionarioImpl questionarioCleared) throws NotAuthorizedException {
 
if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SELECT_COURSES.name()))
{
throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos");
}
( questionarioCleared).setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ASSIGNING_COURSES);
 
/*******VERIFICACAO DE RESPOSTAS*********/
long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
if(respostas == 0)
{
(questionarioCleared).setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ASSIGNING_COURSES);
}
else
{
logger.warn("Vai falhar no serviço, deixar falhar para visar o user");
}
 
JSONArray jsonArray = new JSONArray();
for(String sele: coursesList)
{
145,6 → 165,15
{
throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos");
}
long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
if(respostas > 0)
{
logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
"Operação não permitida, Existem Respostas"));
logger.warn(logMessages.getLastMessage());
serviceLogError(logMessages.getLastMessage());
return logMessages;
}
for(QuestionarioPedagogicoCursoAfeto cu : DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().find(questionarioId))
{
int unidades = 0;
153,16 → 182,18
unidades = cu.getUnidadesAfetas().size();
for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
{
logger.info("Reverting Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome());
unidadeCurricularAfeta.setCursoAfeto(null);
DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().delete(unidadeCurricularAfeta);
String msg = "Reverting Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome();
logger.info(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
if(unidadeCurricularAfeta.getTipologiasRequisitadas() != null && unidadeCurricularAfeta.getTipologiasRequisitadas().size() > 0)
{
String msg = "A unidade tem tipologias requisitadas que tem de ser removidas primeiro, iremos remover todas as tipologias e respostas associadas";
msg = "A unidade " + unidadeCurricularAfeta.getCodigoUnidade() + " tem tipologias requisitadas que tem de ser removidas primeiro, iremos remover todas as tipologias e respostas candidatas associadas";
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
removeTipologiasERespostasCascade(unidadeCurricularAfeta);
}
unidadeCurricularAfeta.setCursoAfeto(null);
DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().delete(unidadeCurricularAfeta);
}
}
String msg = "Removendo curso afeto:" + cu.getNome() + " e " + unidades + " uniades afetas";
176,10 → 207,59
return logMessages;
}
 
 
public static ILogMessages revertAllRespostasCandidatas(long questionarioId, ServiceJob serviceJob) throws NotAuthorizedException {
 
DefaultLogMessages logMessages = new DefaultLogMessages();
 
long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
if(respostas > 0)
{
logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
"Operação não permitida, Existem Respostas"));
logger.warn(logMessages.getLastMessage());
serviceJob.serviceLogError(logMessages.getLastMessage());
throw new NotAuthorizedException(logMessages.getLastMessage());
}
 
String msg = "Revertendo respostas candidatas do questionario " + questionarioId;
logger.info(msg);
serviceJob.serviceLogInfo(msg);
 
for(QuestionarioPedagogicoCursoAfeto cu : DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().find(questionarioId))
{
msg = "Revertendo respostas do curso " + cu.getCodigoCurso() + " , iremos remover todas as tipologias e respostas candidatas associadas";
logger.info(msg);
serviceJob.serviceLogInfo(msg);
((QuestionarioPedagogicoCursoAfetoImpl)cu).resetAnswerStats();
 
int unidades = 0;
if(cu.getUnidadesAfetas() != null)
{
unidades = cu.getUnidadesAfetas().size();
for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
{
((QuestionarioPedagogicoUnidadeCurricularAfetaImpl)unidadeCurricularAfeta).resetAnswerStats();
logger.info("Reverting Respostas Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome());
if(unidadeCurricularAfeta.getTipologiasRequisitadas() != null && unidadeCurricularAfeta.getTipologiasRequisitadas().size() > 0)
{
msg = "A unidade " + unidadeCurricularAfeta.getCodigoUnidade() + " tem tipologias requisitadas que tem de ser removidas primeiro, iremos remover todas as tipologias e respostas candidatas associadas";
logger.info(msg);
serviceJob.serviceLogWarn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
removeTipologiasERespostasCascade(unidadeCurricularAfeta);
}
}
}
logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.INFO,msg));
}
return logMessages;
}
 
/**
*
*/
private void removeTipologiasERespostasCascade(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeAfeta)
protected static void removeTipologiasERespostasCascade(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeAfeta)
{
for(QuestionarioPedagogicoTipologiaRequisitada tr: unidadeAfeta.getTipologiasRequisitadas())
{
212,6 → 292,8
 
/**
*
* ############# JOB TASK ############
* ############# JOB TASK ############
* @return
* @throws Throwable
*/
223,6 → 305,17
long questionarioId = Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
 
/********VERIFICACAO DE RESPOSTAS***********/
long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
if(respostas > 0)
{
logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
"Operação não permitida, Existem Respostas"));
logger.warn(logMessages.getLastMessage());
serviceLogError(logMessages.getLastMessage());
throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos num questioário com respostas");
}
 
String[] coursesList = deserializeCoursesList(q);
//Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre
 
232,6 → 325,8
logger.info(msg);
/**logging**/
 
revertAllRespostasCandidatas(questionarioId,this);
 
List<String> newCourseCodesList = new ArrayList<String>();
int count = 0;
int totalCourses = coursesList.length;
329,7 → 424,7
DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().delete(cursoAfeto);
}
 
private void removeUnselectedUnits(QuestionarioPedagogicoCursoAfeto cursoAfetado, List<String> newUnidadesCodesList) {
private void removeUnselectedUnits(QuestionarioPedagogicoCursoAfeto cursoAfetado, List<Long> newUnidadesCodesList) {
/** logging **/
String msg = "Removing unselected units from course: " + cursoAfetado.getCodigoCurso();
serviceLogInfo(msg);
338,7 → 433,7
Set<QuestionarioPedagogicoUnidadeCurricularAfeta> allUnidades = cursoAfetado.getUnidadesAfetas();
for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeAfeta: allUnidades)
{
if(!newUnidadesCodesList.contains(unidadeAfeta.getCodigoUnidade()))
if(!newUnidadesCodesList.contains(unidadeAfeta.getCourseUnit().getId()))
{
/** logging **/
msg = "--->Deleting unidade: " + unidadeAfeta.getCodigoUnidade();
407,7 → 502,7
 
 
 
List<String> newUnitCodesList = new ArrayList<String>();
List<Long> newUnitCodesList = new ArrayList<Long>();
int countUnits = 0;
List<CourseUnitDaoImpl.CourseUnitResult> results = DaoFactory.getCourseUnitDaoImpl().loadCourseUnits(c.getId(), q.getSemestre(), q.getYear());
int totalUnits = results.size();
415,7 → 510,7
{
countUnits++;
CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().load(cur.id);
newUnitCodesList.add(cu.getCode());
newUnitCodesList.add(cu.getId());
/** logging **/
msg = "---->(" + countUnits + " of " + totalUnits +") CourseUnit loaded: " + cu.getName() + "(" + cu.getCode() + ")";
serviceLogInfo(msg);
439,10 → 534,10
 
String msg;
QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta = null;
List<QuestionarioPedagogicoUnidadeCurricularAfeta> unidadesFound = DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().find(cursoAfeto.getQuestionario().getId(), cursoAfeto.getCodigoCurso(), cu.getCode());
List<QuestionarioPedagogicoUnidadeCurricularAfeta> unidadesFound = DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().find(cursoAfeto.getQuestionario().getId(), cursoAfeto.getCodigoCurso(), cu.getId());
if(unidadesFound != null && unidadesFound.size() > 1)
{
msg = "Encontradas mais que uma unidade nos mesmos códigos: curso:" +cursoAfeto.getCodigoCurso() + ", unidade " + cu.getCode() + " apagando um";
msg = "Encontradas mais que uma unidade nos mesmos códigos: curso:" +cursoAfeto.getCodigoCurso() + ", unidade " + cu.getCode() + " com id sistema(" + cu.getId() + ") apagando um";
serviceLogWarn(msg);
logger.warn(msg);
logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
472,7 → 567,7
unidadeAfeta.setCursoAfeto(cursoAfeto);//so metemos de um dos lados
unidadeAfeta.setCourseUnit(cu);
unidadeAfeta.setCodigoUnidade(cu.getCode());
unidadeAfeta.setObs("");
unidadeAfeta.addObs("");
unidadeAfeta.setNome(cu.getName());
 
unidadeAfeta.setMarked(false);
639,7 → 734,8
 
public void updateCheckVarPedagogico(long questionarioId,long unidadeAfetaId, String op,String val,UserSession session, QuestionarioImpl questionarioCleared) throws NotAuthorizedException {
 
if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_CHECK_TEACHERS.name()) &&
if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_USE_UNIT.name()) &&
!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_CHECK_TEACHERS.name()) &&
!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS.name()) &&
!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_TIPOLOGIES.name()))
{
/branches/v3/impl/src/java/pt/estgp/estgweb/services/questionarios/PedagogicoAlunosProcessor.java
7,6 → 7,7
import pt.estgp.estgweb.domain.UserSessionImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.utils.SimpleClearanceRuledSupport;
import pt.estgp.estgweb.services.questionarios.pedagogico.AnswersAlunosProcessor;
import pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService;
import pt.estgp.estgweb.utils.ConfigProperties;
 
46,106 → 47,135
questionario.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.START);
}
 
 
 
public void initClearances(QuestionarioImpl q, UserSessionImpl usession, SimpleClearanceRuledSupport s)
{
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
if(q.getStateEnum() == QuestionarioImpl.State.ASSIGNATION_DETAILS)
assignationDetailsClearances(q, usession, s);
 
if(q.getStateEnum() == QuestionarioImpl.State.STOPED_WITH_ANSWERS || q.getStateEnum() == QuestionarioImpl.State.PROCESSING || q.getStateEnum() == QuestionarioImpl.State.PROCESSING_WITH_ANSWERS)
{
if(q.getSubStatePedagodigoEnum() == QuestionarioImpl.SubStatePedagogico.START ||
q.getSubStatePedagodigoEnum() == QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED)
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SET_ANO_SEMESTRE.name(),usession);
if(usession.getUser().hasRole(Globals.ROLE_PRESIDENTE_CONCELHO_PEDAGOGICO))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_DASHBOARD.name(),usession);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_FORM.name(),usession);
}
}
 
}
 
if(q.getSubStatePedagodigoEnum().getPosition() >= QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED.getPosition() &&
q.getSubStatePedagodigoEnum().getPosition() < QuestionarioImpl.SubStatePedagogico.FINNISHED_ANSWERS_GENERATING.getPosition())
private void assignationDetailsClearances(QuestionarioImpl q, UserSessionImpl usession, SimpleClearanceRuledSupport s) {
if(q.getStateEnum() == QuestionarioImpl.State.ASSIGNATION_DETAILS)
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SEE_SELECT_COURSES.name(),usession);
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
{
if(q.getCourseSelectionTaskId() <= 0 || q.getSubStatePedagodigoEnum().getPosition() == QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED.getPosition())
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SELECT_COURSES.name(),usession);
else
if(q.getSubStatePedagodigoEnum() == QuestionarioImpl.SubStatePedagogico.START ||
q.getSubStatePedagodigoEnum() == QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED)
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SET_ANO_SEMESTRE.name(),usession);
}
 
 
if(q.getSubStatePedagodigoEnum().getPosition() >= QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED.getPosition() &&
q.getSubStatePedagodigoEnum().getPosition() < QuestionarioImpl.SubStatePedagogico.FINNISHED_ANSWERS_GENERATING.getPosition())
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SEE_SELECT_COURSES.name(),usession);
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
{
JobServiceTask task = DaoFactory.getJobServiceTaskDaoImpl().load(q.getCourseSelectionTaskId());
if(task.isExecuted() || (task.getSaveDate() != null &&
System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)) //half hour blocked, 30 minutos
if(q.getCourseSelectionTaskId() <= 0 || q.getSubStatePedagodigoEnum().getPosition() == QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED.getPosition())
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SELECT_COURSES.name(),usession);
else
{
if(!task.isExecuted() && System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)
JobServiceTask task = DaoFactory.getJobServiceTaskDaoImpl().load(q.getCourseSelectionTaskId());
if(task.isExecuted() || (task.getSaveDate() != null &&
System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)) //half hour blocked, 30 minutos
{
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED);//rolling back to year semestre assigned
if(!task.isExecuted() && System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)
{
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED);//rolling back to year semestre assigned
}
task.setExecuted(true);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SELECT_COURSES.name(),usession);
}
task.setExecuted(true);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SELECT_COURSES.name(),usession);
}
}
}
}
 
 
 
if(q.getSubStatePedagodigoEnum().getPosition() >= QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED.getPosition() &&
q.getSubStatePedagodigoEnum().getPosition() < QuestionarioImpl.SubStatePedagogico.FINNISHED_ANSWERS_GENERATING.getPosition())
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_START_ASSIGN_ANSWERS.name(),usession);
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_TIPOLOGIAS_ADMIN))
if(q.getSubStatePedagodigoEnum().getPosition() >= QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED.getPosition() &&
q.getSubStatePedagodigoEnum().getPosition() < QuestionarioImpl.SubStatePedagogico.FINNISHED_ANSWERS_GENERATING.getPosition())
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_TIPOLOGIES.name(),usession);
}
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_ADMIN))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS.name(),usession);
}
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_CHECK_TEACHERS_ADMIN))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_CHECK_TEACHERS.name(),usession);
}
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_TIPOLOGIAS_ADMIN))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_TIPOLOGIES.name(),usession);
}
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
{
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_CHECK_STUDENTS_ADMIN))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS.name(),usession);
//s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_USE_UNIT.name(),usession);
}
 
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_REVERT_ALL_ASSIGNEMENTS.name(),usession);
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_CHECK_TEACHERS_ADMIN))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_CHECK_TEACHERS.name(),usession);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_USE_UNIT.name(),usession);
}
 
//ATRIBUIR RESPOSTAS MAS SO DEPOIS DE CURSOS ATRIBUIDOS
if(q.getAnswerGenerationTaskId() <= 0 || q.getSubStatePedagodigoEnum().getPosition() == QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.getPosition())
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_START_ASSIGN_ANSWERS.name(),usession);
else
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
{
JobServiceTask task = DaoFactory.getJobServiceTaskDaoImpl().load(q.getAnswerGenerationTaskId());
if(task.isExecuted() || (task.getSaveDate() != null &&
System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)) //half hour blocked, 30 minutos
 
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_START_ASSIGN_ANSWERS.name(),usession);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_REVERT_ALL_ASSIGNEMENTS.name(),usession);
 
//ATRIBUIR RESPOSTAS MAS SO DEPOIS DE CURSOS ATRIBUIDOS
if(q.getAnswerGenerationTaskId() <= 0 || q.getSubStatePedagodigoEnum().getPosition() == QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.getPosition())
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_START_ASSIGN_ANSWERS.name(),usession);
else
{
if(!task.isExecuted() && System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)
JobServiceTask task = DaoFactory.getJobServiceTaskDaoImpl().load(q.getAnswerGenerationTaskId());
if(task.isExecuted() || (task.getSaveDate() != null &&
System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)) //half hour blocked, 30 minutos
{
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED);//rolling back to courses assigned
if(!task.isExecuted() && System.currentTimeMillis()-task.getSaveDate().getTime()>1800000)
{
q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED);//rolling back to courses assigned
}
task.setExecuted(true);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_START_ASSIGN_ANSWERS.name(),usession);
}
task.setExecuted(true);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_START_ASSIGN_ANSWERS.name(),usession);
}
}
}
}
 
if(q.getSubStatePedagodigoEnum().getPosition() == QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.getPosition())
{
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
if(q.getSubStatePedagodigoEnum().getPosition() == QuestionarioImpl.SubStatePedagogico.ANSWERS_ASSIGNED.getPosition())
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_FINNISH_ASSIGNEMENTS.name(),usession);
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_PUT_ANSWERS_ASSIGNED.name(),usession);
}
}
}
}
 
@Override
public Class getJobServiceTaskAnswersProcessor() {
return AnswersAlunosProcessor.class;
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/questionarios/QuestionariosService.java
1,12 → 1,22
package pt.estgp.estgweb.services.questionarios;
 
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.dao.impl.AnnouncementDaoImpl;
import pt.estgp.estgweb.domain.views.QuestionarioView;
import pt.estgp.estgweb.services.email.EMAILJob;
import pt.estgp.estgweb.services.email.EMAILJobPersonalizedCertificated;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.jobs.JobScheduleService;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.estgp.estgweb.utils.EmailPersonalizedCertificated;
import pt.estgp.estgweb.web.exceptions.NotAuthorizedException;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.List;
import java.util.*;
 
/**
* Created by jorgemachado on 21/03/16.
14,6 → 24,8
public class QuestionariosService implements IService
{
 
private static final Logger logger = Logger.getLogger(QuestionariosService.class);
 
//NEW QUESTIONARIOS COME BY THIS SERVICE
public QuestionarioImpl newQuestionarioForm(QuestionarioImpl qform, UserSession userSession) throws NotAuthorizedException
{
113,4 → 125,194
}
}
 
/**
* Passa para o estado ASSIGNED_ANSWERS
* @param questionarioId
* @param userSession
* @param questionarioCleared
* @return
*/
public QuestionarioImpl putAssignedAnswers(long questionarioId, UserSession userSession,QuestionarioImpl questionarioCleared)
{
if(questionarioCleared.isClear((UserSessionImpl) userSession,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_PUT_ANSWERS_ASSIGNED.toString()))
{
questionarioCleared.setStateClass(QuestionarioImpl.State.ASSIGNED_ANSWERS);
}
return questionarioCleared;
}
 
public QuestionarioImpl revertAssignationDetails(long questionarioId, UserSession userSession,QuestionarioImpl questionarioCleared)
{
if(questionarioCleared.isClear((UserSessionImpl) userSession,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_REVERT_TO_ASSIGNATION_DETAILS.toString()))
{
questionarioCleared.setStateClass(QuestionarioImpl.State.ASSIGNATION_DETAILS);
}
return questionarioCleared;
}
 
public QuestionarioImpl startProcessement(long questionarioId, UserSession userSession,QuestionarioImpl questionarioCleared)
{
 
if(questionarioCleared.isClear((UserSessionImpl) userSession, QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_START_PROCESSEMENT.toString()))
{
if(questionarioCleared.getStateEnum() == QuestionarioImpl.State.ASSIGNED_ANSWERS)
questionarioCleared.setStateClass(QuestionarioImpl.State.PROCESSING);
else if(questionarioCleared.getStateEnum() == QuestionarioImpl.State.STOPED_WITH_ANSWERS)
questionarioCleared.setStateClass(QuestionarioImpl.State.PROCESSING_WITH_ANSWERS);
}
return questionarioCleared;
}
 
public QuestionarioImpl stopProcessement(long questionarioId, UserSession userSession,QuestionarioImpl questionarioCleared)
{
 
if(questionarioCleared.isClear((UserSessionImpl) userSession,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_STOP_PROCESSEMENT.toString()))
{
if(questionarioCleared.getStateEnum() == QuestionarioImpl.State.PROCESSING)
questionarioCleared.setStateClass(QuestionarioImpl.State.ASSIGNED_ANSWERS);
else if(questionarioCleared.getStateEnum() == QuestionarioImpl.State.PROCESSING_WITH_ANSWERS)
questionarioCleared.setStateClass(QuestionarioImpl.State.STOPED_WITH_ANSWERS);
}
return questionarioCleared;
}
 
public void salvarResposta(QuestionarioResposta resposta,Long alunoRequisitadoId,UserSession userSession) throws NotAuthorizedException {
Questionario q = DaoFactory.getQuestionarioDaoImpl().load(resposta.getQuestionario().getId());
QuestionarioImpl questionario = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().narrow(q);
QuestionarioPedagogicoAlunoRequisitado alunoRequisitado = DaoFactory.getQuestionarioPedagogicoAlunoRequisitadoDaoImpl().load(alunoRequisitadoId);
if(questionario.getStateEnum() != QuestionarioImpl.State.PROCESSING && questionario.getStateEnum() != QuestionarioImpl.State.PROCESSING_WITH_ANSWERS )
{
throw new NotAuthorizedException("O questionário interrompido por razões administrativas, por favor tente mais tarde");
}
if(!((alunoRequisitado.getRespostaRequisitada().getQuestionario().getId() == questionario.getId())
&&
alunoRequisitado.getRespostaRequisitada().getResposta() == null
&&
alunoRequisitado.getAluno().getId() == userSession.getUser().getId()))
{
throw new NotAuthorizedException("Não está autorizado a submeter esta resposta.");
}
 
resposta.setId(0);
resposta.setQuestionario(questionario);
resposta.setUser(alunoRequisitado.getAluno());
alunoRequisitado.getRespostaRequisitada().setResposta(resposta);
DaoFactory.getQuestionarioRespostaDaoImpl().save(resposta);
questionario.setStateClass(QuestionarioImpl.State.PROCESSING_WITH_ANSWERS);
}
 
 
SendEmailService sendEmailService = new SendEmailService();
public int sendMessage(boolean onlyNotAnswered,Long id,String msg,String emailFrom,String personFrom, String subject,UserSession userSession)
{
String source = "questionario message";
AnnouncementDaoImpl.FindUsersIdResult result = DaoFactory.getQuestionarioDaoImpl().findUsersIds(id, onlyNotAnswered);
 
return sendEmails(id, msg, emailFrom, personFrom, subject, userSession, source, result);
}
 
public int sendMessageCursoAfeto(boolean onlyNotAnswered,Long id,String msg,String emailFrom,String personFrom, String subject,UserSession userSession)
{
String source = "questionario curso message";
AnnouncementDaoImpl.FindUsersIdResult result = DaoFactory.getQuestionarioDaoImpl().findUsersIdsPedagogico(onlyNotAnswered, id, 0);
return sendEmails(id, msg, emailFrom, personFrom, subject, userSession, source, result);
}
public int sendMessageUnidadeAfeta(boolean onlyNotAnswered,Long id,String msg,String emailFrom,String personFrom, String subject,UserSession userSession)
{
String source = "questionario unidade message";
AnnouncementDaoImpl.FindUsersIdResult result = DaoFactory.getQuestionarioDaoImpl().findUsersIdsPedagogico(onlyNotAnswered, 0, id);
return sendEmails(id, msg, emailFrom, personFrom, subject, userSession, source, result);
}
 
 
public int sendMessageAllProcessing(boolean onlyNotAnswered,String msg,String emailFrom,String personFrom, String subject,UserSession userSession)
{
String source = "questionarios em processamento message";
AnnouncementDaoImpl.FindUsersIdResult result = DaoFactory.getQuestionarioDaoImpl().findUsersIdsPedagogicoAllProcessing(onlyNotAnswered);
return sendEmails(null, msg, emailFrom, personFrom, subject, userSession, source, result);
}
 
private int sendEmails(Long id, String msg, String emailFrom, String personFrom, String subject, UserSession userSession, String source, AnnouncementDaoImpl.FindUsersIdResult result) {
List<Long> usersToConsume = result.userIds;
 
 
logger.info("Scheduling mail jobs to " + result.users + " users: " + usersToConsume.size() + " recipients");
logger.info("Sender User logged in BACO: " + userSession.getUser().getName() + "(" + userSession.getUser().getUsername() + ")" + " - " + userSession.getUser().getEmail());
//while(usersToConsume.size() > 0)
//{
// Iterator<String> iter = usersToConsume.iterator();
// List<String> usersToJob = new ArrayList<String>();
// int contador = 0;
// while(iter.hasNext() && contador < 20)
// {
// usersToJob.add(iter.next());
// iter.remove();
// contador++;
// }
 
String suffix = Globals.SYSTEM_EMAIL_CERTIFICATED_HOME_PAGE;
if(suffix.startsWith("/"))
suffix = suffix.substring(1);
String url = Globals.SITE_URL.endsWith("/") ? Globals.SITE_URL + suffix : Globals.SITE_URL + "/" + suffix;
 
EmailPersonalizedCertificated e = sendEmailService.getMessageEmailAdulteredFromEmailIppCertificated(emailFrom,
personFrom,
subject,
msg,
userSession.getUser(),
usersToConsume,
url);
 
e.setHtml(true);
EMAILJobPersonalizedCertificated emailJob = new EMAILJobPersonalizedCertificated(e);
JobScheduleService.getInstance().scheduleNow(emailJob,"Message Email (" + source + ":id " + id + ") from " + userSession.getUsername() + " as " + personFrom + " - subject:" + subject ,userSession);
//}
enviarComprovativoAoRemetente(id, msg, emailFrom, personFrom, subject, userSession, source,usersToConsume.size());
enviarComprovativoAAdministracao(id, msg, emailFrom, personFrom, subject, userSession, source,usersToConsume.size());
return result.users;
}
 
private void enviarComprovativoAAdministracao(Long id, String msg, String emailFrom, String personFrom, String subject, UserSession userSession, String source,int sentTo)
{
 
 
Email e = sendEmailService.getMessageEmailAdulteredFromEmailIpp(emailFrom,
personFrom,
subject + " (COMPROVATIVO PAE) ",
"<u>Caros membros da administração este é um comprovativo de um email enviado pelo PAE pelo user: " + userSession.getUser().getName() + " - Este é um comprovativo do seu envio de mensagem a " + sentTo + " Alunos</u><br/><br/>" + msg,
ConfigProperties.getListValuesByPrefix("admin.email"),
userSession.getUser());
 
e.setHtml(true);
EMAILJob emailJob = new EMAILJob(e);
JobScheduleService.getInstance().scheduleNow(emailJob,"Message Email (" + source + ":id " + id + ") from " + userSession.getUsername() + " as " + personFrom + " - subject:" + subject ,userSession);
}
 
private void enviarComprovativoAoRemetente(Long id, String msg, String emailFrom, String personFrom, String subject, UserSession userSession, String source,int sentTo)
{
Map<String,String> emailsComprovativos = new HashMap<String, String>();
if(Email.validEmail(userSession.getUser().getEmail()))
emailsComprovativos.put(userSession.getUser().getEmail(),"");
if(Email.validEmail(userSession.getUser().getOutEmail()))
emailsComprovativos.put(userSession.getUser().getOutEmail(),"");
if(Email.validEmail(userSession.getUser().getPreferrefEmail()))
emailsComprovativos.put(userSession.getUser().getPreferrefEmail(),"");
List<String> comprovativos = new ArrayList<String>();
comprovativos.addAll(emailsComprovativos.keySet());
if(comprovativos.size() > 0)
{
Email e = sendEmailService.getMessageEmailAdulteredFromEmailIpp(emailFrom,
personFrom,
subject + " (COMPROVATIVO PAE) ",
"<u>Olá " + userSession.getUser().getName() + " - Este é um comprovativo do seu envio de mensagem a " + sentTo + " Alunos</u><br/><br/>" + msg,
comprovativos,
userSession.getUser());
 
e.setHtml(true);
EMAILJob emailJob = new EMAILJob(e);
JobScheduleService.getInstance().scheduleNow(emailJob,"Message Email (" + source + ":id " + id + ") from " + userSession.getUsername() + " as " + personFrom + " - subject:" + subject ,userSession);
}
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/authenticate/AuthenticateService.java
329,6 → 329,15
User u = DaoFactory.getUserDaoImpl().load(userId);
return createCertificate(u, usersession);
}
public String createCertificateForId(long userId)
{
User u = DaoFactory.getUserDaoImpl().load(userId);
return createCertificate(u);
}
public String createCertificate(User user)
{
return createCertificate(user,null);
}
/**
* Create a new Certificate for usage in URL auto login
*
/branches/v3/impl/src/java/pt/estgp/estgweb/services/utils/UrlHashValidatorService.java
New file
0,0 → 1,22
package pt.estgp.estgweb.services.utils;
 
import jomm.utils.BytesUtils;
 
/**
* Created by jorgemachado on 10/10/16.
*/
public class UrlHashValidatorService {
 
private static final String PREFIX_TRASH = "#=%$%&(dsfde";
private static final String SUFFIX_TRASH = "vF64%dKZd_9d";
 
public static String getHashString(String data)
{
return BytesUtils.getMD5(PREFIX_TRASH + data + SUFFIX_TRASH);
}
 
public static boolean checkHashString(String data, String hash)
{
return hash.equals(getHashString(data));
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/services/entity/EntityServiceJson.java
2,12 → 2,13
 
import com.owlike.genson.Genson;
import com.owlike.genson.TransformationException;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 22/03/16.
27,8 → 28,37
 
.create();
 
static Genson userGenson = new Genson.Builder()
.exclude(Object.class)
.exclude(User.class)
.exclude(GenericUser.class)
.exclude(Student.class)
.exclude(Teacher.class)
.include("id", User.class)
.include("name", User.class)
.include("sigesCode", User.class)
.include("email", User.class)
.include("roles", User.class)
 
.create();
 
public String courseUnit(CourseUnit cu) throws IOException, TransformationException {
return courseUnitGenson.serialize(cu);
}
public String courseUnit(Serializable s) throws IOException, TransformationException {
CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().get(s);
return courseUnitGenson.serialize(cu);
}
 
public String user(Serializable s) throws IOException, TransformationException {
User u = DaoFactory.getUserDaoImpl().get(s);
return userGenson.serialize(u);
}
public String user(User u) throws IOException, TransformationException {
return userGenson.serialize(u);
}
 
public String user(ArrayList<User> users) throws IOException, TransformationException {
return userGenson.serialize(users);
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/EventGenericImpl.java
New file
0,0 → 1,25
package pt.estgp.estgweb.domain;
 
import java.io.Serializable;
import java.util.List;
 
/**
* Created by jorgemachado on 05/09/16.
*/
public class EventGenericImpl extends EventGeneric {
 
@Override
public List<String> getOwnerRoles() {
return null;
}
 
@Override
public String getChoosedOwnerRole() {
return null;
}
 
@Override
public Serializable getSerializable() {
return null;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/EventFormacoesImpl.java
New file
0,0 → 1,33
package pt.estgp.estgweb.domain;
 
/**
* Created by jorgemachado on 07/09/16.
*/
public class EventFormacoesImpl extends EventFormacoes {
 
private Double lucro = null;
private Boolean rentavel = false;
private Double percentagemLucro = 0.0;
 
public double getLucroPrevisto()
{
if(lucro == null)
{
double entradas = getPrecoFormando() * getEventRecords().size();
double custos = getCustoFormacao();
lucro = entradas - custos;
percentagemLucro = lucro <= 0 ? 0.0 : lucro/custos;
if(percentagemLucro > getPercentagemMinimaLucro())
rentavel = true;
}
return lucro;
}
public double getPercentagemLucro(){
getLucroPrevisto();
return percentagemLucro;
}
public boolean isRentavel(){
getLucroPrevisto();
return rentavel;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/StudentImpl.java
3,6 → 3,7
import jomm.utils.StringsUtils;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.utils.RoleManager;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
 
50,8 → 51,11
return subscribedCoursesOldYearsView;
}
 
public String getManagedRole() {
return STUDENT_ROLE;
public String getManagedRole()
{
List<String> roles = new ArrayList<String>();
roles.add(STUDENT_ROLE);
return RoleManager.getSerialRoles(roles);
}
 
public List<CourseUnit> getSubscribedUnitsViewS1()
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/EventClassImpl.java
New file
0,0 → 1,8
package pt.estgp.estgweb.domain;
 
/**
* Created by jorgemachado on 05/09/16.
*/
public class EventClassImpl extends EventClass {
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/IAnswersProcessor.java
20,4 → 20,6
/** to be used on clearances initialization**/
public void initClearances(QuestionarioImpl questionario, UserSessionImpl session, SimpleClearanceRuledSupport s);
 
public Class getJobServiceTaskAnswersProcessor();
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/views/CourseView.java
42,6 → 42,9
private String code;
private String area;
private String name;
private String nameEn;
private String nameEs;
private String nameFr;
private String degree;
private String importYear;
private String description;
86,14 → 89,27
private String externalSitePath;
private String validationRole;
private boolean status;
private boolean showStudiesPlan;
private String userGroupStudents;
 
private List<CourseYearView> courseYearViews = new DynamicArrayList<CourseYearView>(CourseYearView.class);
 
private List<CourseStudiesPlan> courseStudiesPlans = new DynamicArrayList<CourseStudiesPlan>(CourseStudiesPlan.class);
 
public List<CourseStudiesPlan> getCourseStudiesPlans() {
return courseStudiesPlans;
}
 
public void setCourseStudiesPlans(List<CourseStudiesPlan> courseStudiesPlans) {
this.courseStudiesPlans = courseStudiesPlans;
}
 
private Course course;
 
public CourseDepartment getCourseDepartment(){
return course.getDepartment();
}
 
public boolean isStatus() {
return status;
}
138,11 → 154,19
courseYearViews.add(courseYearView);
}
 
 
this.course = course;
if(course.getDepartment() != null)
{
course.getDepartment().getName();
}
this.id = course.getId();
this.code = course.getCode();
this.area = course.getArea();
this.name = course.getName();
this.nameEn = course.getNameEn();
this.nameEs = course.getNameEs();
this.nameFr = course.getNameFr();
this.degree = course.getDegree();
this.validationRole = course.getValidationRole();
this.description = course.getDescription();
152,6 → 176,7
this.externalSitePath = course.getExternalSitePath();
this.externalSiteServer = course.getExternalSiteServer();
this.status = course.isStatus();
this.showStudiesPlan = course.isShowStudiesPlan();
this.userGroupStudents = course.getUserGroupStudents();
if(course.getStudiesPlan() != null)
this.studiesPlanStreamId = course.getStudiesPlan();
187,16 → 212,24
}
}
c.setCode(code);
c.setArea(area);
// c.setArea(area);
CourseDepartment department = DaoFactory.getCourseDepartmentDaoImpl().findBySigla(area);
if(department != null)
c.setDepartment(department);
 
c.setDegree(degree);
c.setDescription(description);
c.setImportYear(importYear);
c.setInstitutionalCode(institutionalCode);
c.setName(name);
c.setNameEn(nameEn);
c.setNameEs(nameEs);
c.setNameFr(nameFr);
c.setExternalSitePath(externalSitePath);
c.setExternalSiteServer(externalSiteServer);
c.setValidationRole(validationRole);
c.setStatus(status);
c.setShowStudiesPlan(showStudiesPlan);
c.setUserGroupStudents(userGroupStudents);
if(coordinator != null && coordinator.getId() > 0)
{
278,6 → 311,30
this.name = name;
}
 
public String getNameEn() {
return nameEn;
}
 
public void setNameEn(String nameEn) {
this.nameEn = nameEn;
}
 
public String getNameEs() {
return nameEs;
}
 
public void setNameEs(String nameEs) {
this.nameEs = nameEs;
}
 
public String getNameFr() {
return nameFr;
}
 
public void setNameFr(String nameFr) {
this.nameFr = nameFr;
}
 
public String getDegree()
{
return degree;
703,7 → 760,14
this.userGroupStudents = userGroupStudents;
}
 
public boolean isShowStudiesPlan() {
return showStudiesPlan;
}
 
public void setShowStudiesPlan(boolean showStudiesPlan) {
this.showStudiesPlan = showStudiesPlan;
}
 
public boolean isSeparatedUnits(String year)
{
for(CourseYearView cyv: courseYearViews)
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/views/UserView.java
654,6 → 654,18
}
return views;
}
 
public static List<UserView> getViewsFromIds(List<Long> usersIds)
{
if(usersIds == null)
return null;
List<UserView> views = new ArrayList<UserView>();
for(Long uId: usersIds)
{
views.add(new UserView(DaoFactory.getUserDaoImpl().load(uId)));
}
return views;
}
public static List<UserView> getTeacherViews(List<Teacher> users)
{
if(users == null)
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/views/CourseUnitView.java
34,6 → 34,7
private String courseName;
private String semestre;
private String importYear;
private String institutionCode;
private String contentsGrants;
private BlogView blog;
private String pathIntranet;
142,6 → 143,7
this.sumariosPathFileIntranet = ((CourseUnitImpl)courseUnit).getSummariosPathFileIntranet();
this.evaluationOpenByAdmin = courseUnit.isEvaluationOpenByAdmin(); //nao tem persistencia propria tem de ser feito num serviço
this.cdTurma = courseUnit.getCdTurma();
this.institutionCode = courseUnit.getInstitutionCode();
 
// this.objectives = courseUnit.getObjectives(); DEPRECATED
if(courseUnit.getCourseUnitProgram() !=null && courseUnit.getCourseUnitProgram().getCourseUnitProgramPart2() != null)
207,7 → 209,7
logger.error("Unidade sem turmas: " + courseUnit.getName() + " (" + courseUnit.getCode() + ")");
}
 
if(students.size() != courseUnit.getStudents().size())
if(initStudents && students.size() != courseUnit.getStudents().size())
{
for(Student s: courseUnit.getStudents())
{
470,6 → 472,7
c.setCode(code);
c.setCdTurma(cdTurma);
c.setSemestre(semestre);
c.setInstitutionCode(institutionCode);
if(courseId > 0)
{
c.setCourse(DaoFactory.getCourseDaoImpl().load(courseId));
729,7 → 732,14
return true;
}
 
public String getInstitutionCode() {
return institutionCode;
}
 
public void setInstitutionCode(String institutionCode) {
this.institutionCode = institutionCode;
}
 
public boolean isValidProgram()
{
return validProgram;
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/QuestionarioPedagogicoUnidadeCurricularAfetaImpl.java
9,8 → 9,10
{
if(getObs() == null)
setObs("");
else if(obs.trim().length() > 0)
setObs(getObs() + " ; ");
 
setObs(getObs() + " ; " + obs);
setObs(getObs() + obs);
}
 
public void resetStats() {
19,9 → 21,19
setStudents(0);
setProfs(0);
setMarked(false);
setObs("");
//setObs("");
setProfsWithoutTurma(0);
setTurmas(0);
setTurmaWithoutProf(0);
 
}
 
public void resetAnswerStats() {
 
setStatTipologiasRequisitadas(0);
setStatRespostasRequisitadas(0);
}
 
public void incStatTipologiasRequisitadas(){ setStatTipologiasRequisitadas(getStatTipologiasRequisitadas()+1);}
public void incStatRespostasRequisitadas(){ setStatRespostasRequisitadas(getStatRespostasRequisitadas() + 1);}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/CourseImpl.java
1,6 → 1,9
package pt.estgp.estgweb.domain;
 
import pt.estgp.estgweb.utils.ConfigProperties;
 
import java.io.Serializable;
import java.util.List;
 
/**
* @author Jorge Machado
21,4 → 24,52
return userSession.getUser()!= null &&
userSession.getUser().hasRole(getValidationRole());
}
 
public String getDegreeForJsonApi()
{
return ConfigProperties.getProperty("course." + getDegree());
}
 
public void setDegreeForJsonApi()
{
//is needed for Genson generation
}
 
 
 
public String getStatusForJsonApi()
{
if(isShowStudiesPlan())
{
return "active";
}
else
return "inactive";
}
 
public void setStatusForJsonApi()
{
//is needed for Genson generation
}
 
public String getSchoolForJsonApi()
{
return ConfigProperties.getProperty("institution.code.prefix." + getInstitutionalCode());
}
 
public void setSchoolForJsonApi()
{
//is needed for Genson generation
}
 
//Auxiliary method fot manual load
List<Teacher> courseComission;
 
public void setCourseComission(List<Teacher> courseComission) {
this.courseComission = courseComission;
}
 
public List<Teacher> getCourseComission() {
return courseComission;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/DomainObjectFactory.java
415,4 → 415,31
public static ConfigurationImpl createConfigurationImpl() {
return new ConfigurationImpl();
}
 
public static QuestionarioRespostaRequisitadaImpl createQuestionarioRespostaRequisitadaImpl(){
return new QuestionarioRespostaRequisitadaImpl();
}
 
public static QuestionarioRespostaImpl createQuestionarioRespostaImpl() {
return new QuestionarioRespostaImpl();
}
 
public static CourseStudiesPlanImpl createCourseStudiesPlanImpl() {
return new CourseStudiesPlanImpl();
}
 
public static CourseDepartmentImpl createCourseDepartmentImpl() {
return new CourseDepartmentImpl();
}
 
public static EventClassImpl createEventClass() {
return new EventClassImpl();
}
 
public static EventGenericImpl createEventGenericImpl() {
return new EventGenericImpl();
}
public static EventFormacoesImpl createEventFormacoesImpl() {
return new EventFormacoesImpl();
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/CourseStudiesPlanImpl.java
New file
0,0 → 1,14
package pt.estgp.estgweb.domain;
 
import java.io.Serializable;
 
/**
* Created by jorgemachado on 28/07/16.
*/
public class CourseStudiesPlanImpl extends CourseStudiesPlan
{
@Override
public Serializable getSerializable() {
return getId();
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/UserImpl.java
112,4 → 112,11
{
return DesUtils.getInstance().decrypt(getPop3password());
}*/
 
public String getShortName()
{
if(getName() != null)
return getName().split(" ")[0];
return getName();
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/EventUserImpl.java
New file
0,0 → 1,7
package pt.estgp.estgweb.domain;
 
/**
* Created by jorgemachado on 12/09/16.
*/
public class EventUserImpl extends EventUser {
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/QuestionarioImpl.java
30,7 → 30,7
 
CREATED(1),
ASSIGNATION_DETAILS(2),
ASSIGNING_ANSWERS_PROCESSEMENT(3),
ASSIGNING_ANSWERS_PROCESSEMENT(3), //NAO USADO NO PEDAGOGIGO OS ESTADOS INTERNOS RESOLVEM O PROBLEMA
ASSIGNED_ANSWERS(4),
PROCESSING(5),
PROCESSING_WITH_ANSWERS(6),
213,6 → 213,11
public void initClearances(QuestionarioImpl questionario, UserSessionImpl session, SimpleClearanceRuledSupport s) {
 
}
 
@Override
public Class getJobServiceTaskAnswersProcessor() {
return null;
}
};
}
 
284,9 → 289,10
 
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_ADMIN)
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_CHECK_STUDENTS_ADMIN)
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_TIPOLOGIAS_ADMIN)
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_CHECK_TEACHERS_ADMIN))
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ASSIGNEMENTS_CHECK_TEACHERS_ADMIN)
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_GERAIS))
{
 
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_FORM.name(),usession);
304,24 → 310,49
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_DELETE.name(),usession);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SAVE_ANSWER_PROCESSOR.name(),usession);
}
if(getStateEnum() == State.ASSIGNED_ANSWERS)
{
s.addClearance(QuestionarioClearancesOperation.QUESTIONARIO_REVERT_TO_ASSIGNATION_DETAILS.name(),usession);
s.addClearance(QuestionarioClearancesOperation.QUESTIONARIO_START_PROCESSEMENT.name(),usession);
}
if(getStateEnum() == State.PROCESSING)
{
s.addClearance(QuestionarioClearancesOperation.QUESTIONARIO_STOP_PROCESSEMENT.name(),usession);
}
if(getStateEnum() == State.PROCESSING_WITH_ANSWERS)
{
s.addClearance(QuestionarioClearancesOperation.QUESTIONARIO_STOP_PROCESSEMENT.name(),usession);
}
if(getStateEnum() == State.STOPED_WITH_ANSWERS)
{
s.addClearance(QuestionarioClearancesOperation.QUESTIONARIO_START_PROCESSEMENT.name(),usession);
}
if(getStateEnum() == QuestionarioImpl.State.ASSIGNATION_DETAILS)
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SAVE_FORM.name(),usession);
}
}
 
 
//ANO SEMESTRE ESPECIFICO apenas neste estado, em atribuição de respostas e respostas atribuidas já não permite
if(getStateEnum() == QuestionarioImpl.State.ASSIGNATION_DETAILS)
{
if((usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SAVE_FORM.name(),usession);
}
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_ASSIGNATION_OPERATIONS.name(),usession);
}
 
getiAnswersProcessorClass().initClearances(this,usession,s);
}
if(getStateEnum() == State.ASSIGNING_ANSWERS_PROCESSEMENT)
if(getStateEnum() == QuestionarioImpl.State.STOPED_WITH_ANSWERS || getStateEnum() == QuestionarioImpl.State.PROCESSING || getStateEnum() == QuestionarioImpl.State.PROCESSING_WITH_ANSWERS)
{
 
if(usession.getUser().isSuperuserOrAdmin()
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_ADMIN)
|| usession.getUser().hasRole(Globals.QUESTIONARIOS_GERAIS))
{
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_DASHBOARD.name(),usession);
s.addClearance(QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SEE_FORM.name(),usession);
}
}
}
//AS CLEARANCES SAO VERIFICADAS LA DENTRO PARA TODOS OS ESTADOS
getiAnswersProcessorClass().initClearances(this,usession,s);
setClearanceRuledSupport(s);
}
 
338,6 → 369,13
QUESTIONARIO_DELETE,
QUESTIONARIO_REVERT_ALL_ASSIGNEMENTS,
 
 
QUESTIONARIO_PUT_ANSWERS_ASSIGNED,
QUESTIONARIO_REVERT_TO_ASSIGNATION_DETAILS,
 
QUESTIONARIO_START_PROCESSEMENT,
QUESTIONARIO_STOP_PROCESSEMENT,
 
/*Pedagogico Cursos*/
QUESTIONARIO_SET_ANO_SEMESTRE,
QUESTIONARIO_SCHEDULLE_SELECT_COURSES,
347,7 → 385,10
QUESTIONARIO_SEE_START_ASSIGN_ANSWERS,
QUESTIONARIO_CHANGE_ASSIGNEMENTS,
QUESTIONARIO_CHANGE_ASSIGNEMENTS_CHECK_TEACHERS,
QUESTIONARIO_FINNISH_ASSIGNEMENTS,
QUESTIONARIO_CHANGE_ASSIGNEMENTS_USE_UNIT,
 
QUESTIONARIO_SEE_DASHBOARD
 
;
 
public static QuestionarioClearancesOperation parse(String clearance)
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/CourseUnitImpl.java
511,8 → 511,36
setTipologias(tipologias.serialize());
}
 
public TipologiaPersistent loadPersistent(Tipologia myTipo)
public static class TipologiaLoadExeption extends Exception
{
boolean teacherFail = false;
boolean turmaFail = false;
 
public TipologiaLoadExeption(boolean teacherFail, boolean turmaFail) {
this.teacherFail = teacherFail;
this.turmaFail = turmaFail;
}
 
public boolean isTeacherFail() {
return teacherFail;
}
 
public boolean isTurmaFail() {
return turmaFail;
}
 
@Override
public String getMessage() {
return "Professor: " + (teacherFail? "Falhou" : "OK") + " Turma: " + (turmaFail? "Falhou" : "OK");
}
}
/**
*
* @param myTipo
* @return
*/
public TipologiaPersistent loadPersistent(Tipologia myTipo) throws TipologiaLoadExeption
{
TipologiaPersistent tipologiaPersistent = new TipologiaPersistent();
tipologiaPersistent.setHorRef(myTipo.isHorRef());
tipologiaPersistent.setExtra(myTipo.isExtra());
526,7 → 554,7
if(tipologiaPersistent.getCourseUnitTurma() == null || tipologiaPersistent.getTeacher() == null)
{
logger.error("Turma ou professor nao encontrados enquanto fazia uma tipologia persistente: turma:" + myTipo.getCdTurma() + " teacher code: " + myTipo.getCdDocente());
return null;
throw new TipologiaLoadExeption(tipologiaPersistent.getTeacher() == null,tipologiaPersistent.getCourseUnitTurma() == null);
}
return tipologiaPersistent;
}
641,7 → 669,16
 
protected boolean extra;
protected boolean horRef;
protected boolean tdocturma = false;
 
public boolean isTdocturma() {
return tdocturma;
}
 
public void setTdocturma(boolean tdocturma) {
this.tdocturma = tdocturma;
}
 
public boolean isUse() {
return use;
}
775,7 → 812,14
ArrayList<Tipologia> tipologiasExtraAdicionadas = new ArrayList<Tipologia>();
ArrayList<Tipologia> tipologiasUsadas = new ArrayList<Tipologia>();
ArrayList<Tipologia> tipologiasMarcadas = new ArrayList<Tipologia>();
ArrayList<Tipologia> tipologiasTdocTurma = new ArrayList<Tipologia>();
 
public ArrayList<Tipologia> getTipologiasTdocTurma() {
return tipologiasTdocTurma == null ? new ArrayList<Tipologia>() : tipologiasTdocTurma;
}
 
public void setTipologiasTdocTurma(ArrayList<Tipologia> tipologiasTdocTurma) { this.tipologiasTdocTurma = tipologiasTdocTurma; }
 
public ArrayList<Tipologia> getTipologiasHorarioReferencia() {
 
return tipologiasHorarioReferencia == null ? new ArrayList<Tipologia>() : tipologiasHorarioReferencia;
822,11 → 866,13
.include("tipologiasHorarioReferencia", Tipologias.class)
.include("tipologiasUsadas", Tipologias.class)
.include("tipologiasMarcadas", Tipologias.class)
.include("tipologiasTdocTurma", Tipologias.class)
.include("cdTipologia", Tipologia.class)
.include("cdDocente", Tipologia.class)
.include("cdTurma", Tipologia.class)
.include("dsTipologia",Tipologia.class)
.include("ocorrencias", Tipologia.class)
.include("tdocturma", Tipologia.class)
.create();
return genson;
}
844,6 → 890,7
.include("horRef", Tipologia.class)
.include("extra", Tipologia.class)
.include("use", Tipologia.class)
.include("tdocturma", Tipologia.class)
.include("markWarning", Tipologia.class)
.create();
return genson;
914,6 → 961,14
return serializeMergedList(obtainMergeTipologias());
}
 
 
/**
* Junta todas as tipologias obtidas dos sumarios, horario(ref+trab) + extra
* e coloca todas numa lista de unicas
* Marca-as com isHorario, isSumario, isExtra
* @return
*/
 
public ArrayList<Tipologia> obtainMergeTipologias()
{
ArrayList<Tipologia> merge = new ArrayList<Tipologia>();
975,10 → 1030,27
}
}
}
if(getTipologiasTdocTurma() != null)
for(Tipologia t: getTipologiasTdocTurma())
{
for(Tipologia tMerge: merge)
{
if(tMerge.equals(t))
{
tMerge.setUse(true);
break;
}
}
}
return merge;
}
 
 
/**
*
*
* @param courseUnit
* @return
*/
public ArrayList<Tipologia> obtainTipologiasSimples(CourseUnit courseUnit)
{
ArrayList<Tipologia> merge = new ArrayList<Tipologia>();
990,6 → 1062,7
fullfillTipologiasSimples(getTipologiasHorarioReferencia(), docenteTurmas);
fullfillTipologiasSimples(getTipologiasMarcadas(), docenteTurmas);
fullfillTipologiasSimples(getTipologiasUsadas(), docenteTurmas);
fullfillTipologiasSimples(getTipologiasTdocTurma(), docenteTurmas);
 
 
if(docenteTurmas.size() == 0)
1003,6 → 1076,7
{
Tipologia simples = new Tipologia();
simples.setMarkWarning(true);
//simples.setUse(true);
simples.setCdDocente(""+t.getSigesCode());
simples.setCdTurma(turma.getTurma());
simples.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
1025,6 → 1099,14
return merge;
}
 
/**
* Cria uma tipologia Simples para cada par Docente-Turma nesta cadeira olhando para
* todas as tipologias existentes, uma vez que o Baco não guarda associações entre
* Docentes e Turmas isso será retirado das tipologias importadas
*
* @param tipologias
* @param docenteTurmas
*/
private void fullfillTipologiasSimples(ArrayList<Tipologia> tipologias, Map<String, Map<String, Tipologia>> docenteTurmas) {
if(tipologias != null)
for(Tipologia tipo: tipologias)
1041,17 → 1123,22
simples.setCdTurma(tipo.getCdTurma());
simples.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
simples.setDsTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_DS);
//simples.setUse(true);//TODAS USADAS
if(tipo.hasOcorrencias())
{
simples.setOcorrencias(tipo.getOcorrencias());
}
turmasDocente.put(tipo.getCdTurma(),simples);
if(tipo.isTdocturma())
simples.setTdocturma(true);
}
if(tipo.hasOcorrencias())
else if(tipo.hasOcorrencias())
{
if(simples.getOcorrencias() == null)
simples.setOcorrencias(0);
simples.setOcorrencias(simples.getOcorrencias()+tipo.getOcorrencias());
if(tipo.isTdocturma())
simples.setTdocturma(true);
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/UserDaoImpl.java
7,9 → 7,11
import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.Teacher;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.common.SearchTypeEnum;
import pt.estgp.estgweb.utils.RoleManager;
 
import java.io.Serializable;
import java.util.ArrayList;
133,6 → 135,16
}
}
 
public List<User> loadRoleUsers(String role, int maxResults, int firstResult)
{
Criteria c = createCriteria()
.add(like("roles","%" + role + RoleManager.ROLE_SEPARATOR +"%"))
.addOrder(Order.asc("name"))
.setMaxResults(maxResults)
.setFirstResult(firstResult);
return c.list();
}
 
public List<User> loadRoleUsers(String role)
{
if(role == null || role.trim().length() == 0)
148,6 → 160,16
return users;
}
 
public List<Teacher> loadRoleTeachers(String role)
{
if(role == null || role.trim().length() == 0)
return new ArrayList<Teacher>();
List<Teacher> users = createCriteria(Teacher.class).add(like("roles", "%" + role + ",%")).addOrder(Order.asc("name")).list();
return users;
}
 
 
 
public List<User> loadRoleAreaUsers(String role, String area)
{
Criteria c = createCriteria().add(like("roles", "%" + role + "%")).addOrder(Order.asc("name"));
169,6 → 191,11
return findUsers(textToSearch, null);
}
 
public List<User> findUsersFromClassUserAndTeacherOnly()
{
return createCriteria().add(or(eq("class","UserImpl"),eq("class","TeacherImpl"))).list();
}
 
public List<User> findUsers(String textToSearch, String typeToSearch)
{
Criteria criteria;
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/EventFormacoesDaoImpl.java
New file
0,0 → 1,24
package pt.estgp.estgweb.domain.dao.impl;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class EventFormacoesDaoImpl extends EventFormacoesDao
{
private EventFormacoesDaoImpl()
{
}
 
public static EventFormacoesDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new EventFormacoesDaoImpl();
return (EventFormacoesDaoImpl) myInstance;
}
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/QuestionarioDaoImpl.java
1,15 → 1,18
package pt.estgp.estgweb.domain.dao.impl;
 
import jomm.dao.DaoException;
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.QuestionarioImpl;
import pt.estgp.estgweb.domain.*;
 
import java.util.ArrayList;
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.eq;
import static org.hibernate.criterion.Restrictions.*;
 
/**
* @author Jorge Machado
63,5 → 66,295
}
}
 
public List<QuestionarioImpl> findProcessing()
{
try
{
Criteria criteria = createCriteria();
criteria.add(or(eq("state",QuestionarioImpl.State.PROCESSING.name()),eq("state",QuestionarioImpl.State.PROCESSING_WITH_ANSWERS.name())));
return criteria.list();
}
catch (HibernateException e)
{
throw new DaoException(e);
}
}
 
public List<QuestionarioImpl> findNotClosed()
{
try
{
Criteria criteria = createCriteria();
criteria.add(not(or(or(eq("state",QuestionarioImpl.State.CLOSED.name()),eq("state",QuestionarioImpl.State.PROCESSING_OLAP.name())),
eq("state",QuestionarioImpl.State.OLAP.name()))))
.addOrder(Order.desc("id"));
return criteria.list();
}
catch (HibernateException e)
{
throw new DaoException(e);
}
}
 
 
public long getNumeroRespostas(long questionarioId)
{
Query q = getCurrentSession().createQuery
("select count(r.id) from r in class " + QuestionarioResposta.class.getName() + " " +
" JOIN r.questionario q " +
" where q.id = " + questionarioId);
Object result = q.uniqueResult();
if(result != null && ((Long)result) > 0)
{
return (Long)result;
}
else
return 0;
}
public long getNumeroAlunosComRespostas(long questionarioId)
{
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" count(distinct a.aluno.id) AS respostasAlunos " +
"from " + QuestionarioPedagogicoCursoAfeto.class.getName() + " c " +
"JOIN c.questionario q " +
"JOIN c.unidadesAfetas u " +
"JOIN u.tipologiasRequisitadas t " +
"JOIN t.alunosRequisitados a " +
"JOIN a.respostaRequisitada rR " +
"JOIN rR.resposta r " +
"WHERE q.id = :id ");
 
q.setLong("id",questionarioId);
Object result = q.uniqueResult();
if(result != null)
return (Long) result;
return 0;
}
public long getNumeroUnidadesUsadas(long questionarioId)
{
Query q = getCurrentSession().createQuery
("select count(u.id) from u in class " + QuestionarioPedagogicoUnidadeCurricularAfeta.class.getName() + " " +
" JOIN u.cursoAfeto c " +
" JOIN c.questionario q " +
" where u.usar = true AND q.id = " + questionarioId);
Object result = q.uniqueResult();
if(result != null && ((Long)result) > 0)
{
return (Long)result;
}
else
return 0;
}
 
public long getNumeroRespostasRequisitadas(long questionarioId)
{
Query q = getCurrentSession().createQuery
("select count(r.id) from r in class " + QuestionarioRespostaRequisitada.class.getName() + " " +
" JOIN r.questionario q " +
" where q.id = " + questionarioId);
Object result = q.uniqueResult();
if(result != null && ((Long)result) > 0)
{
return (Long)result;
}
else
return 0;
}
 
/*
public AnnouncementDaoImpl.FindUsersResult findUsersEmails(Long id,boolean onlyNotAnswered)
{
 
AnnouncementDaoImpl.FindUsersResult findUsersResult = new AnnouncementDaoImpl.FindUsersResult();
List<String> users = new ArrayList<String>();
findUsersResult.emails = users;
 
 
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" u.outEmail, u.preferrefEmail, u.email " +
"from " + QuestionarioRespostaRequisitada.class.getName() + " rR " +
"JOIN rR.questionario q " +
"JOIN rR.user u " +
"WHERE q.id = :id " +
(onlyNotAnswered? " AND rR.resposta is null " : "" ) +
"GROUP BY u.id");
 
q.setLong("id",id);
List<Object[]> results = (List<Object[]>) q.list();
 
fullFillResults(findUsersResult, results);
 
return findUsersResult;
 
 
}
*/
 
public AnnouncementDaoImpl.FindUsersIdResult findUsersIds(Long id,boolean onlyNotAnswered)
{
 
AnnouncementDaoImpl.FindUsersIdResult findUsersResult = new AnnouncementDaoImpl.FindUsersIdResult();
List<Long> users = new ArrayList<Long>();
findUsersResult.userIds = users;
 
 
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" u.id " +
"from " + QuestionarioRespostaRequisitada.class.getName() + " rR " +
"JOIN rR.questionario q " +
"JOIN rR.user u " +
"WHERE q.id = :id " +
(onlyNotAnswered? " AND rR.resposta is null " : "" ) +
"GROUP BY u.id");
 
q.setLong("id",id);
List<Object> results = (List<Object>) q.list();
 
 
for(Object result: results)
{
findUsersResult.userIds.add((Long) result);
}
findUsersResult.users = results.size();
return findUsersResult;
}
 
public AnnouncementDaoImpl.FindUsersIdResult findUsersIdsPedagogico(boolean onlyNotAnswered,long cursoAfetoId,long unidadeAfetaId)
{
 
AnnouncementDaoImpl.FindUsersIdResult findUsersResult = new AnnouncementDaoImpl.FindUsersIdResult();
List<Long> users = new ArrayList<Long>();
findUsersResult.userIds = users;
 
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" u.id " +
"from " + QuestionarioPedagogicoAlunoRequisitado.class.getName() + " aR " +
"JOIN aR.respostaRequisitada rR " +
"JOIN rR.user u " +
"WHERE " +
(cursoAfetoId > 0 ?
" aR.tipologiaRequisitada.unidadeAfeta.cursoAfeto.id = " + cursoAfetoId :
" aR.tipologiaRequisitada.unidadeAfeta.id = " + unidadeAfetaId) +
(onlyNotAnswered? " AND rR.resposta is null " : "" ) +
"GROUP BY u.id");
 
List<Object> results = (List<Object>) q.list();
 
for(Object result: results)
{
findUsersResult.userIds.add((Long) result);
}
findUsersResult.users = results.size();
return findUsersResult;
 
 
}
 
 
public AnnouncementDaoImpl.FindUsersIdResult findUsersIdsPedagogicoAllProcessing(boolean onlyNotAnswered)
{
 
AnnouncementDaoImpl.FindUsersIdResult findUsersResult = new AnnouncementDaoImpl.FindUsersIdResult();
List<Long> users = new ArrayList<Long>();
findUsersResult.userIds = users;
 
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" u.id " +
"from " + QuestionarioPedagogicoAlunoRequisitado.class.getName() + " aR " +
"JOIN aR.respostaRequisitada rR " +
"JOIN rR.user u " +
"WHERE " +
 
"( " +
" aR.tipologiaRequisitada.unidadeAfeta.cursoAfeto.questionario.state = :sP1 " +
" OR " +
" aR.tipologiaRequisitada.unidadeAfeta.cursoAfeto.questionario.state = :sP2 " +
")" +
 
 
(onlyNotAnswered? " AND rR.resposta is null " : "" ) +
"GROUP BY u.id");
 
q.setString("sP1",QuestionarioImpl.State.PROCESSING.name());
q.setString("sP2",QuestionarioImpl.State.PROCESSING_WITH_ANSWERS.name());
 
List<Object> results = (List<Object>) q.list();
 
for(Object result: results)
{
findUsersResult.userIds.add((Long) result);
}
findUsersResult.users = results.size();
return findUsersResult;
 
 
}
 
public static class QuestionarioStatsVars
{
public long cursos;
public long unidades;
public long profs;
public long alunos;
public long turmas;
public long alunosDeUsadas;
public long profsDeUsadas;
public long unidadesUsadas;
public long tipologiasUsadas;
public long profsTimeStudents;
public long respostasRequisitadas;
public long respostasObtidas;
public long alunosQueResponderam;
}
 
 
 
 
public QuestionarioStatsVars loadQuestionarioStatsPedagogico(long questionarioId)
{
QuestionarioStatsVars questionarioStatsVars = new QuestionarioStatsVars();
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" count(distinct c.id) AS cursos " +
",count(distinct u.id) AS unidades " +
",sum (u.profs) AS profs " +
",count(distinct t.cdTurma) AS turmas " +
",sum (u.students) AS students " +
",count(distinct a.aluno.id) AS alunosDeUsadas " +
",count(distinct t.docenteAfeto.id) AS profsDeUsadas " +
",count(distinct t.id) AS tipologiasRequisitadas " +
",sum (case when u.usar = true then (u.profs * u.students) else 0 end) AS respostasEsperadas " +
"from " + QuestionarioPedagogicoCursoAfeto.class.getName() + " c " +
"JOIN c.questionario q " +
"JOIN c.unidadesAfetas u " +
"JOIN u.tipologiasRequisitadas t " +
"JOIN t.alunosRequisitados a " +
 
"WHERE q.id = :id " +
"GROUP BY q.id");
 
q.setLong("id",questionarioId);
Object[] results = (Object[]) q.uniqueResult();
 
if(results != null && results[0] != null)
{
questionarioStatsVars.cursos = (Long) results[0];
questionarioStatsVars.unidades = (Long) results[1];
questionarioStatsVars.profs = (Long) results[2];
questionarioStatsVars.turmas = (Long) results[3];
questionarioStatsVars.alunos = (Long) results[4];
questionarioStatsVars.alunosDeUsadas = (Long) results[5];
questionarioStatsVars.profsDeUsadas = (Long) results[6];
questionarioStatsVars.tipologiasUsadas = (Long) results[7];
questionarioStatsVars.profsTimeStudents = (Long) results[8];
questionarioStatsVars.alunosQueResponderam = getNumeroAlunosComRespostas(questionarioId);
questionarioStatsVars.respostasRequisitadas = getNumeroRespostasRequisitadas(questionarioId);
questionarioStatsVars.respostasObtidas = getNumeroRespostas(questionarioId);
questionarioStatsVars.unidadesUsadas = getNumeroUnidadesUsadas(questionarioId);
if(questionarioStatsVars.unidadesUsadas > questionarioStatsVars.unidades)
logger.error("TEM UM ERRO NA QUERY, a contagem de usadas com o distinct da diferente de com o SUM");
 
}
 
return questionarioStatsVars;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/QuestionarioPedagogicoCursoAfetoDaoImpl.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.Query;
import org.hibernate.criterion.Projections;
import pt.estgp.estgweb.domain.QuestionarioPedagogicoCursoAfeto;
 
import java.util.List;
13,6 → 15,8
*/
public class QuestionarioPedagogicoCursoAfetoDaoImpl extends QuestionarioPedagogicoCursoAfetoDao{
 
private static final Logger logger = Logger.getLogger(QuestionarioPedagogicoCursoAfetoDaoImpl.class);
 
public static QuestionarioPedagogicoCursoAfetoDaoImpl getInstance() {
if (myInstance == null)
myInstance = new QuestionarioPedagogicoCursoAfetoDaoImpl();
33,9 → 37,17
.list();
}
 
public List<Long> findCursosAfetosIds(long questionarioId)
{
return createCriteria()
.setProjection(Projections.distinct(Projections.property("id")))
.add(eq("questionario.id", questionarioId))
.list();
}
 
 
 
 
public static class CourseStatsVars
{
public long unidades;
46,6 → 58,8
public long naoUsadas;
}
 
 
 
public CourseStatsVars loadStats(long cursoAfetoId)
{
CourseStatsVars courseStatsVars = new CourseStatsVars();
63,13 → 77,74
 
q.setLong("id",cursoAfetoId);
Object[] results = (Object[]) q.uniqueResult();
courseStatsVars.porVer = (Long) results[0];
courseStatsVars.porVerProfs = (Long) results[1];
courseStatsVars.naoUsadas = (Long) results[2];
courseStatsVars.marcadas = (Long) results[3];
courseStatsVars.observadas = (Long) results[4];
courseStatsVars.unidades = (Long) results[5];
 
if(results != null && results[0] != null)
{
courseStatsVars.porVer = (Long) results[0];
courseStatsVars.porVerProfs = (Long) results[1];
courseStatsVars.naoUsadas = (Long) results[2];
courseStatsVars.marcadas = (Long) results[3];
courseStatsVars.observadas = (Long) results[4];
courseStatsVars.unidades = (Long) results[5];
}
 
return courseStatsVars;
}
 
public long countRespostas(long cursoAfetoId)
{
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" count(distinct r.id) AS respostas " +
"from " + QuestionarioPedagogicoCursoAfeto.class.getName() + " c " +
"JOIN c.unidadesAfetas u " +
"JOIN u.tipologiasRequisitadas t " +
"JOIN t.alunosRequisitados a " +
"JOIN a.respostaRequisitada rR " +
"JOIN rR.resposta r " +
"WHERE c.id = :id ");
 
q.setLong("id",cursoAfetoId);
Object result = q.uniqueResult();
if(result != null)
return (Long) result;
return 0;
}
public long countAlunosComRespostas(long cursoAfetoId)
{
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" count(distinct a.aluno.id) AS respostasAlunos " +
"from " + QuestionarioPedagogicoCursoAfeto.class.getName() + " c " +
"JOIN c.unidadesAfetas u " +
"JOIN u.tipologiasRequisitadas t " +
"JOIN t.alunosRequisitados a " +
"JOIN a.respostaRequisitada rR " +
"JOIN rR.resposta r " +
"WHERE c.id = :id ");
 
q.setLong("id",cursoAfetoId);
Object result = q.uniqueResult();
if(result != null)
return (Long) result;
return 0;
}
 
public long countAlunos(long cursoAfetoId)
{
Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
" count(distinct a.aluno.id) AS respostasAlunos " +
"from " + QuestionarioPedagogicoCursoAfeto.class.getName() + " c " +
"JOIN c.unidadesAfetas u " +
"JOIN u.tipologiasRequisitadas t " +
"JOIN t.alunosRequisitados a " +
"JOIN a.respostaRequisitada rR " +
"WHERE c.id = :id ");
 
q.setLong("id",cursoAfetoId);
Object result = q.uniqueResult();
if(result != null)
return (Long) result;
return 0;
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseDaoImpl.java
2,7 → 2,10
 
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.*;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import pt.estgp.estgweb.domain.Course;
import pt.estgp.estgweb.domain.CourseImpl;
import pt.estgp.estgweb.domain.CourseUnit;
67,7 → 70,24
.uniqueResult();
}
 
public int countCoursesUnits(String importYear,long courseId,String semestre)
{
/* return createCriteria()
.createAlias("courseUnits", "c")
.setProjection(Projections.property("c.id"))
.add(eq("c.importYear", importYear))
.add(eq("id", courseId))
.list().size();
*/
return (Integer) createCriteria(CourseUnit.class)
.setProjection(Projections.rowCount())
.add(eq("importYear",importYear))
.add(eq("semestre",semestre))
.add(eq("course.id",courseId))
.uniqueResult();
}
 
 
public int countCoursesUnitsTurmas(String importYear,long courseId)
{
return (Integer) createCriteria(CourseUnitTurma.class)
170,6 → 190,33
.list();
}
 
public List<Course> findAllActiveOrderByNameEvenWithoutCourseUnit()
{
Criteria c = createCriteria();
 
/* c.setProjection(Projections.projectionList()
.add(Projections.distinct(Projections.id())));*/
c.add(eq("status", true));
return c.addOrder(Order.asc("name"))
.list();
}
 
public List<Course> findAllShowStudiesPlanCoursesOrderByNameEvenWithoutCourseUnit(String institutionalCode, String degree)
{
Criteria c = createCriteria();
 
c.add(eq("showStudiesPlan", true));
 
if (degree != null && degree.length() > 0)
c.add(eq("degree", degree));
 
if (institutionalCode != null && institutionalCode.length() > 0)
c.add(eq("institutionalCode", institutionalCode));
 
return c.addOrder(Order.asc("name"))
.list();
}
 
public List<Course> findAllActiveOrderByNameEvenWithoutCourseUnit(String importYear, String area, String type)
{
Criteria c = createCriteria();
231,7 → 278,7
}
if (institutionCode != null && institutionCode.trim().length() > 0)
{
query += logic + "cu.institutionCode = :institutionCode ";
query += logic + "c.institutionalCode = :institutionCode ";
logic = " and ";
}
if (area != null && area.length() > 0)
350,4 → 397,6
.add(Expression.isNotNull("area"))
.list();
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/EventClassDaoImpl.java
New file
0,0 → 1,24
package pt.estgp.estgweb.domain.dao.impl;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class EventClassDaoImpl extends EventClassDao
{
private EventClassDaoImpl()
{
}
 
public static EventClassDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new EventClassDaoImpl();
return (EventClassDaoImpl) myInstance;
}
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/TeacherDaoImpl.java
1,12 → 1,16
package pt.estgp.estgweb.domain.dao.impl;
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.exception.GenericJDBCException;
import org.hibernate.sql.JoinFragment;
import pt.estgp.estgweb.domain.Teacher;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.utils.DatesUtils;
 
import java.util.List;
 
21,6 → 25,7
*/
public class TeacherDaoImpl extends TeacherDao
{
private static final Logger logger = Logger.getLogger(TeacherDaoImpl.class);
private TeacherDaoImpl(){}
 
// protected Class getReferenceClass() {
63,6 → 68,38
}
}
 
public List<Long> loadByAreaWithUnitsInLast3Years( String importYear)
{
try
{
 
String lastYear = DatesUtils.getPreviousImportYear(importYear);
String twoYearsAgo = DatesUtils.getPreviousImportYear(lastYear);
 
System.out.println(lastYear);
System.out.println(twoYearsAgo);
 
 
Query q = AbstractDao.getCurrentSession().createQuery(
"select distinct t.id from " + Teacher.class.getName() + " t " +
"join t.teachedUnits tu " +
"where tu.importYear = :importYear or " +
"tu.importYear = :lastYear or " +
"tu.importYear = :twoYearsAgo " +
"order by t.name");
q.setString("importYear",importYear);
q.setString("lastYear",lastYear);
q.setString("twoYearsAgo",twoYearsAgo);
 
return q.list();
}
catch(GenericJDBCException e)
{
logger.error(e,e);
throw e;
}
}
 
public Teacher loadByBi(String bi)
{
return (Teacher) createCriteria().add(eq("bi",bi)).uniqueResult();
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseStudiesPlanDaoImpl.java
New file
0,0 → 1,19
package pt.estgp.estgweb.domain.dao.impl;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class CourseStudiesPlanDaoImpl extends CourseStudiesPlanDao {
 
public static CourseStudiesPlanDaoImpl getInstance() {
if (myInstance == null)
myInstance = new CourseStudiesPlanDaoImpl();
return (CourseStudiesPlanDaoImpl) myInstance;
}
 
 
 
}
Property changes:
Added: svn:executable
+ *
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/EventGenericDaoImpl.java
New file
0,0 → 1,24
package pt.estgp.estgweb.domain.dao.impl;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class EventGenericDaoImpl extends EventGenericDao
{
private EventGenericDaoImpl()
{
}
 
public static EventGenericDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new EventGenericDaoImpl();
return (EventGenericDaoImpl) myInstance;
}
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/AnnouncementDaoImpl.java
41,6 → 41,13
public int users;
public List<String> emails;
}
 
public static class FindUsersIdResult
{
public int users;
public List<Long> userIds;
}
 
public FindUsersResult findUsersEmails(String year, String department, long courseId, long courseUnitId, String semestre, CreateAnnouncementService.MessageTarget target)
{
FindUsersResult findUsersResult = new FindUsersResult();
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/QuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl.java
16,16 → 16,16
return (QuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl) myInstance;
}
 
public List<QuestionarioPedagogicoUnidadeCurricularAfeta> find(long questionarioId, String cursoCode,String codeUnidade)
public List<QuestionarioPedagogicoUnidadeCurricularAfeta> find(long questionarioId, String cursoCode,Long idUnidade)
{//pt.estgp.estgweb.domain.dao.DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().getCurrentSession().createCriteria(QuestionarioPedagogicoUnidadeCurricularAfeta.class).add(eq("cursoAfeto.id","1")).list()
//add(eq("cuA.questionario.id", new Long(20))).add(eq("codigoUnidade","209535")).add(eq("cuA.codigoCurso","9119"))
Query q = getCurrentSession().createQuery("select c from c in class " + QuestionarioPedagogicoUnidadeCurricularAfeta.class.getName() + " " +
" join c.cursoAfeto as curso " +
"where curso.questionario.id = :questionarioId and curso.codigoCurso = :codigoCurso" +
" and c.codigoUnidade = :codigoUnidade");
" and c.courseUnit.id = :idUnidade");
q.setLong("questionarioId", questionarioId);
q.setString("codigoCurso", cursoCode);
q.setString("codigoUnidade",codeUnidade);
q.setLong("idUnidade",idUnidade);
return q.list();
 
/*DaoFactory.getCourseDaoImpl()
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseUnitDaoImpl.java
352,13 → 352,14
 
public CourseUnit loadBySigesCodeUniqueMostRecent(String sigesCode, String courseCode, String semestre)
{
List<CourseUnit> cus =
createCriteria()
List<CourseUnit> cus;
Criteria cr = createCriteria()
.add(eq("code", sigesCode))
.add(eq("courseCode", courseCode))
.add(eq("semestre", semestre))
.addOrder(Order.desc("importYear"))
.setMaxResults(1).list();
.add(eq("courseCode", courseCode));
if(semestre != null)
cr.add(eq("semestre", semestre));
cr.addOrder(Order.desc("importYear")).setMaxResults(1);
cus = cr.list();
if(cus.size() > 0)
return cus.get(0);
logger.warn("Accessing unit not existent with siges code " + sigesCode + " course code: " + courseCode + " semestre: " + semestre);
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseDepartmentDaoImpl.java
New file
0,0 → 1,41
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.CourseDepartment;
 
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.eq;
 
/**
* Created by jorgemachado on 15/09/16.
*/
public class CourseDepartmentDaoImpl extends CourseDepartmentDao
{
public static CourseDepartmentDaoImpl getInstance() {
if (myInstance == null)
myInstance = new CourseDepartmentDaoImpl();
return (CourseDepartmentDaoImpl) myInstance;
}
 
 
public CourseDepartment findBySigla(String sigla)
{
try{
return (CourseDepartment) createCriteria().add(eq("sigla",sigla)).uniqueResult();
}catch(Exception e)
{}
return null;
}
 
public List<CourseDepartment> findActives()
{
return createCriteria().add(eq("active", true)).addOrder(Order.asc("institutionalCode")).addOrder(Order.asc("sigla")).list();
 
}
public List<CourseDepartment> findActives(String institutionalCode)
{
return createCriteria().add(eq("active", true)).add(eq("institutionalCode",institutionalCode)).list();
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/UserRoleConfigDaoImpl.java
7,6 → 7,7
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.eq;
import static org.hibernate.criterion.Restrictions.like;
 
/**
* Created by IntelliJ IDEA.
36,4 → 37,9
return null;
}
 
public List<UserRoleConfig> findRolesByPrefix(String prefix){
List<UserRoleConfig> userRoleConfigList = createCriteria().add(like("role", prefix + "%")).list();
return userRoleConfigList;
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/DaoFactory.java
11,6 → 11,10
public class DaoFactory
{
 
private static CourseDepartmentDaoImpl courseDepartmentDaoImpl;
private static EventClassDaoImpl eventClassDaoImpl;
private static EventFormacoesDaoImpl eventFormacoesDaoImpl;
 
public static JobDaoImpl getJobDaoImpl()
{
return JobDaoImpl.getInstance();
415,4 → 419,25
return SeccaoDaoImpl.getInstance();
}
 
public static CourseStudiesPlanDaoImpl getCourseStudiesPlanDaoImpl(){
return CourseStudiesPlanDaoImpl.getInstance();
}
 
public static CourseDepartmentDaoImpl getCourseDepartmentDaoImpl() {
return CourseDepartmentDaoImpl.getInstance();
}
 
public static EventClassDaoImpl getEventClassDaoImpl()
{
return EventClassDaoImpl.getInstance();
}
 
public static EventFormacoesDaoImpl getEventFormacoesDaoImpl()
{
return EventFormacoesDaoImpl.getInstance();
}
public static EventGenericDaoImpl getEventGenericDaoImpl()
{
return EventGenericDaoImpl.getInstance();
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/EventGenericRecordImpl.java
New file
0,0 → 1,29
package pt.estgp.estgweb.domain;
 
import java.io.Serializable;
import java.util.List;
 
/**
* Created by jorgemachado on 05/09/16.
*/
public class EventGenericRecordImpl extends EventGenericRecord {
@Override
public GenericUser getOwner() {
return null;
}
 
@Override
public List<String> getOwnerRoles() {
return null;
}
 
@Override
public String getChoosedOwnerRole() {
return null;
}
 
@Override
public Serializable getSerializable() {
return null;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/UserSessionImpl.java
308,4 → 308,11
return getUser() == null;
}
 
public String getShortName()
{
if(getName() != null)
return getName().split(" ")[0];
return getName();
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/CourseDepartmentImpl.java
New file
0,0 → 1,20
package pt.estgp.estgweb.domain;
 
import pt.estgp.estgweb.utils.ConfigProperties;
 
import java.io.Serializable;
 
/**
* Created by jorgemachado on 14/09/16.
*/
public class CourseDepartmentImpl extends CourseDepartment {
@Override
public Serializable getSerializable() {
return getSigla();
}
 
public String getSchoolFromInstitutionalCode()
{
return ConfigProperties.getProperty("institution.code.prefix." + getInstitutionalCode());
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/QuestionarioPedagogicoCursoAfetoImpl.java
22,4 → 22,13
{
setMarcadas(getMarcadas()+1);
}
 
public void resetAnswerStats() {
setStatTipologiasRequisitadas(0);
setStatRespostasRequisitadas(0);
}
 
public void incStatTipologiasRequisitadas(){ setStatTipologiasRequisitadas(getStatTipologiasRequisitadas()+1);}
public void incStatRespostasRequisitadas(){ setStatRespostasRequisitadas(getStatRespostasRequisitadas() + 1);}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/GenericUserImpl.java
50,6 → 50,18
return false;
}
 
public boolean hasRolePrefix(String r)
{
if (r == null || getRoles() == null || getRoles().length() == 0)
return false;
for (String role : RoleManager.getRolesFromSerial(getRoles()))
{
if (role.startsWith(r))
return true;
}
return false;
}
 
public boolean hasRole(List<String> roles)
{
return RoleManager.hasRole(this,roles);
/branches/v3/impl/src/java/pt/estgp/estgweb/filters/filters/EventManager.java
New file
0,0 → 1,61
package pt.estgp.estgweb.filters.filters;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.EventClass;
import pt.estgp.estgweb.domain.EventGeneric;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.AdminControlFilter;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.filters.exceptions.NeedAuthenticationException;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.RoleManager;
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;
 
public class EventManager extends AdminControlFilter {
private static final Logger logger = Logger.getLogger(EventManager.class);
 
private static final String ALL_ROLE = ConfigProperties.getProperty("user.super");
 
public void execute(ServiceRequest request, ServiceResponse response)
throws FilterException, Exception
{
 
}
 
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().isSuperuserOrAdmin())
return;
 
String eventClassIdParameter = (String) filterParameters.getParameter(0);
EventGeneric eventParameter = (EventGeneric) filterParameters.getParameter(1);
 
if(eventParameter.getId() > 0)
{
EventGeneric persistent = DaoFactory.getEventGenericDaoImpl().load(eventParameter.getId());
if(RoleManager.hasRole(userSession.getUser(), persistent.getEventClass().getManagersRole()))
return;
}
else
{
EventClass eventClass = DaoFactory.getEventClassDaoImpl().load(eventClassIdParameter);
if(RoleManager.hasRole(userSession.getUser(), eventClass.getManagersRole()))
return;
}
 
throw new AccessDeniedOperationException("fail.role");
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/tags/HasRolePrefixTag.java
New file
0,0 → 1,90
package pt.estgp.estgweb.web.tags;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.UserSessionImpl;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
 
public class HasRolePrefixTag extends BodyTagSupport
{
 
private static final Logger logger = Logger.getLogger(HasRolePrefixTag.class);
 
 
private String role;
private String rolePrefix;
 
public String getRolePrefix() {
return rolePrefix;
}
 
public void setRolePrefix(String rolePrefix) {
this.rolePrefix = rolePrefix;
}
 
public String getRole()
{
return role;
}
 
public void setRole(String role)
{
this.role = role;
}
 
public int doStartTag() throws JspException
{
if(go())
return EVAL_BODY_TAG;
else
return SKIP_BODY;
}
 
public boolean go()
{
UserSessionImpl userSession = (UserSessionImpl) pageContext.getRequest().getAttribute(Globals.USER_SESSION_KEY);
 
if(userSession != null && userSession.getUser() != null)
{
String[] roles = role.split(",");
String[] rolesPrefix = rolePrefix.split(",");
for(String role: roles)
{
if(userSession.getUser().hasRole(role))
return true;
}
for(String role: rolesPrefix)
{
if(userSession.getUser().hasRolePrefix(role))
return true;
}
}
return false;
}
 
public int doEndTag() throws JspException
{
if (go())
{
String toPage = bodyContent.getString().trim();
JspWriter writer = pageContext.getOut();
try
{
writer.write(toPage);
}
catch (Exception e)
{
logger.error(e, e);
throw new JspException(e);
}
}
 
// Continue processing this page
return EVAL_PAGE;
}
 
 
}
Property changes:
Added: svn:executable
+ *
/branches/v3/impl/src/java/pt/estgp/estgweb/web/tags/IsNotAuthenticatedTag.java
1,53 → 1,18
package pt.estgp.estgweb.web.tags;
 
import org.apache.log4j.Logger;
import org.apache.struts.taglib.logic.ConditionalTagBase;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.UserSessionImpl;
 
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
 
import pt.estgp.estgweb.domain.UserSessionImpl;
import pt.estgp.estgweb.Globals;
 
public class IsNotAuthenticatedTag extends BodyTagSupport
public class IsNotAuthenticatedTag extends ConditionalTagBase
{
 
private static final Logger logger = Logger.getLogger(IsNotAuthenticatedTag.class);
 
public int doStartTag() throws JspException
{
if (go())
return EVAL_BODY_TAG;
else
return SKIP_BODY;
}
 
public boolean go()
{
protected boolean condition() throws JspException {
UserSessionImpl userSession = (UserSessionImpl) pageContext.getRequest().getAttribute(Globals.USER_SESSION_KEY);
return userSession == null || userSession.getUser() == null;
return !(userSession != null && userSession.getUser() != null);
}
 
public int doEndTag() throws JspException
{
if (go())
{
String toPage = bodyContent.getString().trim();
JspWriter writer = pageContext.getOut();
try
{
writer.write(toPage);
}
catch (Exception e)
{
logger.error(e, e);
throw new JspException(e);
}
}
 
// Continue processing this page
return EVAL_PAGE;
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/tags/IsAuthenticatedTag.java
1,53 → 1,22
package pt.estgp.estgweb.web.tags;
 
import org.apache.log4j.Logger;
import org.apache.struts.taglib.logic.ConditionalTagBase;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.UserSessionImpl;
 
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
 
import pt.estgp.estgweb.domain.UserSessionImpl;
import pt.estgp.estgweb.domain.UserImpl;
import pt.estgp.estgweb.Globals;
 
public class IsAuthenticatedTag extends BodyTagSupport
public class IsAuthenticatedTag extends ConditionalTagBase
{
 
private static final Logger logger = Logger.getLogger(IsAuthenticatedTag.class);
 
public int doStartTag() throws JspException
{
if (go())
return EVAL_BODY_TAG;
else
return SKIP_BODY;
}
 
public boolean go()
{
 
@Override
protected boolean condition() throws JspException {
UserSessionImpl userSession = (UserSessionImpl) pageContext.getRequest().getAttribute(Globals.USER_SESSION_KEY);
return userSession != null && userSession.getUser() != null;
}
 
public int doEndTag() throws JspException
{
if (go())
{
String toPage = bodyContent.getString().trim();
JspWriter writer = pageContext.getOut();
try
{
writer.write(toPage);
}
catch (Exception e)
{
logger.error(e, e);
throw new JspException(e);
}
}
// Continue processing this page
return EVAL_PAGE;
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/WebProxy.java
1,11 → 1,9
package pt.estgp.estgweb.web;
 
import jomm.utils.StreamsUtils;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.StringsUtils;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
18,9 → 16,11
import java.io.OutputStream;
import java.net.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;
import java.util.zip.ZipInputStream;
import java.util.zip.InflaterInputStream;
import java.util.zip.GZIPInputStream;
 
/**
* @author Jorge Machado
197,8 → 197,24
String pathFinal = path.indexOf("?") >=0 ? URIUtil.encodePath(path.substring(0,path.indexOf("?")), "ISO-8859-1") + "?" +path.substring(path.indexOf("?")+1) : path;
System.out.println(pathFinal);
}
 
static Map<String,Boolean> urlOKCACHE = new HashMap<String, Boolean>();
static Map<String,Integer> urlOKCACHE_LAST_CHECK_COUNT = new HashMap<String, Integer>();
 
public static boolean checkExist( String server, String path)
{
String serverPathKey = server + "$" + path;
Boolean urlOk = urlOKCACHE.get(serverPathKey);
if(urlOk != null)
{
int count = urlOKCACHE_LAST_CHECK_COUNT.get(serverPathKey);
if(count > 0)
{
count = count-1;
urlOKCACHE_LAST_CHECK_COUNT.put(serverPathKey,count);
return urlOk;
}
}
 
String serverUrl = ConfigProperties.getProperty("server." + server);
String serverEncoding = ConfigProperties.getProperty(server + ".encoding");
210,19 → 226,27
try
{
 
String pathFinal = path.indexOf("?") >=0 ? URIUtil.encodePath(path.substring(0,path.indexOf("?")), "ISO-8859-1") + path.substring(path.indexOf("?")) : path;
System.out.println("Getting: " + serverUrl + pathFinal);
URL url = new URL(serverUrl + pathFinal);
String pathFinal = path.indexOf("?") >= 0 ? URIUtil.encodePath(path.substring(0,path.indexOf("?")), "ISO-8859-1") + path.substring(path.indexOf("?")) : path;
 
 
URLConnection con = url.openConnection();
InputStream stream = con.getInputStream();
String out = StreamsUtils.readString(stream);
stream.close();
System.out.println("Getting: " + serverUrl + pathFinal + " CHECK TIME");
URL url = new URL(serverUrl + pathFinal);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");
urlOKCACHE_LAST_CHECK_COUNT.put(serverPathKey,10);
if(huc.getResponseCode() == HttpURLConnection.HTTP_OK)
{
urlOKCACHE.put(serverPathKey,true);
huc.disconnect();
return true;
}
else
{
urlOKCACHE.put(serverPathKey,false);
huc.disconnect();
return false;
}
 
if(out.trim().length() == 0)
return false;
return true;
}
catch (FileNotFoundException e)
{
/branches/v3/impl/src/java/pt/estgp/estgweb/web/utils/GoogleRecaptcha.java
New file
0,0 → 1,48
package pt.estgp.estgweb.web.utils;
 
import jomm.utils.StreamsUtils;
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.utils.ConfigProperties;
 
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
 
/**
* Created by jorgemachado on 10/10/16.
*/
public class GoogleRecaptcha
{
private static String secretCaptcha = ConfigProperties.getProperty("google.recaptcha.secret.key");
private static String address = ConfigProperties.getProperty("google.recaptcha.address");
private static String paramSecret = ConfigProperties.getProperty("google.recaptcha.secret.param.name");
private static String paramResponse = ConfigProperties.getProperty("google.recaptcha.response.param.name");
 
private static final Logger logger = Logger.getLogger(GoogleRecaptcha.class);
 
 
public static boolean validateCaptcha(String responseUser)
{
try {
URL url = new URL(address + "?" + paramSecret + "=" + secretCaptcha + "&" + paramResponse + "=" + responseUser);
InputStream stream = url.openStream();
String responseGoogle = StreamsUtils.readString(stream);
JSONObject response = new JSONObject(responseGoogle);
stream.close();
if(response.getString("success").equals("true"))
return true;
 
} catch (MalformedURLException e) {
logger.error(e,e);
} catch (IOException e) {
logger.error(e,e);
} catch (JSONException e) {
logger.error(e, e);
}
return false;
 
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/utils/TestHttpServletRequest.java
20,8 → 20,11
*/
public class TestHttpServletRequest implements HttpServletRequest
{
 
Cookie[] cookies = new Cookie[1];
 
 
 
public TestHttpServletRequest(String requester)
{
cookies[0] = new Cookie(pt.estgp.estgweb.web.Globals.BACO_SESSION_COOKIE,requester);
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/courses/CourseForm.java
33,11 → 33,14
private List<String> areas = Globals.DEPARTAMENTOS;
 
 
 
 
public CourseForm()
{
courseView = new CourseView();
}
 
 
public String getForUser() {
return forUser;
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/courses/CourseStudiesPlansAdminForm.java
New file
0,0 → 1,96
package pt.estgp.estgweb.web.form.courses;
 
import pt.estgp.estgweb.domain.CourseStudiesPlanImpl;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.services.courses.xsd.Curso;
import pt.estgp.estgweb.services.courses.xsd.CursoImpl;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class CourseStudiesPlansAdminForm extends ApplicationForm
{
 
//Wrapper do Plano de estudos em edicao com versao e descricao de versao
private CourseStudiesPlanImpl courseStudiesPlan = DomainObjectFactory.createCourseStudiesPlanImpl();
//Plano de Estudos deserializado de XML para classe correspondente ao xsd em src/planoestudos.xsd
private Curso planoEstudos = new CursoImpl();
//curso em edição
private long courseId = 0;
//flag para indicar se o plano em edição é o ultimo plano criado
private boolean versaoVigor = false;
 
private String semestreId;
 
private String perfilId;
 
private long sourcePlanId;
 
 
 
 
public CourseStudiesPlansAdminForm()
{
 
 
}
 
public long getSourcePlanId() {
return sourcePlanId;
}
 
public void setSourcePlanId(long sourcePlanId) {
this.sourcePlanId = sourcePlanId;
}
 
public String getSemestreId() {
return semestreId;
}
 
public void setSemestreId(String semestreId) {
this.semestreId = semestreId;
}
 
public String getPerfilId() {
return perfilId;
}
 
public void setPerfilId(String perfilId) {
this.perfilId = perfilId;
}
 
public CourseStudiesPlanImpl getCourseStudiesPlan() {
return courseStudiesPlan;
}
 
public void setCourseStudiesPlan(CourseStudiesPlanImpl courseStudiesPlan) {
this.courseStudiesPlan = courseStudiesPlan;
}
 
public long getCourseId() {
return courseId;
}
 
public void setCourseId(long courseId) {
this.courseId = courseId;
}
 
public boolean isVersaoVigor() {
return versaoVigor;
}
 
public void setVersaoVigor(boolean versaoVigor) {
this.versaoVigor = versaoVigor;
}
 
public Curso getPlanoEstudos() {
return planoEstudos;
}
 
public void setPlanoEstudos(Curso planoEstudos) {
this.planoEstudos = planoEstudos;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/courseunits/CourseUnitEvaluationForm.java
74,7 → 74,8
+courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprovEspecial();
if(!totalAprovadosCorrecto)
addMessage(errors,request,"error.evaluation.report.total.aprovados.epocas.wrong");
if(courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprov1013() +courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprov1416() + courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprov1720() != 100 )
if(courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprovTotal().intValue() != 0 &&
courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprov1013() +courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprov1416() + courseUnitEvaluationView.getCourseUnitEvaluation().getNumAlunosAprov1720() != 100 )
addMessage(errors,request,"error.evaluation.report.total.aprovados.grades");
 
try{
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/events/MyEventGenericForm.java
New file
0,0 → 1,15
package pt.estgp.estgweb.web.form.events;
 
import pt.estgp.estgweb.domain.DomainObjectFactory;
 
/**
* Created by jorgemachado on 07/10/16.
*/
public class MyEventGenericForm extends MyEventForm
{
 
public MyEventGenericForm()
{
event = DomainObjectFactory.createEventGenericImpl();
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/events/MyEventFormacoesForm.java
New file
0,0 → 1,22
package pt.estgp.estgweb.web.form.events;
 
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.EventFormacoes;
 
/**
* Created by jorgemachado on 07/10/16.
*/
public class MyEventFormacoesForm extends MyEventForm
{
 
@Override
public EventFormacoes getEvent() {
return (EventFormacoes) super.getEvent();
}
 
public MyEventFormacoesForm()
{
super();
event = DomainObjectFactory.createEventFormacoesImpl();
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/events/EventClassForm.java
New file
0,0 → 1,65
package pt.estgp.estgweb.web.form.events;
 
import org.apache.struts.action.ActionErrors;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.EventClass;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class EventClassForm extends ApplicationForm
{
 
private long eventId;
private EventClass eventClass;
 
 
 
 
public EventClassForm()
{
eventClass = DomainObjectFactory.createEventClass();
 
 
}
 
 
 
public long getEventId() {
return eventId;
}
 
public void setEventId(long eventId) {
this.eventId = eventId;
}
 
public EventClass getEventClass() {
return eventClass;
}
 
public void setEventClass(EventClass eventClass) {
this.eventClass = eventClass;
}
 
public ActionErrors validate(org.apache.struts.action.ActionMapping actionMapping, javax.servlet.http.HttpServletRequest httpServletRequest)
{
ActionErrors errors = new ActionErrors();
if(eventClass.getName() == null || eventClass.getName().length() == 0)
{
addMessageWithKeys(errors,httpServletRequest,"errors.required","event.name");
}
if(eventClass.getManagersRole() == null || eventClass.getManagersRole().length() == 0)
{
addMessageWithKeys(errors,httpServletRequest,"errors.required","event.managerRole");
}
if(!eventClass.isEventosFormacoes() && !eventClass.isEventosGenericos() )
{
addMessageWithKeys(errors,httpServletRequest,"errors.required","event.permited.types");
}
 
return errors;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/events/MyEventForm.java
New file
0,0 → 1,97
package pt.estgp.estgweb.web.form.events;
 
import org.apache.struts.upload.FormFile;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.EventGeneric;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class MyEventForm extends ApplicationForm
{
 
private long eventClassId;
private long eventId;
protected EventGeneric event;
private FormFile flyerFile;
 
private String dataAberturaFormulario;
private String dataFechoFormulario;
private String dataPublicacao;
private String dataInicio;
 
 
public MyEventForm()
{
event = DomainObjectFactory.createEventFormacoesImpl();
 
}
 
public long getEventClassId() {
return eventClassId;
}
 
public void setEventClassId(long eventClassId) {
this.eventClassId = eventClassId;
}
 
public long getEventId() {
return eventId;
}
 
public void setEventId(long eventId) {
this.eventId = eventId;
}
 
public EventGeneric getEvent() {
return event;
}
 
public void setEvent(EventGeneric event) {
this.event = event;
}
 
public FormFile getFlyerFile() {
return flyerFile;
}
 
public void setFlyerFile(FormFile flyerFile) {
this.flyerFile = flyerFile;
}
 
 
public String getDataAberturaFormulario() {
return dataAberturaFormulario;
}
 
public void setDataAberturaFormulario(String dataAberturaFormulario) {
this.dataAberturaFormulario = dataAberturaFormulario;
}
 
public String getDataFechoFormulario() {
return dataFechoFormulario;
}
 
public void setDataFechoFormulario(String dataFechoFormulario) {
this.dataFechoFormulario = dataFechoFormulario;
}
 
public String getDataPublicacao() {
return dataPublicacao;
}
 
public void setDataPublicacao(String dataPublicacao) {
this.dataPublicacao = dataPublicacao;
}
 
public String getDataInicio() {
return dataInicio;
}
 
public void setDataInicio(String dataInicio) {
this.dataInicio = dataInicio;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/questionarios/QuestionarioMessage.java
New file
0,0 → 1,118
package pt.estgp.estgweb.web.form.questionarios;
 
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
import javax.servlet.http.HttpServletRequest;
 
 
public class QuestionarioMessage extends ApplicationForm
{
boolean onlyNotAnswered = false;
String message;
private long cursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId;
String fromEmail;
String fromPerson;
String subject;
 
String formDescription;
String dispatch;
long questionarioId;
 
 
public long getQuestionarioId() {
return questionarioId;
}
 
public void setQuestionarioId(long questionarioId) {
this.questionarioId = questionarioId;
}
 
public String getDispatch() {
return dispatch;
}
 
public void setDispatch(String dispatch) {
this.dispatch = dispatch;
}
 
public String getFormDescription() {
return formDescription;
}
 
public void setFormDescription(String formDescription) {
this.formDescription = formDescription;
}
 
public String getSubject() {
return subject;
}
 
public void setSubject(String subject) {
this.subject = subject;
}
 
public boolean isOnlyNotAnswered() {
return onlyNotAnswered;
}
 
public void setOnlyNotAnswered(boolean onlyNotAnswered) {
this.onlyNotAnswered = onlyNotAnswered;
}
 
public String getFromEmail() {
return fromEmail;
}
 
public void setFromEmail(String fromEmail) {
this.fromEmail = fromEmail;
}
 
public String getFromPerson() {
return fromPerson;
}
 
public void setFromPerson(String fromPerson) {
this.fromPerson = fromPerson;
}
 
public String getMessage() {
return message;
}
 
public void setMessage(String message) {
this.message = message;
}
 
public long getCursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId() {
return cursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId;
}
 
public void setCursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId(long cursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId) {
this.cursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId = cursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId;
}
 
 
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
{
ActionErrors errors = new ActionErrors();
if(getSubject() == null || getSubject().trim().length() == 0)
{
addMessageWithKeys(errors,request,"errors.required","questionario.email.subject");
}
if(getFromEmail() == null || getFromEmail().trim().length() == 0)
{
addMessageWithKeys(errors,request,"errors.required","questionario.email.from.email");
}
if(getFromPerson() == null || getFromPerson().trim().length() == 0)
{
addMessageWithKeys(errors,request,"errors.required","questionario.email.from.person");
}
if(getMessage() == null || getMessage().trim().length() == 0)
{
addMessageWithKeys(errors,request,"errors.required","questionario.email.message");
}
return errors;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/questionarios/QuestionarioRespostaForm.java
New file
0,0 → 1,71
package pt.estgp.estgweb.web.form.questionarios;
 
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.QuestionarioResposta;
import pt.estgp.estgweb.domain.QuestionarioRespostaImpl;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
 
/**
* Created by jorgemachado on 05/06/16.
*/
public class QuestionarioRespostaForm extends ApplicationForm
{
QuestionarioRespostaImpl resposta = DomainObjectFactory.createQuestionarioRespostaImpl();
 
public QuestionarioRespostaForm() {
resposta.setQuestionario(DomainObjectFactory.createQuestionarioImpl());
}
 
long alunoRequesitadoId;
 
public long getAlunoRequesitadoId() {
return alunoRequesitadoId;
}
 
public void setAlunoRequesitadoId(long alunoRequesitadoId) {
this.alunoRequesitadoId = alunoRequesitadoId;
}
 
public QuestionarioRespostaImpl getResposta() {
return resposta;
}
 
public void setResposta(QuestionarioRespostaImpl resposta) {
this.resposta = resposta;
}
 
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
List<String> respostasVazias = new ArrayList<String>();
 
for(int i = 1; i <= 17; i++)
{
try {
String r = (String) QuestionarioResposta.class.getMethod("getR"+i).invoke(resposta);
if(r == null || r.trim().length() == 0)
{
if(respostasVazias.size() == 0)
addMessage(errors, request, "questionario.respostas.grupos.1.2.3");
respostasVazias.add("" + i);
}
 
}
catch (Throwable e)
{
System.err.println("Erro nao esperado metodo getR" + i + " nao existe na resposta");
e.printStackTrace();
}
}
if(respostasVazias.size() > 0)
request.setAttribute("respostasVazias",respostasVazias);
 
return errors;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesController.java
4,14 → 4,21
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.domain.CourseStudiesPlanImpl;
import pt.estgp.estgweb.domain.views.CourseView;
import pt.estgp.estgweb.filters.exceptions.NotFoundException;
import pt.estgp.estgweb.services.courses.CoursesService;
import pt.estgp.estgweb.services.courses.xsd.Curso;
import pt.estgp.estgweb.services.courses.xsd.PerfilImpl;
import pt.estgp.estgweb.services.courses.xsd.SemestreImpl;
import pt.estgp.estgweb.services.courses.xsd.UnidadeImpl;
import pt.estgp.estgweb.services.courseunits.DirectedCoordinatedCourses;
import pt.estgp.estgweb.services.courseunits.DirectedCoordinatedUnitsService;
import pt.estgp.estgweb.services.expceptions.AlreadyExistsException;
import pt.estgp.estgweb.web.controllers.courseunits.CourseUnitsController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.form.courses.CourseForm;
import pt.estgp.estgweb.web.form.courses.CourseStudiesPlansAdminForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterRetrieveException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.IncompatibleFilterException;
25,6 → 32,7
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
 
/**
* @author Jorge Machado
51,10 → 59,21
cF.setCourseView(cV);
return mapping.findForward("submit");
}
private void loadOnlyCourseAndPlans(CourseForm cF, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
load(cF,request,response,false,true);
 
}
 
private void load(CourseForm cF, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
load(cF,request,response,true,true);
}
private void load(CourseForm cF, HttpServletRequest request, HttpServletResponse response,boolean loadUnits,boolean loadStudiesPlans)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
String code = cF.getCourseView().getCode();
long id = cF.getCourseView().getId();
 
64,17 → 83,49
String serviceName;
if(code != null)
{
args = new Object[]{code,true};
args = new Object[]{code,loadUnits};
if(loadStudiesPlans)
serviceName = "LoadCourseByCodeAndStudiesPlans";
else
serviceName = "LoadCourseByCode";
}
else
{
args = new Object[]{id,loadUnits};
if(loadStudiesPlans)
serviceName = "LoadCourseAndStudiesPlans";
else
serviceName = "LoadCourse";
}
CourseView cV = (CourseView) sm.execute(RequestUtils.getRequester(request, response), serviceName, args, names);
request.setAttribute("CourseView",cV);
cF.setCourseView(cV);
}
 
private void loadForPublic(CourseForm cF, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
load(cF,request,response,false,false);
/* String code = cF.getCourseView().getCode();
long id = cF.getCourseView().getId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"serializable"};
Object[] args;
String serviceName;
if(code != null)
{
args = new Object[]{code,false};
serviceName = "LoadCourseByCode";
}
else
{
args = new Object[]{id,true};
args = new Object[]{id,false};
serviceName = "LoadCourse";
}
CourseView cV = (CourseView) sm.execute(RequestUtils.getRequester(request, response), serviceName, args, names);
request.setAttribute("CourseView",cV);
cF.setCourseView(cV);
cF.setCourseView(cV);*/
}
 
public ActionForward loadPlan(ActionMapping mapping,
138,7 → 189,7
{
try
{
load((CourseForm) form,request,response);
loadForPublic((CourseForm) form,request,response);
return mapping.findForward("loadSeparators");
}
catch (FilterChainFailedException e)
210,6 → 261,32
}
}
 
public ActionForward editAdmin(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
loadOnlyCourseAndPlans((CourseForm) form, request, response);
return mapping.findForward("submit");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward submit(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
273,6 → 350,8
}
 
 
 
 
public ActionForward loadCoursesPrograms(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
382,4 → 461,410
return mapping.findForward("error500");
}
}
 
 
/**
* StudiesPlans Controller Functions
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws ServletException
*/
public ActionForward addNewVersion(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
long courseId = frm.getCourseId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{courseId,frm.getCourseStudiesPlan()};
sm.execute(RequestUtils.getRequester(request, response), "AddNewStudiesPlan", args, names);
addMessage(request, "course.studies.plan.added");
return mapping.findForward("loadstudyplans");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward savePlano(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
long courseId = frm.getCourseId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{courseId,frm.getCourseStudiesPlan().getId(),frm.getPlanoEstudos(),frm.getCourseStudiesPlan()};
sm.execute(RequestUtils.getRequester(request, response), "SavePlanoEstudos", args, names);
addMessage(request, "course.studies.plan.saved");
request.setAttribute("courseId",courseId);
return mapping.findForward("adminStudyPlans");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward addUnidadePerfil(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String perfilId = frm.getPerfilId();
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre()){
for(Curso.Semestre.Perfil perfil: semestre.getPerfil())
{
if(perfil.getPerfilId().equals(perfilId))
{
perfil.getUnidade().add(new UnidadeImpl());
break;
}
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
public ActionForward removePerfil(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String perfilId = frm.getPerfilId();
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre()){
Iterator<Curso.Semestre.Perfil> iterPerfil = semestre.getPerfil().iterator();
while(iterPerfil.hasNext())
{
Curso.Semestre.Perfil perfil = iterPerfil.next();
if(perfil.getPerfilId().equals(perfilId))
{
iterPerfil.remove();
break;
}
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
public ActionForward addUnidadeSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre())
{
if(semestre.getSemestreId().equals(semestreId))
{
semestre.getUnidade().add(new UnidadeImpl());
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward removeSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
Iterator<Curso.Semestre> iteSem = frm.getPlanoEstudos().getSemestre().iterator();
while(iteSem.hasNext())
{
Curso.Semestre semestre = iteSem.next();
if(semestre.getSemestreId().equals(semestreId))
{
iteSem.remove();
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward addNewSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
frm.getPlanoEstudos().getSemestre().add(new SemestreImpl());
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward addPerfilSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre())
{
if(semestre.getSemestreId().equals(semestreId))
{
semestre.getPerfil().add(new PerfilImpl());
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward sendUpSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
for(int i = 0; i < frm.getPlanoEstudos().getSemestre().size();i++)
{
Curso.Semestre semestre = frm.getPlanoEstudos().getSemestre().get(i);
if(semestre.getSemestreId().equals(semestreId))
{
int nextPos = i-1;
frm.getPlanoEstudos().getSemestre().remove(i);
if(nextPos < 0)
nextPos = 0;
frm.getPlanoEstudos().getSemestre().add(nextPos,semestre);
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
public ActionForward sendDownSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
for(int i = 0; i < frm.getPlanoEstudos().getSemestre().size();i++)
{
Curso.Semestre semestre = frm.getPlanoEstudos().getSemestre().get(i);
if(semestre.getSemestreId().equals(semestreId))
{
int nextPos = i+1;
frm.getPlanoEstudos().getSemestre().remove(i);
if(nextPos >= frm.getPlanoEstudos().getSemestre().size())
frm.getPlanoEstudos().getSemestre().add(semestre);
else
frm.getPlanoEstudos().getSemestre().add(nextPos,semestre);
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward sendUpPerfil(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String perfilId = frm.getPerfilId();
 
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre())
{
for(int i = 0; i < semestre.getPerfil().size();i++)
{
Curso.Semestre.Perfil perfil = semestre.getPerfil().get(i);
if(perfil.getPerfilId().equals(perfilId))
{
int nextPos = i-1;
semestre.getPerfil().remove(i);
if(nextPos < 0)
nextPos = 0;
semestre.getPerfil().add(nextPos,perfil);
break;
}
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
public ActionForward sendDownPerfil(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String perfilId = frm.getPerfilId();
 
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre())
{
for(int i = 0; i < semestre.getPerfil().size();i++)
{
Curso.Semestre.Perfil perfil = semestre.getPerfil().get(i);
if(perfil.getPerfilId().equals(perfilId))
{
int nextPos = i+1;
semestre.getPerfil().remove(i);
if(nextPos >= semestre.getPerfil().size())
semestre.getPerfil().add(perfil);
else
semestre.getPerfil().add(nextPos,perfil);
break;
}
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward clonarPlano(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
long planId = frm.getCourseStudiesPlan().getId();
long sourcePlanId = frm.getSourcePlanId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sourcePlanId,planId,frm.getCourseId()};
CourseStudiesPlanImpl novoPlano = (CourseStudiesPlanImpl) sm.execute(RequestUtils.getRequester(request, response), "CloneStudiesPlanVersionFrom", args, names);
frm.setCourseStudiesPlan(novoPlano);
frm.setPlanoEstudos(new CoursesService().loadCursoPlanoFromXml(novoPlano.getXml()));
addMessage(request, "course.studies.plan.cloned");
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
 
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/events/EventsController.java
New file
0,0 → 1,116
package pt.estgp.estgweb.web.controllers.events;
 
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.domain.EventFormacoes;
import pt.estgp.estgweb.filters.exceptions.NotFoundException;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.form.events.EventClassForm;
import pt.estgp.estgweb.web.form.events.MyEventForm;
import pt.estgp.estgweb.web.utils.DatesUtils;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.exceptions.FilterChainFailedException;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
* @author Jorge Machado
* @date 26/Fev/2008
* @time 18:01:54
* @see pt.estgp.estgweb.web
*/
public class EventsController extends ApplicationDispatchController
{
 
private static final Logger logger = Logger.getLogger(EventsController.class);
 
 
 
public ActionForward saveClassAjax(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
try{
EventClassForm frm = (EventClassForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
Object[] args = {frm.getEventClass()};
 
 
sm.execute(RequestUtils.getRequester(request, response),"EventsSaveClass",args,names);
 
 
System.out.println(frm.getEventClass().getName());
return mapping.findForward("jsonOk");
}
catch (FilterChainFailedException e)
{
addError(request, "error.401.authenticated");
return mapping.findForward("jsonErrors");
}
catch (NotFoundException e)
{
addError(request,"error.404.explain");
return mapping.findForward("jsonErrors");
}
catch (Throwable e)
{
logger.error(e, e);
addError(request, "error.500");
return mapping.findForward("jsonErrors");
}
}
 
 
public ActionForward saveEvent(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
try{
MyEventForm frm = (MyEventForm) form;
 
frm.getEvent().setDataAberturaFormulario(DatesUtils.getDateFromString(frm.getDataAberturaFormulario()));
frm.getEvent().setDataFechoFormulario(DatesUtils.getDateFromString(frm.getDataFechoFormulario()));
frm.getEvent().setDataPublicacao(DatesUtils.getDateFromString(frm.getDataPublicacao()));
frm.getEvent().setDataInicio(DatesUtils.getDateFromString(frm.getDataInicio()));
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"eventClassId","event","flyer"};
Object[] args = {frm.getEventClassId(), frm.getEvent(),frm.getFlyerFile()};
sm.execute(RequestUtils.getRequester(request, response),"EventsSaveEvent",args,names);
addMessageAsString(request, "Evento " + frm.getEvent().getTitle() + ": Adicionado com Sucesso");
if(frm.getEvent() instanceof EventFormacoes)
addMessageAsString(request,"Para adicionar professores volte a entrar no formulário");
return mapping.findForward("ok");
}
catch (FilterChainFailedException e)
{
addError(request, "error.401.authenticated");
return mapping.findForward("errors");
}
catch (NotFoundException e)
{
addError(request,"error.404.explain");
return mapping.findForward("errors");
}
catch (Throwable e)
{
logger.error(e, e);
addError(request, "error.500");
return mapping.findForward("errors");
}
}
 
 
}
Property changes:
Added: svn:executable
+ *
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/questionarios/QuestionarioYearSemestreController.java
3,6 → 3,7
import org.apache.struts.action.*;
import pt.estgp.estgweb.domain.QuestionarioImpl;
import pt.estgp.estgweb.web.form.questionarios.QuestionarioForm;
import pt.estgp.estgweb.web.form.questionarios.QuestionarioRespostaForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
52,4 → 53,25
}
return mapping.findForward("admin");
}
 
public ActionForward submitResposta(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
QuestionarioRespostaForm frm = (QuestionarioRespostaForm) form;
 
 
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"resposta","alunoRequisitadoId"};
Object[] args = {frm.getResposta(),frm.getAlunoRequesitadoId()};
 
sm.execute(RequestUtils.getRequester(request, response),"QuestionarioSalvarResposta",args,names);
addMessage(request,"questionario.resposta.com.sucesso");
 
return mapping.findForward("success");
}
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/questionarios/QuestionarioController.java
11,6 → 11,7
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.form.questionarios.QuestionarioForm;
import pt.estgp.estgweb.web.form.questionarios.QuestionarioMessage;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
141,5 → 142,222
}
 
 
public ActionForward putInAssignedAnwsers(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
QuestionarioForm frm = (QuestionarioForm) form;
 
long questionarioId;
if(request.getParameter("questionarioId")!=null)
questionarioId = Long.parseLong(request.getParameter("questionarioId"));
else
questionarioId = frm.getQuestionario().getId();
 
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"questionarioId"};
Object[] args = {questionarioId};
 
QuestionarioImpl affected = (QuestionarioImpl) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioPutAssignedAnswers",args,names);
 
frm.setQuestionario(affected);
 
return mapping.findForward("admin");
}
 
public ActionForward revertAssignationDetails(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
QuestionarioForm frm = (QuestionarioForm) form;
 
long questionarioId;
if(request.getParameter("questionarioId")!=null)
questionarioId = Long.parseLong(request.getParameter("questionarioId"));
else
questionarioId = frm.getQuestionario().getId();
 
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"questionarioId"};
Object[] args = {questionarioId};
 
QuestionarioImpl affected = (QuestionarioImpl) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioRevertAssignationDetails",args,names);
 
frm.setQuestionario(affected);
 
return mapping.findForward("admin");
}
 
public ActionForward stopProcessement(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
QuestionarioForm frm = (QuestionarioForm) form;
 
long questionarioId;
if(request.getParameter("questionarioId")!=null)
questionarioId = Long.parseLong(request.getParameter("questionarioId"));
else
questionarioId = frm.getQuestionario().getId();
 
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"questionarioId"};
Object[] args = {questionarioId};
 
QuestionarioImpl affected = (QuestionarioImpl) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioStopProcessement",args,names);
 
frm.setQuestionario(affected);
 
return mapping.findForward("admin");
}
 
public ActionForward startProcessement(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
QuestionarioForm frm = (QuestionarioForm) form;
 
long questionarioId;
if(request.getParameter("questionarioId")!=null)
questionarioId = Long.parseLong(request.getParameter("questionarioId"));
else
questionarioId = frm.getQuestionario().getId();
 
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"questionarioId"};
Object[] args = {questionarioId};
 
QuestionarioImpl affected = (QuestionarioImpl) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioStartProcessement",args,names);
 
frm.setQuestionario(affected);
 
return mapping.findForward("admin");
}
 
 
/********
* EMAILS QUESTIONARIO
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Throwable
*/
public ActionForward sendEmailQuestionario(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
QuestionarioMessage frm = (QuestionarioMessage) form;
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"onlyNotAnswered","id","msg","emailFrom","personFrom","subject"};
Object[] args = {
frm.isOnlyNotAnswered(),
frm.getCursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId(),
frm.getMessage(),
frm.getFromEmail(),
frm.getFromPerson(),
frm.getSubject()
};
int size = (Integer) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioSendMessage",args,names);
addMessage(request,"submit.todo.message.success","" + size);
return mapping.findForward("success");
}
public ActionForward sendEmailQuestionarioCursoAfeto(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
QuestionarioMessage frm = (QuestionarioMessage) form;
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"onlyNotAnswered","id","msg","emailFrom","personFrom","subject"};
Object[] args = {
frm.isOnlyNotAnswered(),
frm.getCursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId(),
frm.getMessage(),
frm.getFromEmail(),
frm.getFromPerson(),
frm.getSubject()
};
int size = (Integer) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioSendMessageCursoAfeto",args,names);
addMessage(request,"submit.todo.message.success","" + size);
return mapping.findForward("success");
}
 
public ActionForward sendEmailQuestionarioUnidadeAfeta(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
QuestionarioMessage frm = (QuestionarioMessage) form;
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"onlyNotAnswered","id","msg","emailFrom","personFrom","subject"};
Object[] args = {
frm.isOnlyNotAnswered(),
frm.getCursoAfetoOrUnidadeAfetaOrQuestionarioAfetoId(),
frm.getMessage(),
frm.getFromEmail(),
frm.getFromPerson(),
frm.getSubject()
};
int size = (Integer) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioSendMessageUnidadeAfeta",args,names);
addMessage(request,"submit.todo.message.success","" + size);
return mapping.findForward("success");
}
 
 
 
public ActionForward sendEmailQuestionariosProcessing(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
QuestionarioMessage frm = (QuestionarioMessage) form;
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {"onlyNotAnswered","id","msg","emailFrom","personFrom","subject"};
Object[] args = {
frm.isOnlyNotAnswered(),
frm.getMessage(),
frm.getFromEmail(),
frm.getFromPerson(),
frm.getSubject()
};
int size = (Integer) sm.execute(RequestUtils.getRequester(request, response),"QuestionarioSendMessageAllProcessing",args,names);
addMessage(request,"submit.todo.message.success","" + size);
return mapping.findForward("seeAll");
}
 
 
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/contacts/ContactsController.java
1,21 → 1,18
package pt.estgp.estgweb.web.controllers.contacts;
 
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.domain.views.UserView;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.controllers.utils.UtilsController;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.estgp.estgweb.domain.views.AnnouncementView;
import pt.estgp.estgweb.domain.views.UserView;
import pt.estgp.estgweb.Globals;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.util.List;
 
/**
40,9 → 37,11
String area = request.getParameter("area");
request.setAttribute("area",area);
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"area"};
Object[] args = new Object[]{area};
List<UserView> teachers = (List<UserView>) sm.execute(RequestUtils.getRequester(request, response), "LoadTeachersWithUnits", args, names);
//String[] names = new String[]{"area"};
//Object[] args = new Object[]{area};
String[] names = new String[]{};
Object[] args = new Object[]{};
List<UserView> teachers = (List<UserView>) sm.execute(RequestUtils.getRequester(request, response), "LoadTeachersWithUnitsInLast3Years", args, names);
request.setAttribute("teachers",teachers);
return mapping.findForward("contactTeachers");
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/authenticate/AuthenticateController.java
139,7 → 139,7
 
UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
if(userSession.getUser() == null)
return mapping.findForward("welcome");
return mapping.findForward(Globals.SYSTEM_REDIRECTIONS_POLICY_INDEX_WELCOME);
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{};
//to send good by message
/branches/v3/impl/src/java/pt/estgp/estgweb/web/filters/UserSessionFilter.java
91,9 → 91,9
 
if(((HttpServletRequest)request).getServletPath().indexOf("errorNoCookies.do")>=0 || !hrequest.isRequestedSessionIdFromCookie())
{
chain.doFilter(request,response);
//chain.doFilter(request,response);
logger.info("COOKIE lost");
return;
 
}
try
{
/branches/v3/impl/src/java/pt/estgp/estgweb/web/json/JsonHandler.java
1,24 → 1,43
package pt.estgp.estgweb.web.json;
 
import com.owlike.genson.TransformationException;
import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.services.courses.xsd.Curso;
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
 
/**
* Created by jorgemachado on 02/02/16.
*/
public class JsonHandler extends HttpServlet
{
private static final Logger logger = Logger.getLogger(JsonHandler.class);
 
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
throws ServletException, IOException {
processRequestSafe(request, response);
}
 
/** Handles the HTTP <code>POST</code> method.
27,11 → 46,127
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
processRequestSafe(request, response);
}
 
private void processRequest(HttpServletRequest request, HttpServletResponse response) {
 
private void processRequestSafe(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("application/json");
try {
processRequest(request, response);
} catch (TransformationException e)
{
response.getWriter().print(e);
response.getWriter().print("See log for details:");
logger.error(e,e);
}
catch (JAXBException e)
{
response.getWriter().print(e);
response.getWriter().print("See log for details:");
logger.error(e,e);
}
catch (JSONException e)
{
response.getWriter().print(e);
response.getWriter().print("See log for details:");
logger.error(e, e);
} catch (Throwable throwable) {
response.getWriter().print(throwable);
response.getWriter().print("See log for details:");
logger.error(throwable, throwable);
}
}
 
private void processRequest(HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
IServiceManager sm = ServiceManager.getInstance();
 
String service = request.getParameter("service");
if(service == null)
{
printServices(response.getWriter());
}
else if(service.equals("listCourses"))
{
String school = request.getParameter("school");
String type = request.getParameter("type");
JSONObject obj = (JSONObject) sm.execute(RequestUtils.getRequester(request, response), "GetActiveCoursesForJsonApi", new Object[]{school, type});
response.getWriter().write(obj.toString());
}
else if(service.equals("getCourse") && request.getParameter("code") != null)
{
String code = request.getParameter("code");
JSONObject obj = (JSONObject) sm.execute(RequestUtils.getRequester(request, response), "GetCourseDetailForJsonApi", new Object[]{code});
response.getWriter().write(obj.toString());
}
else if(service.equals("getStudiesPlanXml") && request.getParameter("code") != null)
{
String code = request.getParameter("code");
String renew = request.getParameter("renew");
response.setContentType("application/xml");
response.setCharacterEncoding("UTF-8");
String xml = (String) sm.execute(RequestUtils.getRequester(request, response), "GetCourseStudiesPlanXml", new Object[]{code,renew});
 
JAXBContext jc = JAXBContext.newInstance(Curso.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Curso curso = (Curso) unmarshaller.unmarshal(new StringReader(xml));
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(curso, response.getOutputStream());
//SETTING XML in COURSE STUDIES PLAN
}
else if(service.equals("syncSystemPlans") && request.getParameter("systemUrl") != null && request.getParameter("setActive") != null)
{
UserSession sess = UserSessionProxy.loadUserSessionFromRequest(request);
response.setContentType("application/xml");
if(sess.getUser() != null && sess.getUser().isSuperuserOrAdmin())
{
String systemUrl = request.getParameter("systemUrl");
boolean setActive = Boolean.parseBoolean(request.getParameter("setActive"));
response.setContentType("application/xml");
String log = (String) sm.execute(RequestUtils.getRequester(request, response), "SincronizeCoursesStudiesPlans", new Object[]{systemUrl,setActive});
response.getWriter().write("<response><status>OK</status><log>" + log + "</log></response>");
}
else
{
response.getWriter().write("<error>Permission Denied</error>");
}
}
else
{
printServices(response.getWriter());
}
}
 
public void printServices(PrintWriter out) throws JSONException, IOException
{
JSONObject obj = new JSONObject();
 
JSONArray availableServices = new JSONArray();
 
JSONObject service2 = new JSONObject();
service2.put("name","getCourse");
service2.put("parameterCode","code");
service2.put("parameterCodeType","integer");
service2.put("exampleCall1","/wsjson/api?service=getCourse&code=9119");
 
JSONObject service = new JSONObject();
service.put("name","listCourses");
service.put("parameterType","type");
service.put("parameterTypeEnumValues","Licenciaturas,Mestrados,PosGraduacoes,CET,CTeSP or none for all");
service.put("parameterSchool","school");
service.put("parameterSchoolEnumValues","ESTG,ESECS,ESS,ESAE or none for all");
service.put("exampleCall1","/wsjson/api?service=listCourses");
service.put("exampleCall2","/wsjson/api?service=listCourses&type=Licenciaturas&school=ESTG");
 
availableServices.put(service);
availableServices.put(service2);
JSONObject response = new JSONObject();
obj.put("response",response);
response.put("status","invalid service");
response.put("availableServices",availableServices);
out.write(obj.toString());
}
 
}
/branches/v3/impl/src/doc/estgweb.eap
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v3/impl/src/doc/BacoV32016/processos/QueriesQuestionarios.txt
New file
0,0 → 1,0
select tr.nomeDocente,avg((r6+r7+r8+r9+r10+r11+r12)/7.0) as media,avg((timeTakenR6+timeTakenR7+timeTakenR8+timeTakenR9+timeTakenR10+timeTakenR11+timeTakenR12)/7.0) as tempo from questionario_resposta q join questionario_resposta_requisitada qr on qr.resposta = q.id join questionario_peda_aluno_requisitado ar on ar.respostaRequisitada = qr.id join questionario_peda_tipologia_requisitada tr on tr.id = ar.tipologia_requisitada group by tr.cdDocente order by media;
/branches/v3/impl/src/doc/BacoV32016/processos/QuestionariosAccess/importMdb.sh
New file
0,0 → 1,23
MDB_FILE=$1
QUESTDATA=$2
QUESTPERIODO=$3
TABLES="INQUERITO PROFESSOR CURSO DISCIPLINA PROFESSOR_DISCIPLINA R_DISCIPLINA R_DOCENTE"
echo "Using file:$1 in year $2 semestre $3"
 
echo "drop database inqueritos$QUESTDATA$QUESTPERIODO;" | mysql -uroot
echo "create database inqueritos$QUESTDATA$QUESTPERIODO;" | mysql -uroot
 
#mdb-schema inquerito_final.mdb | sed "s/Double/int/" | sed "s/Long Integer/int/" | sed "s/\[//" | sed "s/\]//" | sed "s/\Text (.*)/varchar(250)/" | sed "s/Boolean/BIT(1)/" | sed "s/Numeric (.*)/int/" | sed "s/Cópia de /copia_de_/" | mysql -uroot inqueritos_$QUESTDATA_$QUESTPERIODO
 
#mdb-schema -S inquerito_final.mdb mysql | mysql -uroot inqueritos$QUESTDATA$QUESTPERIODO
 
 
mdb-schema -S inquerito_final.mdb mysql | grep -i CREATE | cut -f 3 -d " " | sed "s/\`//" | sed "s/\`//" | grep -v mdb > tmp_tables
 
echo $TABLES
for i in $TABLES
do
echo "Exporting $i to mysql"
mdb-schema -S -T $i inquerito_final.mdb mysql | mysql -uroot inqueritos$QUESTDATA$QUESTPERIODO
mdb-export -I mysql -H inquerito_final.mdb $i | mysql -uroot inqueritos$QUESTDATA$QUESTPERIODO
done
Property changes:
Added: svn:executable
+ *
/branches/v3/impl/src/doc/BacoV32016/processos/QuestionariosAccess/scriptMdbToolsExportMdbMySql.rtf
New file
0,0 → 1,18
{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\margl1440\margr1440\vieww15780\viewh8400\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
 
\f0\fs22 \cf0 \CocoaLigature0 \
exportar MDB com mdbtools para linux\
\
mdb-schema inquerito_final.mdb | sed "s/Long Integer/int/" | sed "s/\\[//" | sed "s/\\]//" | sed "s/\\Text (.*)/varchar(250)/" | sed "s/Boolean/BIT(1)/" | sed "s/Numeric \\(.*\\)/int/"\
\
\
ESCOLHER APENAS AS TABELAS DESEJADAS\
\
\
mdb-export -I mysql inquerito_final.mdb INQUERITO | mysql -uroot inqueritos_201415_S2\
\
}
/branches/v3/impl/src/doc/BacoV32016/linuxInstall/How To Set Up Master Slave Replication in MySQL _ DigitalOcean_files.zip
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/branches/v3/impl/src/doc/BacoV32016/linuxInstall/mysql/mysqlreplication.txt
New file
0,0 → 1,108
 
 
 
#PARA MYSQL SLAVE JA EM FUNCIONAMENTO COM BASE EM UM MASTER E FUNCIONANDO COM FICHEIROS
STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
 
depois alterar no my.conf na parte do mysqld para isto
 
[mysqld]
master-info-repository=TABLE
relay-log-info-repository=TABLE
#####################################
 
SERVER EXEMPLO: 172.20.100.141
SLAVE EXEMPLO: 172.20.100.20
 
 
NO MASTER QUE VAI SER REPLICADO
 
sudo apt-get install mysql-server mysql-client
 
sudo nano /etc/mysql/my.cnf
#comentar a linha assim:
#bind-address = 127.0.0.1
 
#procurar a linha server-id e colocar assim:
server-id = 1
 
#definir o log file e a base de dados que poderá ser replicada:
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = pae
 
#Como temos trasaction ISOLATION READ_COMMITED
#adicionat a linha
 
binlog_format=row
 
#reiniciar tomcat
/etc/init.d/mysql restart
 
#AGORA ENTRAMOS NO MYSQL
mysql -u root
 
#GARANTIR DIREITOS DE REPLICACAO AO SLAVE
GRANT REPLICATION SLAVE ON *.* TO 'baco'@'172.20.100.20' IDENTIFIED BY 'baco1232008estg';
 
FLUSH PRIVILEGES;
 
 
#FAZER DUMP DA BASE DE DADOS
 
mysql> \u pae
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
 
 
 
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | pae | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
 
mysql> UNLOCK TABLES;
 
ENTRAR EM NOVO TERMNAL SEM MECHER NESTE
mysqldump -u root -p --opt pae > pae-para-slave.sql
 
#NO MYSQL
UNLOCK TABLES;
QUIT;
 
#COPIAR O FICHEIRO PARA O SLAVE 172.20.100.20
#SE FOR EM LINUX FAZER ASSIM EXEMPLO que copia para a pasta onde estamos que é o ".":
scp jmachado@pae.ipportalegre.pt:/home/jmachado/pae-para-slave.sql .
 
#entrar no mysql do salve
create database pae;
 
#sair
quit
 
#carregar base de dados
mysql -uroot -pbaco1232008estg pae < pae-para-slave.sql
 
 
 
 
 
elay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
sudo service mysql restart
The next step is to enable the replication from within the MySQL shell.
 
Open up the the MySQL shell once again and type in the following details, replacing the values to match your information:
 
CHANGE MASTER TO MASTER_HOST='172.20.100.141',MASTER_USER='baco', MASTER_PASSWORD='baco1232008estg', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
START SLAVE;
SHOW SLAVE STATUS
/branches/v3/impl/src/doc/siges/ModeloDeInformacaoPAE-EmVigor.docx
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/branches/v3/impl/src/doc/siges/ModeloDeInformacaoPAEv2.docx
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream