Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1069 → Rev 1085

/impl/importRoutines.xml
60,10 → 60,31
 
 
<!-- PONTUAIS -->
 
<target name="agendarImportacoes">
<java classname="pt.estgp.estgweb.services.jobs.JobScheduleService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
 
</java>
</target>
<target name="grades">
<java classname="pt.estgp.estgweb.services.sigesimports.ImportGradesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
<arg value="201415"/>
<arg value="200809"/>
</java>
<java classname="pt.estgp.estgweb.services.sigesimports.ImportGradesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
<arg value="200910"/>
</java>
<java classname="pt.estgp.estgweb.services.sigesimports.ImportGradesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
<arg value="201011"/>
</java>
<java classname="pt.estgp.estgweb.services.sigesimports.ImportGradesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
<arg value="201112"/>
</java>
<java classname="pt.estgp.estgweb.services.sigesimports.ImportGradesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
<arg value="201213"/>
</java>
<java classname="pt.estgp.estgweb.services.sigesimports.ImportGradesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib">
<arg value="201314"/>
</java>
</target>
 
<target name="setAreas">
/impl/conf/language/MessageResources.properties
502,13 → 502,64
directories.saved=Operação salva com sucesso
 
 
##TAREFAS AGENDADAS
 
configuration.jobtask=Tarefa Executada
configuration.jobtasks=Tarefas Executadas
configuration.tasks=Tarefas Agendadas
configuration.task=Tarefa Agendada
configuration.taskLog=Log de Tarefa
configuration.task.weekly=Semanalmente
configuration.task.monthly=Mensalmente
configuration.task.dally=Diariamente
configuration.task.hour=Hora
configuration.task.minute=Minuto
configuration.task.second=Segundo
configuration.task.weekday=Dia da semana
configuration.task.monthday=Dia do Mês
configuration.task.now=Agendar para correr agora
 
configuration.task.records=Registos de Tarefas Agendadas
configuration.task.log=Ficheiro de Registo
configuration.task.progress=Progresso
 
configuration.task.PENDING=Hora
configuration.task.STARTED=Iniciada
configuration.task.FINISHED=Terminada
configuration.task.FAILED=Falhada
configuration.task.UNKNOWN_ERROR=Terminada com erro desconhecido
configuration.task.unknown=Desconhecido
 
targetService.pt.estgp.estgweb.services.sigesimports.ImportTeachersService=Importação de Professores
targetService.pt.estgp.estgweb.services.sigesimports.ImportStudentsService=Importação de Alunos
targetService.pt.estgp.estgweb.services.sigesimports.ImportSumariesJson=Importação de Sumários
targetService.pt.estgp.estgweb.services.sigesimports.ImportGradesService=Importação de Notas
targetService.pt.estgp.estgweb.services.sigesimports.ImportCourseService=Importação de Cursos
targetService.pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService=Clonagem de Fichas Curriculares
 
weekday.Mon=Segundas
weekday.Tue=Terças
weekday.Wed=Quartas
weekday.Thu=Quintas
weekday.Fri=Sextas
weekday.Sat=Sabados
weekday.Sun=Domingos
 
monthday.day=ao dia
weekday.day=às
day.time=às
 
job.schedule.inactive=Tarefa está inativa
job.schedule.active=Tarefa reativada
job.schedule.deleted=Tarefa apagada das agendadas
job.schedule.for.now=Agendada para correr assim que for possivel
job.status.PENDING=Pendente
job.status.STARTED=Iniciado
job.status.FINISHED=Terminado
job.status.FINISHED_ERRORS=Terminado com Erros
job.status.FINISHED_WARNINGS=Terminado com Avisos
job.status.FAILED=Falhado
job.status.UNKNOWN_ERROR=Erro Desconhecido
 
 
 
531,3 → 582,20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/impl/conf/WEB-INF/struts/struts-configuration.xml
8,6 → 8,7
<form-beans>
<form-bean type="pt.estgp.estgweb.web.form.configuration.ConfigurationGradesForm" name="ConfigurationGradesForm"/>
<form-bean type="pt.estgp.estgweb.web.form.configuration.DirectoriesForm" name="DirectoriesForm"/>
<form-bean type="pt.estgp.estgweb.web.form.configuration.SchedulleTasksForm" name="SchedulleTasksForm"/>
</form-beans>
 
<global-exceptions>
53,5 → 54,24
</action>
 
 
<action path="/user/configurationSchedulleTasks" forward="page.configuration.tasks"/>
<action path="/user/configurationJobTasks" forward="page.configuration.jobtasks"/>
 
<action path="/user/configurationTasks"
type="pt.estgp.estgweb.web.controllers.configuration.SchedulerTasksController"
name="SchedulleTasksForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.separators.serviceZone">
 
<forward name="save" path="page.separators.serviceZone"/>
<forward name="jobtasks" path="page.configuration.jobtasks"/>
<forward name="tasks" path="page.configuration.tasks"/>
<forward name="task" path="page.configuration.task"/>
<forward name="taskLog" path="page.configuration.taskLog"/>
<forward name="taskLogfromjobtasks" path="page.configuration.taskLog.from.jobtasks"/>
</action>
 
</action-mappings>
</struts-config>
/impl/conf/WEB-INF/struts/tiles-configuration.xml
24,5 → 24,36
<put name="topnav" value="/user/serviceZone/topnavConfigurationDirectory.jsp"/>
<put name="body" value="/admin/configuration/directory.jsp"/>
</definition>
 
<definition name="page.configuration.tasks" extends="page.separators.serviceZone">
<put name="title" value="Tarefas Agendadas"/>
<put name="topnav" value="/user/serviceZone/topnavConfigurationTasks.jsp"/>
<put name="body" value="/admin/configuration/tasks.jsp"/>
</definition>
 
<definition name="page.configuration.jobtasks" extends="page.separators.serviceZone">
<put name="title" value="Registo de Tarefas Executadas"/>
<put name="topnav" value="/user/serviceZone/topnavConfigurationJobTasks.jsp"/>
<put name="body" value="/admin/configuration/jobTasks.jsp"/>
</definition>
 
<definition name="page.configuration.task" extends="page.separators.serviceZone">
<put name="title" value="Tarefa Agendada"/>
<put name="topnav" value="/user/serviceZone/topnavConfigurationTask.jsp"/>
<put name="body" value="/admin/configuration/task.jsp"/>
</definition>
 
<definition name="page.configuration.taskLog" extends="page.separators.serviceZone">
<put name="title" value="Tarefa Agendada"/>
<put name="topnav" value="/user/serviceZone/topnavConfigurationTaskLog.jsp"/>
<put name="body" value="/admin/configuration/taskLog.jsp"/>
</definition>
 
<definition name="page.configuration.taskLog.from.jobtasks" extends="page.separators.serviceZone">
<put name="title" value="Tarefa Agendada"/>
<put name="topnav" value="/user/serviceZone/topnavConfigurationTaskLogFromJobTasks.jsp"/>
<put name="body" value="/admin/configuration/taskLog.jsp"/>
</definition>
 
</tiles-definitions>
/impl/conf/WEB-INF/web.xml
244,8 → 244,20
<servlet-class>pt.estgp.estgweb.web.ajaxapis.ServicosImpressao</servlet-class>
</servlet>
 
<servlet>
<servlet-name>logServiceStream</servlet-name>
<servlet-class>pt.estgp.estgweb.web.LogsServiceStream</servlet-class>
</servlet>
 
<servlet>
<servlet-name>schedullerTasksJson</servlet-name>
<servlet-class>pt.estgp.estgweb.web.controllers.configuration.SchedullerTasksJson</servlet-class>
</servlet>
 
 
 
 
 
<!--MAPPINGS-->
 
<!--SOAP Tutorial-->
313,6 → 325,10
<url-pattern>/repositoryStreamVersion/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>logServiceStream</servlet-name>
<url-pattern>/logServiceStream/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ftpProxyStream</servlet-name>
<url-pattern>/ftpProxyStream/*</url-pattern>
</servlet-mapping>
333,7 → 349,12
<url-pattern>/user/ajaxapis/ServicosImpressao</url-pattern>
</servlet-mapping>
 
<servlet-mapping>
<servlet-name>schedullerTasksJson</servlet-name>
<url-pattern>/admin/schedullerTasksJson</url-pattern>
</servlet-mapping>
 
 
<!--START FILES-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
/impl/conf/app.properties
10,6 → 10,7
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
 
126,6 → 127,10
server.ionline.start.path=
ionline.pass=baco
ionline.user=Baco_web
ionline.use.default.credentials.to.updates.and.deletes=false
ionline.use.default.credentials.to.read=false
ionline.use.default.credentials.to.read.if.user.fail.when.authenticated=true
ionline.use.default.credentials.to.read.if.user.fail.when.not.authenticated=true
##ESTA CONFIGURACAO ESTA FUNCIONAL
## Ver nos Ficheiros FtpService metodo run
## Ver LayoutController
137,15 → 142,16
## Todos o sistema de ficheiros tem codigo espalhado das classes FTPServer e FTPClient
## Para se conseguir isolar o sistema deste código tem de se fazer um nivel de abstracao
## e remover todos o código de FTPServer e FTPClient
ionline.use.default.credentials.to.updates.and.deletes=false
ionline.use.default.credentials.to.read=false
 
 
server.grupos=ftp://w2.estgp.pt
server.grupos.start.path=/grupos
grupos.pass=ftppublic
grupos.user=ftppublic
 
grupos.use.default.credentials.to.read=true
#Irrelevantes vai usar sempre as defaults
grupos.use.default.credentials.to.read.if.user.fail.when.authenticated=true
grupos.use.default.credentials.to.read.if.user.fail.when.not.authenticated=true
grupos.use.default.credentials.to.updates.and.deletes=false
 
server.estgp.start.path=
/impl/conf/directories/topMenus.xsl
New file
0,0 → 1,60
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" xmlns:d="http://www.estgp.pt/baco/directory/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:param name="contextPath">/baco</xsl:param>
<xsl:template match="/">
<table id="menuTop" cellpadding="0" cellspacing="0">
<tr>
<td>
<ul id="menu_dropdown" class="menubar">
<xsl:apply-templates select="/d:directory/d:leaf" mode="root"/>
</ul>
</td>
</tr>
</table>
</xsl:template>
<xsl:template match="d:leaf" mode="root">
<li class="submenu">
<a>
<xsl:attribute name="href">
<xsl:choose>
<xsl:when test="@url and @absolute='true'">
<xsl:value-of select="@url"/>
</xsl:when>
<xsl:when test="@url and @absolute='false'">
<xsl:value-of select="$contextPath"/><xsl:value-of select="@url"/>
</xsl:when>
<xsl:otherwise>#</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:value-of select="@label"/>
</a>
<xsl:if test="./d:leaf">
<div class="shadow">
<ul class="menu">
<xsl:for-each select="./d:leaf">
<li>
<a>
<xsl:attribute name="href">
<xsl:choose>
<xsl:when test="@url and @absolute='true'">
<xsl:value-of select="@url"/>
</xsl:when>
<xsl:when test="@url and @absolute='false'">
<xsl:value-of select="$contextPath"/><xsl:value-of select="@url"/>
</xsl:when>
<xsl:otherwise>#</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:value-of select="@label"/>
</a>
</li>
</xsl:for-each>
</ul>
</div>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
/impl/conf/directories/utils.xsl
31,8 → 31,11
<xsl:attribute name="href">
<xsl:choose>
<xsl:when test="string(@absolute)='true'">
<xsl:value-of select="@url"/>
</xsl:when>
<xsl:value-of select="@url"/>
</xsl:when>
<xsl:when test="@proxy='local'">
<xsl:value-of select="$contextPath"/><xsl:value-of select="@url"/>
</xsl:when>
<xsl:when test="@idPrefixSize"><xsl:value-of select="$dirStartPath"/><xsl:apply-templates select=".." mode="linkParent"/>/<xsl:value-of select="substring(@id,@idPrefixSize+1)"/></xsl:when>
<xsl:when test="@remoteExtensionRoot='true'"><xsl:value-of select="$dirStartPath"/><xsl:apply-templates select=".." mode="linkParent"/>/<xsl:value-of select="@id"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$dirStartPath"/><xsl:apply-templates select=".." mode="linkParent"/>/<xsl:value-of select="@id"/><xsl:value-of select="@url"/></xsl:otherwise>
/impl/conf/directories/topMenus.xml
23,13 → 23,13
</leaf>
 
<leaf node="true" label="Ensino" id="ensino">
<leaf node="false" id="lecenciaturas" label="Licenciaturas" absolute="false" url="/courses?type=L" proxy="local"/>
<leaf node="false" id="mestrados" label="Mestrados" absolute="false" url="/courses?type=M" proxy="local"/>
<leaf node="false" id="accurtadur" label="Acções de Formação de Curta Duração" absolute="false" url="/courses?type=C" proxy="local"/>
<leaf node="false" id="cet" label="CET" absolute="false" url="/courses?type=E" proxy="local"/>
<leaf node="false" id="favanc" label="Formações Avançadas" absolute="false" url="/courses?type=A" proxy="local"/>
<leaf node="false" id="pgrad" label="Pós Graduação" absolute="false" url="/courses?type=P" proxy="local"/>
<leaf node="false" id="tesp" label="TeSP" absolute="false" url="/courses?type=T" proxy="local"/>
<leaf node="false" id="lecenciaturas" label="Licenciaturas" absolute="false" url="/courses.do?type=L" proxy="local"/>
<leaf node="false" id="mestrados" label="Mestrados" absolute="false" url="/courses.do?type=M" proxy="local"/>
<leaf node="false" id="accurtadur" label="Acções de Formação de Curta Duração" absolute="false" url="/courses.do?type=C" proxy="local"/>
<leaf node="false" id="cet" label="CET" absolute="false" url="/courses.do?type=E" proxy="local"/>
<leaf node="false" id="favanc" label="Formações Avançadas" absolute="false" url="/courses.do?type=A" proxy="local"/>
<leaf node="false" id="pgrad" label="Pós Graduação" absolute="false" url="/courses.do?type=P" proxy="local"/>
<leaf node="false" id="tesp" label="TeSP" absolute="false" url="/courses.do?type=T" proxy="local"/>
</leaf>
 
<leaf node="true" label="I&amp;D" id="ied">
/impl/conf/berserk/sd.xml
895,6 → 895,18
</service>
 
<service>
<name>LoadCourseUnitInEvaluationBySigesCodes</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService</implementationClass>
<description>Load course old units</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadUnitInEvaluation</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
</filterChains>
</service>
 
<service>
<name>LoadCourseUnitsBySigesCodesSemestreLastYear</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService</implementationClass>
<description>Load a unique unit by sigescode, semestre and course code</description>
2137,6 → 2149,86
</filterChains>
</service>
 
<service>
<name>LoadJobServiceTaskSchedullers</name>
<implementationClass>pt.estgp.estgweb.services.jobs.JobServiceInterfaces</implementationClass>
<description>Save a Directory Object</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadJobServiceTaskSchedullers</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
 
<service>
<name>LoadJobServiceTask</name>
<implementationClass>pt.estgp.estgweb.services.jobs.JobServiceInterfaces</implementationClass>
<description>Save a Directory Object</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadJobServiceTask</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
 
<service>
<name>LoadJobServiceTaskScheduler</name>
<implementationClass>pt.estgp.estgweb.services.jobs.JobServiceInterfaces</implementationClass>
<description>Save a Directory Object</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadJobServiceTaskScheduler</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
 
<service>
<name>RunNowJobServiceTaskScheduller</name>
<implementationClass>pt.estgp.estgweb.services.jobs.JobScheduleService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>runNow</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>ToggleActiveJobServiceTaskScheduller</name>
<implementationClass>pt.estgp.estgweb.services.jobs.JobScheduleService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>toggleActive</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>DeleteJobServiceTaskScheduller</name>
<implementationClass>pt.estgp.estgweb.services.jobs.JobScheduleService</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>delete</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
</filterChains>
</service>
 
 
 
 
 
 
 
</serviceDefinitions>
/impl/src/java/jomm/dao/impl/AbstractDao.java
13,9 → 13,7
import pt.estgp.estgweb.domain.DomainSerializableObject;
 
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.*;
 
import static org.hibernate.criterion.Restrictions.eq;
 
258,6 → 256,8
}
}
 
 
 
/**
* Returns results as a page.
* <p/>
903,4 → 903,38
 
return criteria;
}
 
/**
* return deleted objects
* @param incompleteList
* @param persistentList
* @param comparator
* @return
*/
public List<CLAZZ> deleteMissing(Collection<CLAZZ> incompleteList, Collection<CLAZZ> persistentList,Comparator<CLAZZ> comparator)
{
List<CLAZZ> deletedObjects = new ArrayList<CLAZZ>();
//Remover apagados
Iterator<CLAZZ> iterPersistentObjects = persistentList.iterator();
while(iterPersistentObjects.hasNext())
{
CLAZZ persisitentObj = iterPersistentObjects.next();
boolean found = false;
for(CLAZZ incompleteListObj: incompleteList)
{
if(comparator.compare(incompleteListObj,persisitentObj)==0)
{
found = true;
break;
}
}
if(!found)
{
iterPersistentObjects.remove();
deletedObjects.add(persisitentObj);
delete(persisitentObj);
}
}
return deletedObjects;
}
}
/impl/src/java/pt/estgp/estgweb/utils/StringsUtils.java
25,6 → 25,21
return roles;
}
 
public static String getSerialLongs(List<Long> longs, String separator)
{
if (longs == null)
return null;
String roles = null;
for (Long role : longs)
{
if (roles == null)
roles = "" + role;
else
roles += separator + role;
}
return roles;
}
 
public static List<String> getStringsFromSerial(String stringsSerial, String separator)
{
if (stringsSerial == null)
38,6 → 53,19
return l;
}
 
public static List<Long> getLongsFromSerial(String stringsSerial, String separator)
{
if (stringsSerial == null)
return null;
String[] roles = stringsSerial.split(separator);
List<Long> l = new ArrayList<Long>();
for (String role : roles)
{
l.add(Long.parseLong(role));
}
return l;
}
 
//TODO ARRANJAR ISTO
public static String getNormalizedName(String nome)
{
/impl/src/java/pt/estgp/estgweb/utils/DynamicArrayList.java
New file
0,0 → 1,70
package pt.estgp.estgweb.utils;
 
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 16/11/15.
*/
public class DynamicArrayList<E> extends ArrayList<E>
{
Class referenceClass;
public DynamicArrayList(Class clazz)
{
this.referenceClass = clazz;
}
 
 
@Override
public E get(int i) {
if(i >= size())
{
while(i >= size())
{
try {
super.add((E)referenceClass.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return super.get(i);
}
 
@Override
public void add(int i, E obj) {
if(i >= size())
{
while(i >= size())
{
try {
super.add((E)referenceClass.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
super.add(i,obj);
}
 
@Override
public E set(int i, E obj) {
if(i >= size())
{
while(i >= size())
{
try {
super.add((E)referenceClass.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return super.set(i,obj);
}
}
/impl/src/java/pt/estgp/estgweb/Globals.java
395,4 → 395,6
public static final String FTP_IONLINE_USER = ConfigProperties.getProperty("ionline.user");
public static final String FTP_IONLINE_PASS = ConfigProperties.getProperty("ionline.pass");
public static final String FTP_IONLINE_START_PATH = ConfigProperties.getProperty("server.ionline.start.path");
 
public static final String ROLE_INVITED = "invited";
}
/impl/src/java/pt/estgp/estgweb/services/courseunits/courseunitsummaries.fo.xsl
88,7 → 88,7
<fo:table-row>
<fo:table-cell padding-top="3pt">
<fo:block >
Revisto a <xsl:value-of select="//updateDate"/> por <xsl:value-of select="$revisor"/> / Página <fo:page-number/>
Atualizado a <xsl:value-of select="//updateDate"/> / Página <fo:page-number/>
</fo:block>
<fo:block font-size="5pt">
ESTG.SA.xxxx.1
114,6 → 114,7
 
<xsl:template match="/courseUnit">
 
 
<fo:table table-layout="fixed" border="0px solid black" margin="0.5em" font-size="8.5pt">
<xsl:call-template name="gen_cols"/>
<fo:table-body text-align="left">
226,7 → 227,7
</fo:table-row>
 
 
<xsl:if test="//summary">
<xsl:if test="//summary[./numeroAula != '-1']">
<fo:table-row background-color="#FFF" color="#000" padding="0">
 
<fo:table-cell padding="0" number-columns-spanned="2" border-right="1px solid gray" border-bottom="1px solid gray" display-align="center" >
242,68 → 243,70
<fo:table-body>
 
 
<xsl:for-each select="//summary">
<xsl:for-each select="//summary[./numeroAula != '-1']">
<xsl:sort select="dataAula" case-order="lower-first"/>
<fo:table-row>
<fo:table-cell border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
<xsl:value-of select="./dataAula"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray" >
<fo:block font-size="8pt" >
Aula <xsl:value-of select="./numeroAula"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray" >
<fo:block font-size="8pt">
<xsl:value-of select="./tipoAula"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
<xsl:value-of select="./numeroHoras"/> Horas
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray" >
<fo:block font-size="8pt">
<xsl:value-of select="./alunosPresentes"/> Alunos
</fo:block>
</fo:table-cell>
 
</fo:table-row>
<fo:table-row>
<fo:table-cell border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
<xsl:value-of select="./dataAula"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray" >
<fo:block font-size="8pt" >
Aula <xsl:value-of select="./numeroAula"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray" >
<fo:block font-size="8pt">
<xsl:value-of select="./tipoAula"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
<xsl:value-of select="./numeroHoras"/> Horas
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="0.5px solid gray" >
<fo:block font-size="8pt">
<xsl:value-of select="./alunosPresentes"/> Alunos
</fo:block>
</fo:table-cell>
 
<fo:table-row>
<fo:table-cell border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
Titulo
</fo:block>
</fo:table-cell>
<fo:table-cell number-columns-spanned="4" border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
<xsl:value-of select="./titulo"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-row>
 
<fo:table-row>
<fo:table-cell border-bottom="1px solid gray" >
<fo:block font-size="8pt">
Descrição
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="1px solid gray" number-columns-spanned="4">
<fo:block font-size="8pt">
<xsl:value-of select="./descricao"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
Titulo
</fo:block>
</fo:table-cell>
<fo:table-cell number-columns-spanned="4" border-bottom="0.5px solid gray">
<fo:block font-size="8pt">
<xsl:value-of select="./titulo"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
 
<fo:table-row height='20px'>
<fo:table-cell number-columns-spanned="5" >
<fo:block ></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-bottom="1px solid gray" >
<fo:block font-size="8pt">
Descrição
</fo:block>
</fo:table-cell>
<fo:table-cell border-bottom="1px solid gray" number-columns-spanned="4">
<fo:block font-size="8pt">
<xsl:value-of select="./descricao"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
 
<fo:table-row height='20px'>
<fo:table-cell number-columns-spanned="5" >
<fo:block ></fo:block>
</fo:table-cell>
</fo:table-row>
 
</xsl:for-each>
</fo:table-body>
</fo:table>
/impl/src/java/pt/estgp/estgweb/services/courseunits/LoadCourseUnitsBySigesCodesService.java
1,19 → 1,15
package pt.estgp.estgweb.services.courseunits;
 
import pt.utl.ist.berserk.logic.serviceManager.IService;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseUnitSummaryView;
import pt.estgp.estgweb.domain.views.AnnouncementView;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.RepositoryFile;
import pt.estgp.estgweb.domain.CourseUnitSummary;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import org.apache.log4j.Logger;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.ArrayList;
import java.util.List;
import java.util.ArrayList;
 
/**
* @author Jorge Machado
40,6 → 36,16
return courseUnitViews;
}
 
public CourseUnitView loadUnitInEvaluation(String code, String courseCode, UserSession userSession) throws ServiceException {
 
 
CourseUnit c = DaoFactory.getCourseUnitDaoImpl().loadUnitInEvaluationBySigesCodes(code, courseCode);
if(c == null)
return null;
return new CourseUnitView(c);
 
}
 
public CourseUnitView loadLastYear(String code, String courseCode, String semestre, UserSession userSession) throws ServiceException {
 
if(semestre.equals("S3"))
/impl/src/java/pt/estgp/estgweb/services/courseunits/LoadSubscribedUnitsCurrentYearService.java
5,6 → 5,7
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.ArrayList;
import java.util.List;
 
/**
18,6 → 19,7
{
Student t = DaoFactory.getStudentDaoImpl().load(studentId);
List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadSubscribedImportYearUnits(studentId, DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear());
units = new ArrayList<CourseUnit>(units);
for(CourseUnit c: units)
{
c.getName();
30,6 → 32,7
{
Student t = DaoFactory.getStudentDaoImpl().load(studentId);
List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadSubscribedImportYearUnits(studentId, year);
units = new ArrayList<CourseUnit>(units);
for(CourseUnit c: units)
{
c.getName();
/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportGradesService.java
38,7 → 38,7
 
private static final Logger logger = Logger.getLogger(ImportGradesService.class);
 
private static final int MAX_COMMIT = 100;
private static final int MAX_COMMIT = 20;
 
private HashMap<Long,List<Long>> newGrades = new HashMap<Long,List<Long>>();
 
/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportStudentsService.java
38,7 → 38,7
{
 
private static final Logger logger = Logger.getLogger(ImportStudentsService.class);
private static final int MAX_COMMIT = 100;
private static final int MAX_COMMIT = 20;
 
int studentsMerged = 0;
int studentsNew = 0;
101,9 → 101,8
if (i++ > MAX_COMMIT)
{
i = 0;
setProgress((int) (((float)alunosFound)/((float)codigos.size())*100.0f));
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
setProgress((int) (((float) alunosFound) / ((float) codigos.size()) * 100.0f));
commitPartially();
}
 
Aluno alunoSiges = service.getSiGesWEBSoap().getAlunoInscrito(c, new BigDecimal(DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode()), year);
189,8 → 188,7
logger.error(e,e);
logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(), "see log for details", LogMessageTypeEnum.ERROR));
serviceLogError(e.toString(),e);
String cause = e.getCause() == null ? "" : e.getCause().toString();
sendNotificationAdmin("Erro de importacao de alunos",cause);
sendNotificationAdmin("Erro de importacao de alunos",e.toString());
}
 
 
233,6 → 231,8
return logMessages;
}
 
 
 
/**
* Envio de Notificação aos operadores do CI
* @param subject
485,10 → 485,11
public static final String JOB_importYear_KEY = "JOB_importYear_KEY";
 
@Override
protected void runJobServiceTask() throws Throwable {
protected ILogMessages runJobServiceTask() throws Throwable {
 
String importYear = (String) getParametersMap().get(JOB_importYear_KEY).getObject();
run(importYear);
String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
ILogMessages messages = run(importYear);
return messages;
 
}
 
/impl/src/java/pt/estgp/estgweb/services/sigesimports/SincronizeLastYearCourseUnitProgramsService.java
80,8 → 80,10
serviceLogInfo(logMessages.getLastMessage());
 
int i = 0;
List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadYear(year);
for (CourseUnit cu: units)
List<Long> units = DaoFactory.getCourseUnitDaoImpl().loadIds(year);
//List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadYear(year);
for (Long cuId: units)
// for (CourseUnit cu: units)
{
 
SaveCourseUnitProgram service = new SaveCourseUnitProgram();
92,10 → 94,9
{
i = 0;
setProgress((int) (((float)foundTotal)/((float)units.size())*100.0f));
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
serviceLogInfo("Commiting database");
commitPartially();
}
CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().load(cuId);
if(cu.getCourseUnitProgram() == null || !cloneOnlyNews)
{
 
183,6 → 184,7
 
//cu.setValidProgram(true);
}
setProgress(100);
logger.info("######################################");
serviceLogInfo("######################################");
logger.info("######################################");
263,7 → 265,6
logger.info("terminating programs sincronization");
serviceLogInfo("terminating programs sincronization");
logMessages.addMessage(new DefaultLogMessage("courseunitprograms.sincronization.terminating", LogMessageTypeEnum.INFO));
setProgress(100);
return logMessages;
}
 
399,13 → 400,16
* @throws Throwable
*/
@Override
protected void runJobServiceTask() throws Throwable
protected ILogMessages runJobServiceTask() throws Throwable
{
String importYear = (String) getParametersMap().get(JOB_importYear_KEY).getObject();
Boolean cloneOnlyNews = (Boolean) getParametersMap().get(JOB_cloneOnlyNews_KEY).getObject();
Boolean generateAllPdfs = (Boolean) getParametersMap().get(JOB_generateAllPdfs_KEY).getObject();
Boolean validate = (Boolean) getParametersMap().get(JOB_validate_KEY).getObject();
run(importYear,cloneOnlyNews,generateAllPdfs,validate);
String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
String cloneOnlyNewsStr = getParametersMap().get(JOB_cloneOnlyNews_KEY).getObject();
String generateAllPdfsStr = getParametersMap().get(JOB_generateAllPdfs_KEY).getObject();
String validateStr = getParametersMap().get(JOB_validate_KEY).getObject();
boolean cloneOnlyNews = cloneOnlyNewsStr != null && Boolean.parseBoolean(cloneOnlyNewsStr);
boolean generateAllPdfs = generateAllPdfsStr != null && Boolean.parseBoolean(generateAllPdfsStr);
boolean validate = validateStr != null && Boolean.parseBoolean(validateStr);
return run(importYear,cloneOnlyNews,generateAllPdfs,validate);
}
 
}
/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportTeachersService.java
40,7 → 40,7
 
private static final Logger logger = Logger.getLogger(ImportTeachersService.class);
 
private static final int MAX_COMMIT = 100;
private static final int MAX_COMMIT = 20;
 
//int studentsMerged = 0;
int teachersNew = 0;
103,8 → 103,7
{
i = 0;
setProgress((int) (((float)teachersFound)/((float)codigos.size())*100.0f));
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
commitPartially();
}
 
 
572,11 → 571,10
}
 
@Override
protected void runJobServiceTask() throws Throwable {
protected ILogMessages runJobServiceTask() throws Throwable {
 
String importYear = (String) getParametersMap().get(JOB_importYear_KEY).getObject();
run(importYear);
 
String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
return run(importYear);
}
 
public static final String JOB_importYear_KEY = "JOB_importYear_KEY";
/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportCourseService.java
271,10 → 271,11
public static final String JOB_importYear_KEY = "JOB_importYear_KEY";
 
@Override
protected void runJobServiceTask() throws Throwable {
protected ILogMessages runJobServiceTask() throws Throwable {
 
String importYear = (String) getParametersMap().get(JOB_importYear_KEY).getObject();
run(importYear);
String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
ILogMessages messages = run(importYear);
return messages;
 
}
 
/impl/src/java/pt/estgp/estgweb/services/sigesimports/ImportSumariesJson.java
79,6 → 79,7
int countUnits = 0;
int countUnitsOk = 0;
int countUnitsZeroSummaries = 0;
int countUnitsZeroValidSummaries = 0;
 
List<String> unitsZeroSummaries = new ArrayList<String>();
List<String> unitsFailed = new ArrayList<String>();
115,9 → 116,7
{
i = 0;
setProgress((int) (((float)countUnits)/((float)cUs.size())*100.0f));
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
serviceLogInfo("Commiting database");
commitPartially();
}
CourseUnit c = DaoFactory.getCourseUnitDaoImpl().load(cId);
nowCode = c.getCode();
163,6 → 162,7
JSONObject summariesJson = new JSONObject();
JSONArray summaries = new JSONArray();
summariesJson.put("summary",summaries);
int summariesValid = 0;
for(Aula aula: arrayOfAulas.getAula())
{
 
188,12 → 188,23
s.setNumeroHoras("" + aula.getNumeroCelulas().intValue());
summaries.put(s.getJson());
courseUnitSummaries.add(s);
if(s.getNumeroAula() > 0)
summariesValid++;
}
if(courseUnitSummaries.size() == 0)
{
countUnitsZeroSummaries++;
unitsZeroSummaries.add(c.getCode());
logger.info("ZERO SUMARIES unit:" + c.getCode() + " course: " + c.getCourseCode());
serviceLogInfo("ZERO SUMARIES unit:" + c.getCode() + " course: " + c.getCourseCode());
}
else if(summariesValid == 0)
{
countUnitsZeroValidSummaries++;
unitsZeroSummaries.add(c.getCode());
logger.info("ZERO VALID SUMARIES unit:" + c.getCode() + " course: " + c.getCourseCode());
serviceLogInfo("ZERO VALID SUMARIES unit:" + c.getCode() + " course: " + c.getCourseCode());
}
else
{
countUnitsOk++;
249,6 → 260,7
serviceLogInfo("UNITS FAILED: " + (countUnits - countUnitsZeroSummaries - countUnitsOk));
serviceLogInfo("UNITS IMPORT OK: " + countUnitsOk);
serviceLogInfo("UNITS ZERO SUMARIES: " + countUnitsZeroSummaries);
serviceLogInfo("UNITS ZERO VALID SUMARIES: " + countUnitsZeroValidSummaries);
serviceLogInfo("#######################################");
 
logger.info("#######################################");
257,6 → 269,7
logger.info("UNITS FAILED: " + (countUnits - countUnitsZeroSummaries - countUnitsOk));
logger.info("UNITS IMPORT OK: " + countUnitsOk);
logger.info("UNITS ZERO SUMARIES: " + countUnitsZeroSummaries);
logger.info("UNITS ZERO VALID SUMARIES: " + countUnitsZeroValidSummaries);
logger.info("#######################################");
return logMessages;
}
386,14 → 399,15
public static final String JOB_sendEmail_KEY = "JOB_sendEmail_KEY";
 
@Override
protected void runJobServiceTask() throws Throwable {
protected ILogMessages runJobServiceTask() throws Throwable {
 
String importYear = (String) getParametersMap().get(JOB_importYear_KEY).getObject();
String semestre = (String) getParametersMap().get(JOB_semestre_KEY).getObject();
Boolean sendIonline = (Boolean) getParametersMap().get(JOB_sendIonline_KEY).getObject();
Boolean sendEmail = (Boolean) getParametersMap().get(JOB_sendEmail_KEY).getObject();
run(importYear,semestre,sendIonline,sendEmail);
 
String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
String semestre = getParametersMap().get(JOB_semestre_KEY).getObject();
String sendIonlineStr = getParametersMap().get(JOB_sendIonline_KEY).getObject();
String sendEmailStr = getParametersMap().get(JOB_sendEmail_KEY).getObject();
boolean sendIonline = sendIonlineStr != null && Boolean.parseBoolean(sendIonlineStr);
boolean sendEmail = sendEmailStr != null && Boolean.parseBoolean(sendEmailStr);
return run(importYear,semestre,sendIonline,sendEmail);
}
 
}
/impl/src/java/pt/estgp/estgweb/services/ftpservices/FtpService.java
69,13 → 69,13
{
 
}
else if(passwordCode != null)
else
{
logger.info("using saved password");
password = DesUtils.getInstance().decrypt(passwordCode);
//System.out.println("SAVEDPASS:" + password);
}
else if(userSession.getUser().getPop3password() != null && userSession.getUser().getPop3password().length() > 0)
/*else if(userSession.getUser().getPop3password() != null && userSession.getUser().getPop3password().length() > 0)
{
logger.info("trying pop 3 password");
password = DesUtils.getInstance().decrypt(userSession.getUser().getPop3password());
84,7 → 84,7
{
logger.info("trying last used login password");
password = DesUtils.getInstance().decrypt(userSession.getUser().getPassword());
}
}*/
username = ftpRequestForm.getUsername();
if(username == null || username.trim().length() == 0)
username = userSession.getUsername();
/impl/src/java/pt/estgp/estgweb/services/jobs/JobServiceInterfaces.java
New file
0,0 → 1,51
package pt.estgp.estgweb.services.jobs;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.JobServiceTaskImpl;
import pt.estgp.estgweb.domain.JobServiceTaskScheduler;
import pt.estgp.estgweb.domain.JobServiceTaskSchedulerImpl;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.util.List;
 
/**
* Created by jorgemachado on 02/11/15.
*
* Todos os serviços podem correr em BackGround através da chamada ao JobRunner
* desde que implementem esta interface
*/
public class JobServiceInterfaces implements IService
{
 
 
/*Class regular log*/
private static final Logger logger = Logger.getLogger(JobServiceInterfaces.class);
 
 
public JobServiceTaskSchedulerImpl loadJobServiceTaskScheduler(Long id, UserSession sess)
{
JobServiceTaskSchedulerImpl job = (JobServiceTaskSchedulerImpl) DaoFactory.getJobServiceTaskSchedulerDaoImpl().get(id);
if(job.getLastJobServiceTask() != null)
job.getLastJobServiceTask().getId();
return job;
}
 
public JobServiceTaskImpl loadJobServiceTask(Long id, UserSession sess)
{
JobServiceTaskImpl job = (JobServiceTaskImpl) DaoFactory.getJobServiceTaskDaoImpl().get(id);
return job;
}
 
public List<JobServiceTaskScheduler> loadJobServiceTaskSchedullers(UserSession sess)
{
List<JobServiceTaskScheduler> tasks = DaoFactory.getJobServiceTaskSchedulerDaoImpl().findAll();
for(JobServiceTaskScheduler jobServiceTaskScheduler: tasks)
{
jobServiceTaskScheduler.getLastJobServiceTask().getId();
}
return tasks;
}
}
 
/impl/src/java/pt/estgp/estgweb/services/jobs/JobScheduleService.java
1,6 → 1,7
package pt.estgp.estgweb.services.jobs;
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.sigesimports.*;
18,6 → 19,8
public class JobScheduleService implements IService
{
 
private static final Logger logger = Logger.getLogger(JobScheduleService.class);
 
private static JobScheduleService instance = new JobScheduleService();
 
public static JobScheduleService getInstance()
103,9 → 106,49
}
}
 
public void runNow(Long schedulerId, UserSession sess)
{
JobServiceTaskScheduler persistent = DaoFactory.getJobServiceTaskSchedulerDaoImpl().load(schedulerId);
logger.info("Will run now task " + persistent.getTargetService() + " id:" + schedulerId);
persistent.setNow(true);
}
 
public JobServiceTaskScheduler toggleActive(Long schedulerId, UserSession sess)
{
JobServiceTaskScheduler persistent = DaoFactory.getJobServiceTaskSchedulerDaoImpl().load(schedulerId);
if(persistent.isActive())
logger.info("Will deactivate task " + persistent.getTargetService() + " id:" + schedulerId);
else
logger.info("Will activate task " + persistent.getTargetService() + " id:" + schedulerId);
persistent.setActive(!persistent.isActive());
return persistent;
}
 
public void delete(Long schedulerId, UserSession sess)
{
 
JobServiceTaskScheduler persistent = DaoFactory.getJobServiceTaskSchedulerDaoImpl().load(schedulerId);
logger.warn("Will delete task " + persistent.getTargetService() + " id:" + schedulerId);
Set<JobServiceTaskSchedulerParameter> params = persistent.getServiceTaskSchedulerParameters();
if(params != null)
{
Iterator<JobServiceTaskSchedulerParameter> iterParam = params.iterator();
while(iterParam.hasNext()) {
JobServiceTaskSchedulerParameter next = iterParam.next();
next.setJobServiceTaskScheduler(null);
iterParam.remove();
DaoFactory.getJobServiceTaskSchedulerParameterDaoImpl().delete(next);
}
}
DaoFactory.getJobServiceTaskSchedulerDaoImpl().delete(persistent);
}
 
public static void main(String[] args) throws SQLException
{
AbstractDao.getCurrentSession().beginTransaction();
scheduleImportSummaries();
scheduleImportTeachers();
scheduleImportCourses();
scheduleImportStudents();
AbstractDao.getCurrentSession().getTransaction().commit();
}
130,10 → 173,10
param2.setDescription("desc2");
param3.setDescription("desc3");
param4.setDescription("desc4");
param1.setObject(new Boolean(false));
param2.setObject(new Boolean(true));
param1.setObject("false");
param2.setObject("true");
param3.setObject("201415");
param4.setObject(new Boolean(true));
param4.setObject("true");
Set<JobServiceTaskSchedulerParameter> params = new HashSet<JobServiceTaskSchedulerParameter>();
params.add(param1);
params.add(param2);
142,7 → 185,7
jobServiceTaskScheduler.setServiceTaskSchedulerParameters(params);
 
jobServiceTaskScheduler.setDaily(true);
jobServiceTaskScheduler.setMonthday(GregorianCalendar.NOVEMBER);
jobServiceTaskScheduler.setMonthday(1);
jobServiceTaskScheduler.setWeekday(GregorianCalendar.MONDAY);
jobServiceTaskScheduler.setHour(01);
jobServiceTaskScheduler.setMinute(0);
181,10 → 224,10
param2.setDescription("desc2");
param3.setDescription("desc3");
param4.setDescription("desc4");
param1.setObject("201415");
param1.setObject("201516");
param2.setObject("S1");
param3.setObject(new Boolean(false));
param4.setObject(new Boolean(false));
param3.setObject("false");
param4.setObject("true");
Set<JobServiceTaskSchedulerParameter> params = new HashSet<JobServiceTaskSchedulerParameter>();
params.add(param1);
params.add(param2);
193,9 → 236,11
jobServiceTaskScheduler.setServiceTaskSchedulerParameters(params);
 
jobServiceTaskScheduler.setDaily(true);
jobServiceTaskScheduler.setMonthday(GregorianCalendar.NOVEMBER);
jobServiceTaskScheduler.setWeekly(false);
jobServiceTaskScheduler.setMonthly(false);
jobServiceTaskScheduler.setMonthday(1);
jobServiceTaskScheduler.setWeekday(GregorianCalendar.MONDAY);
jobServiceTaskScheduler.setHour(01);
jobServiceTaskScheduler.setHour(05);
jobServiceTaskScheduler.setMinute(0);
jobServiceTaskScheduler.setSecond(0);
jobServiceTaskScheduler.setTargetService(ImportSumariesJson.class.getName());
207,7 → 252,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Sumaries");
jobServiceTaskScheduler.setDescription("Sumarios");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
226,7 → 271,8
jobServiceTaskScheduler.setServiceTaskSchedulerParameters(params);
 
jobServiceTaskScheduler.setDaily(true);
jobServiceTaskScheduler.setMonthday(GregorianCalendar.NOVEMBER);
jobServiceTaskScheduler.setMonthly(false);
jobServiceTaskScheduler.setMonthday(1);
jobServiceTaskScheduler.setWeekday(GregorianCalendar.MONDAY);
jobServiceTaskScheduler.setHour(01);
jobServiceTaskScheduler.setMinute(0);
240,7 → 286,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Courses");
jobServiceTaskScheduler.setDescription("Cursos");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
261,9 → 307,11
jobServiceTaskScheduler.setServiceTaskSchedulerParameters(params);
 
jobServiceTaskScheduler.setDaily(true);
jobServiceTaskScheduler.setMonthly(false);
jobServiceTaskScheduler.setWeekly(false);
jobServiceTaskScheduler.setMonthday(GregorianCalendar.NOVEMBER);
jobServiceTaskScheduler.setWeekday(GregorianCalendar.MONDAY);
jobServiceTaskScheduler.setHour(01);
jobServiceTaskScheduler.setHour(03);
jobServiceTaskScheduler.setMinute(0);
jobServiceTaskScheduler.setSecond(0);
jobServiceTaskScheduler.setTargetService(ImportStudentsService.class.getName());
275,7 → 323,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Students");
jobServiceTaskScheduler.setDescription("Estudantes");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
294,9 → 342,11
jobServiceTaskScheduler.setServiceTaskSchedulerParameters(params);
 
jobServiceTaskScheduler.setDaily(true);
jobServiceTaskScheduler.setWeekly(false);
jobServiceTaskScheduler.setMonthly(false);
jobServiceTaskScheduler.setMonthday(GregorianCalendar.NOVEMBER);
jobServiceTaskScheduler.setWeekday(GregorianCalendar.MONDAY);
jobServiceTaskScheduler.setHour(01);
jobServiceTaskScheduler.setHour(02);
jobServiceTaskScheduler.setMinute(0);
jobServiceTaskScheduler.setSecond(0);
jobServiceTaskScheduler.setTargetService(ImportTeachersService.class.getName());
308,7 → 358,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Teachers");
jobServiceTaskScheduler.setDescription("Professores");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
/impl/src/java/pt/estgp/estgweb/services/jobs/ServiceJob.java
1,5 → 1,6
package pt.estgp.estgweb.services.jobs;
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
7,6 → 8,7
import pt.estgp.estgweb.domain.JobServiceTask;
import pt.estgp.estgweb.domain.JobServiceTaskImpl;
import pt.estgp.estgweb.domain.JobServiceTaskParameter;
import pt.estgp.estgweb.services.logresults.ILogMessages;
 
import java.io.IOException;
import java.util.*;
97,10 → 99,16
jobServiceTask.setStatusEnum(JobServiceTaskImpl.JobStatus.STARTED);
jobServiceTask.setServiceStartDate(new Date());
jobServiceTask.setServiceLastUpdateDate(new Date());
commitPartially();
try {
//call the implementation of service this will update serviceLog and progress
runJobServiceTask();
jobServiceTask.setStatusEnum(JobServiceTaskImpl.JobStatus.FINISHED);
ILogMessages messages = runJobServiceTask();
if(messages.hasErrors())
jobServiceTask.setStatusEnum(JobServiceTaskImpl.JobStatus.FINISHED_ERRORS);
else if(messages.hasWarnings())
jobServiceTask.setStatusEnum(JobServiceTaskImpl.JobStatus.FINISHED_WARNINGS);
else
jobServiceTask.setStatusEnum(JobServiceTaskImpl.JobStatus.FINISHED);
jobServiceTask.setServiceLastUpdateDate(new Date());
jobServiceTask.setServiceFinishDate(new Date());
serviceLog.info("FINISHING SERVICE");
125,5 → 133,11
public void serviceLogFatal(String str, Throwable e){ if(jobServiceTask != null) serviceLog.fatal(str,e);}
 
//Implemented in SubService to run the Job
protected abstract void runJobServiceTask() throws Throwable;
protected abstract ILogMessages runJobServiceTask() throws Throwable;
 
protected void commitPartially() {
AbstractDao.getCurrentSession().getTransaction().commit();
AbstractDao.getCurrentSession().beginTransaction();
AbstractDao.getCurrentSession().update(jobServiceTask);
}
}
/impl/src/java/pt/estgp/estgweb/services/jobs/JobDeamon.java
109,9 → 109,7
{
logger.info("Schedulling one job " + schedule.getTargetService() + " to run");
JobServiceTaskImpl jobServiceTask = DomainObjectFactory.createJobServiceTaskImpl();
DaoFactory.getJobServiceTaskDaoImpl().save(jobServiceTask);
jobServiceTask.setStartDate(new Date());
DaoFactory.getJobServiceTaskDaoImpl().flush();
jobServiceTask.setTargetService(schedule.getTargetService());
jobServiceTask.setCreatedBy(schedule.getCreatedBy());
jobServiceTask.setExecuted(false);
122,6 → 120,9
jobServiceTask.setRequestStop(false);
jobServiceTask.setOwner(schedule.getCreatedBy());
jobServiceTask.setJobHandler(new SerializableNullJobHandler());
jobServiceTask.setProgress(0);
DaoFactory.getJobServiceTaskDaoImpl().save(jobServiceTask);
schedule.setLastJobServiceTask(jobServiceTask);
try {
String filePath = Class.forName(schedule.getTargetService()).getSimpleName() + "-" + DatesUtils.getFormatedFileSystem(new Date());
jobServiceTask.setLogFilePath( filePath + ".log");
140,25 → 141,26
paramJob.setJobServiceTask(jobServiceTask);
DaoFactory.getJobServiceTaskParameterDaoImpl().save(paramJob);
}
DaoFactory.getJobServiceTaskParameterDaoImpl().flush();
jobServiceTask.setServiceTaskParameters(paramsJob);
DaoFactory.getJobServiceTaskDaoImpl().saveOrUpdate(jobServiceTask);
 
//DaoFactory.getJobServiceTaskDaoImpl().saveOrUpdate(jobServiceTask);
 
//a last schedule date e a hora a que foi marcado para correr a ultima vez
//a partir do momento que e' agendado o trabalho ele vai correr portanto
//e' esta a hora que se considera para a corrida
schedule.setLastScheduleDate(new Date());
if(schedule.isNow())
{
schedule.setNow(false);
}
}
//Remove Now Schedules
if(schedule.isNow())
{
DaoFactory.getJobServiceTaskSchedulerDaoImpl().delete(schedule);
}
}
}
 
private boolean isRunnableNow(JobServiceTaskScheduler schedule,Date lastDate)
{
if(!schedule.isActive())
return false;
if(lastDate == null)
lastDate = new Date(0);
GregorianCalendar gC = new GregorianCalendar();
/impl/src/java/pt/estgp/estgweb/services/logresults/impl/DefaultLogMessages.java
3,6 → 3,7
import pt.estgp.estgweb.domain.CourseUnitSummary;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.ILogMessage;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
 
import java.util.List;
import java.util.ArrayList;
40,6 → 41,26
return summaries;
}
 
@Override
public boolean hasErrors() {
if(logMessages == null)
return false;
for(ILogMessage m:logMessages)
if(m.getType() == LogMessageTypeEnum.ERROR || m.getType() == LogMessageTypeEnum.FATAL)
return true;
return false;
}
 
@Override
public boolean hasWarnings() {
if(logMessages == null)
return false;
for(ILogMessage m:logMessages)
if(m.getType() == LogMessageTypeEnum.WARNING)
return true;
return false;
}
 
public void setSummaries(List<CourseUnitSummary> summaries) {
this.summaries = summaries;
}
/impl/src/java/pt/estgp/estgweb/services/logresults/ILogMessages.java
13,4 → 13,6
{
public List<ILogMessage> getLogMessages();
List<CourseUnitSummary> getSummaries();
public boolean hasErrors();
public boolean hasWarnings();
}
/impl/src/java/pt/estgp/estgweb/services/directories/xsd/DynamicArrayList.java
File deleted
/impl/src/java/pt/estgp/estgweb/services/directories/xsd/DirectoryImpl.java
1,5 → 1,7
package pt.estgp.estgweb.services.directories.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
/**
* Created by jorgemachado on 16/11/15.
*/
/impl/src/java/pt/estgp/estgweb/services/directories/xsd/RightsTImpl.java
1,5 → 1,7
package pt.estgp.estgweb.services.directories.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
/**
* Created by jorgemachado on 16/11/15.
*/
/impl/src/java/pt/estgp/estgweb/services/directories/xsd/GroupsDeclarationTImpl.java
1,5 → 1,7
package pt.estgp.estgweb.services.directories.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
/**
* Created by jorgemachado on 16/11/15.
*/
/impl/src/java/pt/estgp/estgweb/services/directories/xsd/LeafTImpl.java
1,5 → 1,7
package pt.estgp.estgweb.services.directories.xsd;
 
import pt.estgp.estgweb.utils.DynamicArrayList;
 
import java.util.Iterator;
import java.util.List;
 
43,7 → 45,7
 
public static LeafT removeLeaf(LeafT l,String id)
{
return removeLeafT(l.getLeaf(),id);
return removeLeafT(l.getLeaf(), id);
}
public static LeafT findLeaf(LeafT l,String id)
{
/impl/src/java/pt/estgp/estgweb/services/authenticate/AuthenticateService.java
4,6 → 4,7
import openldap.ILdapManager;
import openldap.LdapManagerFactory;
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.common.CommonServicesManager;
125,6 → 126,8
userSession.setName(u.getName());
userSession.setUsername(u.getUsername());
userSession.setUser(u);
if(u.getRoles() == null || u.getRoles().trim().length() == 0)
u.setRoles(Globals.ROLE_INVITED);
 
DaoFactory.getUserSessionDaoImpl().reattach(userSession);
return userSession;
/impl/src/java/pt/estgp/estgweb/domain/StudentImpl.java
190,10 → 190,10
Object[] args = new Object[]{getId(),year};
cuYear = (List<CourseUnit>) sm.execute(null, "LoadSubscribedUnitsGivenYear", args, names);
 
for(CourseUnit c: cuYear)
{
cuYear.add(c);
}
if(cuYear != null)
subscribedUnitsYear.put(year,cuYear);
else
subscribedUnitsYear.put(year,new ArrayList<CourseUnit>());
}
catch (Throwable e)
{
/impl/src/java/pt/estgp/estgweb/domain/UserManagedRoleImpl.java
1,12 → 1,12
package pt.estgp.estgweb.domain;
 
import jomm.utils.StringsUtils;
import pt.estgp.estgweb.utils.RoleManager;
 
import java.util.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
import pt.estgp.estgweb.utils.RoleManager;
 
 
public abstract class UserManagedRoleImpl extends UserImpl
{
 
61,6 → 61,7
}
}
}
 
return super.getRoles();
}
}
/impl/src/java/pt/estgp/estgweb/domain/views/JobServiceTaskSchedulerView.java
New file
0,0 → 1,130
package pt.estgp.estgweb.domain.views;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.JobServiceTaskScheduler;
import pt.estgp.estgweb.domain.JobServiceTaskSchedulerImpl;
import pt.estgp.estgweb.domain.JobServiceTaskSchedulerParameter;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.utils.DynamicArrayList;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
 
/**
* @author Jorge Machado
* @date 2/Mar/2008
* @time 19:34:49
* @see pt.estgp.estgweb.domain.views
*/
public class JobServiceTaskSchedulerView extends DomainObjectView
{
 
private static Logger logger = Logger.getLogger(JobServiceTaskSchedulerView.class);
 
 
JobServiceTaskSchedulerImpl jobServiceTaskScheduler;
List<JobServiceTaskSchedulerParameter> parameters;
 
@Override
public Class getReferenceClass() {
return JobServiceTaskScheduler.class;
}
 
@Override
public Serializable getSerializable()
{
return jobServiceTaskScheduler.getId();
}
 
public JobServiceTaskSchedulerView()
{
 
}
 
public JobServiceTaskSchedulerView(JobServiceTaskSchedulerImpl jobServiceTaskScheduler)
{
super(jobServiceTaskScheduler);
init(jobServiceTaskScheduler);
}
public void init(JobServiceTaskSchedulerImpl jobServiceTaskScheduler)
{
parameters = new ArrayList<JobServiceTaskSchedulerParameter>();
 
if(jobServiceTaskScheduler.getServiceTaskSchedulerParameters() != null)
{
parameters.addAll(jobServiceTaskScheduler.getServiceTaskSchedulerParameters());
}
 
}
 
public void persistViewInObject(JobServiceTaskScheduler jobServiceTaskScheduler)
{
jobServiceTaskScheduler.setDescription(this.jobServiceTaskScheduler.getDescription());
jobServiceTaskScheduler.setTargetService(this.jobServiceTaskScheduler.getTargetService());
jobServiceTaskScheduler.setWeekly(this.jobServiceTaskScheduler.isWeekly());
jobServiceTaskScheduler.setWeekday(this.jobServiceTaskScheduler.getWeekday());
jobServiceTaskScheduler.setDaily(this.jobServiceTaskScheduler.isDaily());
jobServiceTaskScheduler.setHour(this.jobServiceTaskScheduler.getHour());
jobServiceTaskScheduler.setMinute(this.jobServiceTaskScheduler.getMinute());
jobServiceTaskScheduler.setSecond(this.jobServiceTaskScheduler.getSecond());
jobServiceTaskScheduler.setMonthly(this.jobServiceTaskScheduler.isMonthly());
jobServiceTaskScheduler.setMonthday(this.jobServiceTaskScheduler.getMonthday());
jobServiceTaskScheduler.setNow(this.jobServiceTaskScheduler.isNow());
 
//Remover apagados
List<JobServiceTaskSchedulerParameter> deleted = DaoFactory.getJobServiceTaskSchedulerParameterDaoImpl()
.deleteMissing(
this.parameters,
jobServiceTaskScheduler.getServiceTaskSchedulerParameters(),
new Comparator<JobServiceTaskSchedulerParameter>()
{
@Override
public int compare(JobServiceTaskSchedulerParameter j1, JobServiceTaskSchedulerParameter j2) {
return (int) (j1.getId() - j2.getId());
}
});
for(JobServiceTaskSchedulerParameter d: deleted)
d.setJobServiceTaskScheduler(null);
 
for(JobServiceTaskSchedulerParameter newParam: parameters)
{
if(newParam.getId() <= 0)
{
newParam.setJobServiceTaskScheduler(jobServiceTaskScheduler);
jobServiceTaskScheduler.getServiceTaskSchedulerParameters().add(newParam);
newParam.setSaveDate(new Date());
DaoFactory.getJobServiceTaskSchedulerParameterDaoImpl().save(newParam);
}
else
{
JobServiceTaskSchedulerParameter persistentParam = DaoFactory.getJobServiceTaskSchedulerParameterDaoImpl().load(newParam.getId());
persistentParam.setDescription(newParam.getDescription());
persistentParam.setName(newParam.getName());
persistentParam.setObject(newParam.getObject());
}
}
}
 
public JobServiceTaskSchedulerImpl getJobServiceTaskScheduler() {
return jobServiceTaskScheduler;
}
 
public void setJobServiceTaskScheduler(JobServiceTaskSchedulerImpl jobServiceTaskScheduler) {
this.jobServiceTaskScheduler = jobServiceTaskScheduler;
}
 
public List<JobServiceTaskSchedulerParameter> getParameters() {
if(parameters == null)
parameters = new DynamicArrayList<JobServiceTaskSchedulerParameter>(JobServiceTaskSchedulerParameter.class);
return parameters;
}
 
public void setParameters(List<JobServiceTaskSchedulerParameter> parameters) {
this.parameters = parameters;
}
 
 
}
Property changes:
Added: svn:executable
+ *
/impl/src/java/pt/estgp/estgweb/domain/views/CourseUnitView.java
25,6 → 25,7
 
LoadCourseUnitAnnouncements loadCourseUnitAnnouncements = new LoadCourseUnitAnnouncements();
 
 
private long id;
private String name;
private String code;
55,6 → 56,7
private String evaluationStreamId;
private boolean validProgram;
private UserView validatorUser;
private boolean teacherCompleteEvaluation = false;
private boolean validEvaluation = false;
private int programSize;
private String extension;
65,6 → 67,10
 
private CourseView courseView;
 
private String interfaceImportYear = null;
 
private boolean evaluationOpenByAdmin = false;
 
public Class getReferenceClass()
{
return CourseUnitImpl.class;
115,6 → 121,9
 
private void init(CourseUnit courseUnit, boolean initTeachers, boolean initStudents, boolean initBlog, boolean validatorUser)
{
 
this.interfaceImportYear = DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear();
 
this.pathIntranet = courseUnit.getPathIntranet();
this.normalizedName = courseUnit.getNormalizedName();
this.courseUnit = courseUnit;
126,6 → 135,7
this.courseCode = courseUnit.getCourseCode();
this.summariesJson = courseUnit.getSummariesJson();
this.sumariosPathFileIntranet = ((CourseUnitImpl)courseUnit).getSummariosPathFileIntranet();
this.evaluationOpenByAdmin = courseUnit.isEvaluationOpenByAdmin(); //nao tem persistencia propria tem de ser feito num serviço
 
// this.objectives = courseUnit.getObjectives(); DEPRECATED
if(courseUnit.getCourseUnitProgram() !=null && courseUnit.getCourseUnitProgram().getCourseUnitProgramPart2() != null)
148,6 → 158,7
{
evaluationStreamId = courseUnit.getEvaluationStreamId();
validEvaluation = courseUnit.getCourseUnitEvaluation().isClosed();
teacherCompleteEvaluation = courseUnit.getCourseUnitEvaluation().isTeacherComplete();
}
 
// if(courseUnit.getBlog() != null)
193,6 → 204,9
return evaluationStreamId;
}
 
public boolean isTeacherCompleteEvaluation() {
return teacherCompleteEvaluation;
}
 
public String getSumariosPathFileIntranet() {
return sumariosPathFileIntranet;
504,11 → 518,13
CourseUnitSummaryView view = new CourseUnitSummaryView(sum);
summariesFromJson.add(view);
}
else
else if(importYear.equals(interfaceImportYear))
//so verifica atrasados para unidades do ano corrente a titulo informativo
{
CourseUnitSummaryView view = new CourseUnitSummaryView(sum);
if(view.getNumber() < 0 && view.getOriginalDate().getTime() < System.currentTimeMillis())
if(view.getNumber() < 0 && view.getOriginalDate().getTime() + 48*60*60*1000 < System.currentTimeMillis())
{
 
//System.out.println(view.getNumber() + " " + view.getDate() + " " + view.getOriginalDate());
lateSummaries++;
lateSummariesDates.add(view.getDate());
642,6 → 658,15
return summaries;
}
 
 
public boolean isEvaluationOpenByAdmin() {
return evaluationOpenByAdmin;
}
 
public void setEvaluationOpenByAdmin(boolean evaluationOpenByAdmin) {
this.evaluationOpenByAdmin = evaluationOpenByAdmin;
}
 
public String getTeachersSnipet()
{
String sep = "";
/impl/src/java/pt/estgp/estgweb/domain/UserImpl.java
15,6 → 15,8
}
 
 
 
 
public boolean isNewUser()
{
return newUser;
/impl/src/java/pt/estgp/estgweb/domain/JobServiceTaskImpl.java
43,6 → 43,8
PENDING,
STARTED,
FINISHED,
FINISHED_ERRORS,
FINISHED_WARNINGS,
FAILED,
UNKNOWN_ERROR;
 
56,6 → 58,10
return STARTED;
if(status.equals(FINISHED.name()))
return FINISHED;
if(status.equals(FINISHED_ERRORS.name()))
return FINISHED_ERRORS;
if(status.equals(FINISHED_WARNINGS.name()))
return FINISHED_WARNINGS;
if(status.equals(FAILED.name()))
return FAILED;
return UNKNOWN_ERROR;
74,4 → 80,21
setStatus(statusEnum.name());
}
 
public String getServiceLastUpdateDateFormated() {
if(getServiceLastUpdateDate() == null)
return "";
return pt.estgp.estgweb.web.utils.DatesUtils.getStringFromDateWithMinutesAndSeconds(getServiceLastUpdateDate());
}
 
public String getServiceFinishDateFormated() {
if(getServiceFinishDate() == null)
return "";
return pt.estgp.estgweb.web.utils.DatesUtils.getStringFromDateWithMinutesAndSeconds(getServiceFinishDate());
}
 
public String getServiceStartDateFormated() {
if(getServiceStartDate() == null)
return "";
return pt.estgp.estgweb.web.utils.DatesUtils.getStringFromDateWithMinutesAndSeconds(getServiceStartDate());
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/JobServiceTaskDaoImpl.java
1,5 → 1,9
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.criterion.Order;
 
import java.util.List;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
15,7 → 19,12
return (JobServiceTaskDaoImpl) myInstance;
}
 
public List<JobServiceTaskDaoImpl> findLastNJobTasks(int max)
{
return createCriteria().addOrder(Order.desc("serviceStartDate")).setMaxResults(max).list();
}
 
 
 
 
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/ConfigurationDaoImpl.java
2,6 → 2,7
 
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.utils.StringsUtils;
 
import java.util.Date;
import java.util.List;
121,6 → 122,24
return load().getCourseUnitEvaluationActiveYear();
}
 
public List<String> getCourseUnitEvaluationActiveDegrees()
{
String degrees = load().getCourseUnitEvaluationActiveDegrees();
if(degrees == null || degrees.trim().length() == 0)
return null;
List<String> degreesList = StringsUtils.getStringsFromSerial(degrees,";");
return degreesList;
}
 
public List<Long> getCourseUnitEvaluationActiveCourseIds()
{
String courseIds = load().getCourseUnitEvaluationActiveCourseIds();
if(courseIds == null || courseIds.trim().length() == 0)
return null;
List<Long> courseIdsListLongs = StringsUtils.getLongsFromSerial(courseIds,";");
return courseIdsListLongs;
}
 
public String getCourseUnitEvaluationActiveYearCreateTransaction()
{
getCurrentSession().beginTransaction();
129,12 → 148,40
return activeYear;
}
 
public List<String> getCourseUnitEvaluationActiveDegreesCreateTransaction()
{
getCurrentSession().beginTransaction();
List<String> activeDegrees = getCourseUnitEvaluationActiveDegrees();
getCurrentSession().getTransaction().commit();
return activeDegrees;
}
 
public List<Long> getCourseUnitEvaluationActiveCourseIdsCreateTransaction()
{
getCurrentSession().beginTransaction();
List<Long> activeCourseIds = getCourseUnitEvaluationActiveCourseIds();
getCurrentSession().getTransaction().commit();
return activeCourseIds;
}
 
public void updateCourseUnitEvaluationActiveYear(String activeYear)
{
Configuration config = load();
config.setCourseUnitEvaluationActiveYear(activeYear);
}
 
public void updateCourseUnitEvaluationActiveDegrees(List<String> activeDegrees)
{
Configuration config = load();
config.setCourseUnitEvaluationActiveDegrees(StringsUtils.getSerialStrings(activeDegrees,";"));
}
 
public void updateCourseUnitEvaluationActiveCourseIds(List<Long> activeCourseIds)
{
Configuration config = load();
config.setCourseUnitEvaluationActiveCourseIds(StringsUtils.getSerialLongs(activeCourseIds,";"));
}
 
public void updateCourseUnitEvaluationActiveYearCreateTransaction(String activeYear)
{
getCurrentSession().beginTransaction();
142,8 → 189,69
getCurrentSession().getTransaction().commit();
}
 
public void updateCourseUnitEvaluationActiveDegreesCreateTransaction(List<String> activeDegrees)
{
getCurrentSession().beginTransaction();
updateCourseUnitEvaluationActiveDegrees(activeDegrees);
getCurrentSession().getTransaction().commit();
}
 
public void updateCourseUnitEvaluationActiveCourseIdsCreateTransaction(List<Long> activeCourseIds)
{
getCurrentSession().beginTransaction();
updateCourseUnitEvaluationActiveCourseIds(activeCourseIds);
getCurrentSession().getTransaction().commit();
}
 
/**
* Return if the course id or the degree together with import year is active
* or if the unit is specially opened for edition
* @param courseUnitId
* @return
*/
public boolean isCourseUniEvaluationActivePeriodInTransaction(long courseUnitId)
{
getCurrentSession().beginTransaction();
String activeYear = getCourseUnitEvaluationActiveYear();
List<String> activeDegrees = getCourseUnitEvaluationActiveDegrees();
List<Long> activeCourseIds = getCourseUnitEvaluationActiveCourseIds();
CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().get(courseUnitId);
boolean isActiveYear = activeYear != null && cu.getImportYear().equals(activeYear);
boolean isActiveDegree = activeDegrees!=null && activeDegrees.contains(cu.getCourse().getDegree());
boolean isActiveCourseId = activeCourseIds!=null && activeCourseIds.contains(cu.getCourse().getId());
 
 
boolean activePeriod =
cu.isEvaluationOpenByAdmin() ||
(isActiveYear && (isActiveCourseId || isActiveDegree));
getCurrentSession().getTransaction().commit();
return activePeriod;
}
 
/**
* Return if the course or the degree ant import year is active
* @param courseUnitId
* @return
*/
public boolean isCourseUniEvaluationRegularActivePeriodInTransaction(long courseUnitId)
{
getCurrentSession().beginTransaction();
String activeYear = getCourseUnitEvaluationActiveYear();
List<String> activeDegrees = getCourseUnitEvaluationActiveDegrees();
List<Long> activeCourseIds = getCourseUnitEvaluationActiveCourseIds();
CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().get(courseUnitId);
boolean isActiveYear = activeYear != null && cu.getImportYear().equals(activeYear);
boolean isActiveDegree = activeDegrees!=null && activeDegrees.contains(cu.getCourse().getDegree());
boolean isActiveCourseId = activeCourseIds!=null && activeCourseIds.contains(cu.getCourse().getId());
 
 
boolean activePeriod = (isActiveYear && (isActiveCourseId || isActiveDegree));
getCurrentSession().getTransaction().commit();
return activePeriod;
}
 
 
 
public String getSigesWebServicesWsdl()
{
return load().getSigesWebServicesWsdl();
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseUnitDaoImpl.java
80,16 → 80,19
 
public List<CourseUnit> loadSubscribedImportYearUnits(long studentId, String importYear)
{
return createCriteria().add(eq("importYear", importYear))
return createCriteria()
.createAlias("students", "st")
.add(eq("st.id", studentId)).addOrder(Order.asc("name")).list();
.add(eq("st.id", studentId))
.add(eq("importYear", importYear))
.addOrder(Order.asc("name"))
.list();
}
public List<CourseUnit> loadSubscribedImportYearSemestreUnits(long studentId, String importYear, String semestre)
{
Criteria c =createCriteria()
.add(eq("importYear", importYear))
.createAlias("students", "st")
.add(eq("st.id", studentId));
.createAlias("students", "st")
.add(eq("st.id", studentId))
.add(eq("importYear", importYear));
if(semestre != null)
c.add(eq("semestre", semestre));
return c.addOrder(Order.asc("name")).list();
265,6 → 268,61
.list();
}
 
/**
* Metodo usado para carregar unidades de anos anteriores que possam estar em edição
* para mostrar na página da unidade
*
* Este metodo nao serve para mais nada, nao é usado nas Tarefas da Home
* @param sigesCode
* @param courseCode
* @return
*/
public CourseUnit loadUnitInEvaluationBySigesCodes(String sigesCode, String courseCode)
{
String activeImportYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
 
Criterion crtDegrees = getCourseUnitActiveDegreeCourseIdsCriterion(activeImportYear);
if(crtDegrees == null)
{
//Nao ha graus nem cursos portanto o ano não interessa
//o ano deve ser usado para abrir graus ou cursos senao nao
//abre nada
crtDegrees = eq("evaluationOpenByAdmin",true);
}
else
{
crtDegrees = and(eq("importYear", activeImportYear),crtDegrees);
crtDegrees = or(eq("evaluationOpenByAdmin",true),crtDegrees);
}
 
List<CourseUnit> cus = (List<CourseUnit>) createCriteria()
.createAlias("course","c")
.createAlias("courseUnitEvaluation","ce")
.add(eq("code", sigesCode))
.add(eq("courseCode", courseCode))
.add(crtDegrees)
.add(eq("ce.closed",false))
.list();
List<CourseUnit> cusNull = (List<CourseUnit>) createCriteria()
.createAlias("course","c")
.add(eq("code", sigesCode))
.add(eq("courseCode", courseCode))
.add(crtDegrees)
.add(isNull("courseUnitEvaluation"))
.list();
cus.addAll(cusNull);
if(cus != null && cus.size() > 1)
{
logger.warn("Mais do que uma unidade do mesmo codigo em avaliacao curricular, e suposto haver apenas uma, verificar logica aplicacional");
}
else if(cus != null && cus.size() > 0)
{
return cus.get(0);
}
 
return null;
}
 
public List<CourseUnit> loadCourseUnits(long courseId, String semestre, String year, boolean withTeacher, boolean withNoTeacher)
{
Criteria c = createCriteria();
491,9 → 549,6
 
public List<CourseMissingValidationEvaluation> loadMissingEvaluationValidate(UserSession userSession)
{
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
if(activeYear == null)
return new ArrayList<CourseMissingValidationEvaluation>();
List<CourseMissingValidationEvaluation> result = new ArrayList<CourseMissingValidationEvaluation>();
List<Course> courses = DaoFactory.getCourseDaoImpl().findAll();
for(Course course: courses)
518,49 → 573,97
 
public List<CourseUnit> loadMissingEvaluationValidateGivenCourse(long courseId)
{
if(DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()==null)
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
 
Criterion degreesCrit = getCourseUnitActiveDegreeCourseIdsCriterion(activeYear);
if(degreesCrit == null)
return new ArrayList<CourseUnit>();
 
return createCriteria()
.createAlias("course", "c")
.createAlias("courseUnitEvaluation", "ce")
.add(eq("c.id", courseId))
.add(eq("importYear", DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()))
//.add(ge("importYear", "201415"))//FirstYear where there was configurations
.add(eq("importYear", activeYear))
.add(degreesCrit)
.add((eq("ce.closed", false)))
.add((eq("ce.teacherComplete", true)))
.list();
}
 
/**
* Devolve um criteio OR para todos os cursos de grau pertencente à lista de graus
* ou pertencete à lista de cursoIds
 
* @return
*/
private Criterion getCourseUnitActiveDegreeCourseIdsCriterion(String activeYear)
{
List<String> activeDegrees = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveDegrees();
List<Long> activeCourseIds = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveCourseIds();
boolean activeDegreesOff = activeDegrees == null || activeDegrees.size() == 0;
boolean activeCourseIdsOff = activeCourseIds == null || activeCourseIds.size() == 0;
if(activeYear == null || (activeDegreesOff && activeCourseIdsOff))
return null;
 
Criterion crit = null;
 
if(activeDegrees != null)
for(String degree: activeDegrees)
{
if(crit == null)
crit = eq("c.degree",degree);
else
crit = or(crit,eq("c.degree",degree));
}
if(activeCourseIds != null)
for(Long courseId: activeCourseIds)
{
if(crit == null)
crit = eq("c.id",courseId);
else
crit = or(crit,eq("c.id",courseId));
}
 
return crit;
}
 
 
public List<CourseUnit> loadTeacherUnitsMissingEvaluation(UserSession userSession)
{
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
if(activeYear == null)
 
Criterion degreesCrit = getCourseUnitActiveDegreeCourseIdsCriterion(activeYear);
if(degreesCrit == null)
return new ArrayList<CourseUnit>();
 
 
List<CourseUnit> nulls =
createCriteria()
.createAlias("teachers","t")
.add(eq("importYear", DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()))
.createAlias("course", "c")
.createAlias("teachers", "t")
.add(eq("importYear", activeYear))
//.add(not(eq("importYear", DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear())))
//.add(ge("importYear", "201415" ))
//.add(isNull("courseUnitEvaluation"))
//todo novo testar
.add(eq("t.id", userSession.getUser().getId()))
.add(degreesCrit)
.add(isNull("courseUnitEvaluation"))
.list();
 
List<CourseUnit> teacherCompleteFalse =
createCriteria()
.createAlias("course", "c")
.createAlias("courseUnitEvaluation", "ce")
.createAlias("teachers","t")
.add(eq("t.id", userSession.getUser().getId()))
.add(eq("importYear", DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()))
.add(eq("importYear", activeYear))
//.add(not(eq("importYear", DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear())))
//.add(ge("importYear", "201415" ))
//.add(isNull("courseUnitEvaluation"))
//todo novo testar
.add(eq("ce.teacherComplete",false))
.add(degreesCrit)
.add(eq("ce.teacherComplete", false))
.list();
teacherCompleteFalse.addAll(nulls);
return teacherCompleteFalse;
569,9 → 672,6
 
public List<CourseMissingValidationEvaluation> loadMissingEvaluation(UserSession userSession)
{
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
if(activeYear == null)
return new ArrayList<CourseMissingValidationEvaluation>();
List<CourseMissingValidationEvaluation> result = new ArrayList<CourseMissingValidationEvaluation>();
List<Course> courses = DaoFactory.getCourseDaoImpl().findAll();
for(Course course: courses)
593,18 → 693,19
 
public List<CourseUnit> loadMissingEvaluation(long courseId)
{
if(DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()==null)
 
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
Criterion degreesCrit = getCourseUnitActiveDegreeCourseIdsCriterion(activeYear);
 
if(degreesCrit == null)
return new ArrayList<CourseUnit>();
 
List<CourseUnit> nulls =
createCriteria()
.createAlias("course", "c")
.add(eq("c.id", courseId))
.add(eq("importYear", DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()))
//.add(not(eq("importYear", DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear())))
//.add(ge("importYear", "201415" ))
//.add(isNull("courseUnitEvaluation"))
//todo novo testar
.add(eq("importYear", activeYear))
.add(degreesCrit)
.add(isNull("courseUnitEvaluation"))
.list();
 
613,11 → 714,8
.createAlias("course", "c")
.createAlias("courseUnitEvaluation", "ce")
.add(eq("c.id", courseId))
.add(eq("importYear", DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear()))
//.add(not(eq("importYear", DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear())))
//.add(ge("importYear", "201415" ))
//.add(isNull("courseUnitEvaluation"))
//todo novo testar
.add(degreesCrit)
.add(eq("importYear", activeYear))
.add(eq("ce.teacherComplete", false))
.list();
teacherCompleteFalse.addAll(nulls);
/impl/src/java/pt/estgp/estgweb/domain/dao/DaoFactory.java
345,4 → 345,7
 
 
 
 
 
 
}
/impl/src/java/pt/estgp/estgweb/domain/JobServiceTaskSchedulerImpl.java
16,4 → 16,41
public Serializable getSerializable() {
return getId();
}
 
public String getWeekDayMsgKey()
{
String dayOfTheWeek = "";
int i = getWeekday();
if(i == 2){
dayOfTheWeek = "Mon";
} else if (i==3){
dayOfTheWeek = "Tue";
} else if (i==4){
dayOfTheWeek = "Wed";
} else if (i==5){
dayOfTheWeek = "Thu";
} else if (i==6){
dayOfTheWeek = "Fri";
} else if (i==7){
dayOfTheWeek = "Sat";
} else if (i==1){
dayOfTheWeek = "Sun";
}
return dayOfTheWeek;
}
 
public String getTypeMsgKey()
{
if(isDaily())
return "dally";
else if(isMonthly())
return "monthly";
else if(isWeekly())
return "weekly";
else if(isNow())
return "now";
else
return "unknown";
}
 
}
/impl/src/java/pt/estgp/estgweb/web/LogsServiceStream.java
New file
0,0 → 1,120
package pt.estgp.estgweb.web;
 
import jomm.utils.StreamsUtils;
import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
 
/**
* @author Fabio
* @date 4/Abr/2008
* @time 11:03:00
* @see pt.estgp.estgweb.web
*/
public class LogsServiceStream extends HttpServlet
{
 
private static final Logger logger = Logger.getLogger(LogsServiceStream.class);
 
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
 
 
 
 
 
String logRequired = request.getPathInfo();
logRequired = logRequired.substring(1);
 
 
String logFile = pt.estgp.estgweb.Globals.JOB_SERVICES_LOG_DIR + java.io.File.separator + logRequired;
java.io.File f = new java.io.File(logFile);
if(!f.exists())
{
response.sendError(404);
return;
}
 
String line = request.getParameter("l");
if(line != null)
{
processJson(f,line,request,response);
return;
}
 
 
try
{
response.setContentType("text/plain");
OutputStream out = response.getOutputStream();
response.setContentLength((int) f.length());
StreamsUtils.inputStream2OutputStream(new FileInputStream(f),out);
out.flush();
out.close();
}
catch (Throwable e1)
{
logger.error(e1 );
response.sendError(404);
}
 
}
 
private void processJson(File f, String line, HttpServletRequest request, HttpServletResponse response) throws IOException {
int l = Integer.parseInt(line);
response.setContentType("application/json");
 
JSONObject obj = new JSONObject();
JSONArray lines = new JSONArray();
 
try {
obj.put("lines",lines);
obj.put("ok","ok");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF-8"));
String readedLine;
int i;
boolean endReached = false;
for(i = 0; i < l;i++)
{
if(reader.readLine() == null)
{
endReached = true;
break;
}
}
if(!endReached)
{
while((readedLine = reader.readLine())!=null)
{
lines.put(readedLine);
}
}
 
String toWrite = obj.toString();
response.setCharacterEncoding("ISO-8859-1");
response.setContentLength(toWrite.length());
response.getOutputStream().print(toWrite);
 
}
catch (FileNotFoundException e)
{
logger.error(e,e);
response.sendError(500);
} catch (JSONException e) {
logger.error(e,e);
response.sendError(500);
}
 
}
 
}
 
/impl/src/java/pt/estgp/estgweb/web/DirWebProxy.java
1,6 → 1,5
package pt.estgp.estgweb.web;
 
import jomm.utils.DesUtils;
import jomm.web.ftp.FileType;
import jomm.web.ftp.IFile;
import jomm.web.ftp.impl.FtpFile;
13,8 → 12,6
import org.dom4j.DocumentException;
import org.dom4j.Element;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.UserSessionImpl;
import pt.estgp.estgweb.services.ftpservices.FtpService;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Dom4jUtil;
import pt.estgp.estgweb.web.exceptions.NotAuthorizedException;
220,43 → 217,34
}
 
 
protected static boolean extendDiretoryDocument(HttpServletRequest request,HttpServletResponse response, String path, String serverStr, String server, String startPath, Document directoryDocument)
protected static boolean extendDiretoryDocument(HttpServletRequest request,HttpServletResponse response, String path, String server, String serverUrl, String startPath, Document directoryDocument)
throws ServletException, IOException
{
 
try
{
String user = ConfigProperties.getProperty(serverStr + ".user");
String pass = ConfigProperties.getProperty(serverStr + ".pass");
boolean useDefaultCredentialsRead = ConfigProperties.getBooleanProperty(serverStr + ".use.default.credentials.to.read");
if(!useDefaultCredentialsRead)
UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
FTPFileProxy.UserCredentialsForFtp u = FTPFileProxy.getUserCredentialsForFtp(server, userSession);
 
String username = u.username;
String password = u.password;
 
if(username == null || password == null) //NAO PODE LIGAR
{
UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
String passwordUserInSession = (String) ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD);
if(passwordUserInSession == null || userSession.getUser() == null)
{
logger.warn("There is no user authenticated, is configured to not use default credentials, but will use default password for server " + serverStr);
}
else
{
user = userSession.getUsername();
pass = DesUtils.getInstance().decrypt(passwordUserInSession);
logger.warn("Will use User Credentials for server " + serverStr + " and user " + user);
}
response.sendError(401);
return false;
}
 
if (path != null)
{
 
FtpServer ftpServer = FtpServer.getServer(server, user, pass);
FTPClient client = ftpServer.getClient();
FtpServer ftpServer = FtpServer.getServer(serverUrl, username, password);
FTPClient client = FTPFileProxy.getFtpClient(ftpServer, userSession, server, serverUrl);
if(client == null)
{
logger.warn("###################");
logger.warn("################### > CANT CONNECT FTP");
response.sendError(408);
return false;
}
 
Element actualNode = (Element) request.getAttribute("actualNode");
 
270,7 → 258,7
throw new NotAuthorizedException();
}
FTPFile[] files = client.listFiles();
List<IFile> iFiles = FtpFile.init(files, server, path);
List<IFile> iFiles = FtpFile.init(files, serverUrl, path);
//root
for (IFile iFile : iFiles)
{
312,7 → 300,7
throw new NotAuthorizedException();
}
FTPFile[] files = client.listFiles();
List<IFile> iFiles = FtpFile.init(files, server, path);
List<IFile> iFiles = FtpFile.init(files, serverUrl, path);
Element goDeepElement = null;
String actualId = null;
for (IFile iFile : iFiles)
360,7 → 348,7
}
 
files = client.listFiles();
iFiles = FtpFile.init(files, server, path);
iFiles = FtpFile.init(files, serverUrl, path);
 
for (IFile iFile : iFiles)
{
410,7 → 398,7
}
else
{
throw new FileNotFoundException("url not found for server:" + server + " and path:" + path);
throw new FileNotFoundException("url not found for server:" + serverUrl + " and path:" + path);
}
}
catch (Throwable e)
/impl/src/java/pt/estgp/estgweb/web/utils/DatesUtils.java
1,13 → 1,12
package pt.estgp.estgweb.web.utils;
 
import jomm.utils.MyCalendar;
import org.apache.log4j.Logger;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
 
import org.apache.log4j.Logger;
 
/**
* @author Jorge Machado
* @date 6/Mar/2008
19,6 → 18,7
 
private static final Logger logger = Logger.getLogger(DatesUtils.class);
 
private static SimpleDateFormat hourMinute = new SimpleDateFormat("HH:mm");
private static SimpleDateFormat minutesSecondsDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
private static SimpleDateFormat filenameDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
private static SimpleDateFormat userViewDateFormat = new SimpleDateFormat("yyyy/MM/dd");
64,4 → 64,9
return null;
}
}
 
public String getTimeHHMM(Date d)
{
return hourMinute.format(d);
}
}
/impl/src/java/pt/estgp/estgweb/web/FtpServer.java
79,11 → 79,21
logger.error(e,e);
}
 
if (username != null && password != null)
{
if(ftp.login(username,password))
{
return ftp;
}
}
return null;
 
/* estava assim
if (username != null)
ftp.user(username);
if (password != null)
ftp.pass(password);
return ftp;
ftp.pass(password);*/
//return ftp;
}
 
public String getHost()
/impl/src/java/pt/estgp/estgweb/web/form/configuration/SchedulleTasksForm.java
New file
0,0 → 1,55
package pt.estgp.estgweb.web.form.configuration;
 
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.JobServiceTaskImpl;
import pt.estgp.estgweb.domain.JobServiceTaskSchedulerImpl;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class SchedulleTasksForm extends ApplicationForm
{
 
private JobServiceTaskSchedulerImpl jobScheduller;
private JobServiceTaskImpl jobServiceTask;
private Long id;
 
 
 
 
public SchedulleTasksForm()
{
 
}
 
public JobServiceTaskSchedulerImpl getDirectory()
{
if(jobScheduller == null)
jobScheduller = DomainObjectFactory.createJobServiceTaskSchedulerImpl();
return jobScheduller;
}
 
public void setJobScheduller(JobServiceTaskSchedulerImpl jobScheduller) {
this.jobScheduller = jobScheduller;
}
 
public Long getId() {
return id;
}
 
public void setId(Long id) {
this.id = id;
}
 
public JobServiceTaskImpl getJobServiceTask()
{
return jobServiceTask;
}
 
public void setJobServiceTask(JobServiceTaskImpl jobServiceTask) {
this.jobServiceTask = jobServiceTask;
}
}
/impl/src/java/pt/estgp/estgweb/web/controllers/configuration/SchedulerTasksController.java
New file
0,0 → 1,472
package pt.estgp.estgweb.web.controllers.configuration;
 
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.JobServiceTaskImpl;
import pt.estgp.estgweb.domain.JobServiceTaskScheduler;
import pt.estgp.estgweb.domain.JobServiceTaskSchedulerImpl;
import pt.estgp.estgweb.services.directories.xsd.*;
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.form.configuration.DirectoriesForm;
import pt.estgp.estgweb.web.form.configuration.SchedulleTasksForm;
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.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
 
/**
* @author Jorge Machado
* @date 26/Fev/2008
* @time 18:01:54
* @see pt.estgp.estgweb.web
*/
public class SchedulerTasksController extends ApplicationDispatchController
{
 
private static final Logger logger = Logger.getLogger(SchedulerTasksController.class);
 
 
public ActionForward load(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
SchedulleTasksForm sf = (SchedulleTasksForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sf.getId()};
 
try
{
JobServiceTaskSchedulerImpl d = (JobServiceTaskSchedulerImpl) sm.execute(RequestUtils.getRequester(request, response), "LoadJobServiceTaskScheduler", args, names);
sf.setJobScheduller(d);
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
return mapping.findForward("task");
}
 
public ActionForward loadLog(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
SchedulleTasksForm sf = (SchedulleTasksForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sf.getId()};
 
try
{
JobServiceTaskImpl j = (JobServiceTaskImpl) sm.execute(RequestUtils.getRequester(request, response), "LoadJobServiceTask", args, names);
sf.setJobServiceTask(j);
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
if(request.getParameter("from")!=null)
return mapping.findForward("taskLogfrom" + request.getParameter("from"));
else
return mapping.findForward("taskLog");
}
 
public ActionForward runNow(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
 
 
SchedulleTasksForm sf = (SchedulleTasksForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sf.getId()};
 
try
{
sm.execute(RequestUtils.getRequester(request, response), "RunNowJobServiceTaskScheduller", args, names);
addMessage(request,"job.schedule.for.now");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
return mapping.findForward("tasks");
}
 
public ActionForward toggleActive(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
SchedulleTasksForm sf = (SchedulleTasksForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sf.getId()};
 
try
{
JobServiceTaskScheduler scheduler = (JobServiceTaskScheduler) sm.execute(RequestUtils.getRequester(request, response), "ToggleActiveJobServiceTaskScheduller", args, names);
if(scheduler.isActive())
addMessage(request,"job.schedule.active");
else
addMessage(request,"job.schedule.inactive");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
return mapping.findForward("tasks");
}
 
public ActionForward delete(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable
{
SchedulleTasksForm sf = (SchedulleTasksForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sf.getId()};
 
try
{
sm.execute(RequestUtils.getRequester(request, response), "DeleteJobServiceTaskScheduller", args, names);
addMessage(request,"job.schedule.deleted");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
return mapping.findForward("tasks");
}
 
 
 
 
 
 
 
 
 
 
public ActionForward addLeaf(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
String idParent = df.getId();
 
LeafT leaf = LeafTImpl.findLeaf(df.getDirectory(), idParent);
if(leaf == null)
{
addError(request,"directories.leaf.not.found",idParent);
return mapping.findForward("directories");
}
addMessage(request,"directories.add.leaf",idParent);
leaf.getLeaf().add(new LeafTImpl());
return mapping.findForward("directory");
}
 
 
public ActionForward refresh(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
 
 
addMessage(request, "directories.refresh");
 
return mapping.findForward("directory");
}
 
public ActionForward save(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable {
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
 
DirectoriesForm df = (DirectoriesForm) form;
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{df.getDirectory()};
 
try {
sm.execute(RequestUtils.getRequester(request, response), "SaveDirectoryService", args, names);
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
 
addMessage(request, "directories.saved");
 
return mapping.findForward("directories");
}
 
public ActionForward cancel(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
addMessage(request, "directories.canceled");
return mapping.findForward("directories");
}
 
 
public ActionForward removeLeaf(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
String idParent = df.getId();
 
LeafT leaf = LeafTImpl.removeLeaf(df.getDirectory(), idParent);
if(leaf == null)
{
addError(request,"directories.leaf.not.found",idParent);
return mapping.findForward("directories");
}
addMessage(request, "directories.removed.leaf", idParent);
leaf.getLeaf().add(new LeafTImpl());
return mapping.findForward("directory");
}
 
 
public ActionForward addRight(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
String idParent = df.getId();
 
LeafT leaf = LeafTImpl.findLeaf(df.getDirectory(), idParent);
if(leaf == null)
{
addError(request,"directories.leaf.not.found",idParent);
return mapping.findForward("directories");
}
 
leaf.getRights().getRight().add(new RightImpl());
addMessage(request, "directories.add.right", idParent);
return mapping.findForward("directory");
}
 
public ActionForward removeRight(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
String idParent = df.getId();
 
LeafT leaf = LeafTImpl.findLeaf(df.getDirectory(), idParent);
if(leaf == null)
{
addError(request,"directories.leaf.not.found",idParent);
return mapping.findForward("directories");
}
 
 
Iterator<RightsT.Right> iter = leaf.getRights().getRight().iterator();
while(iter.hasNext())
{
RightsT.Right r =iter.next();
if(r.getName().equals(df.getRname()) && r.getTarget().equals(df.getRtarget()) && df.getRtype().equals(r.getType()))
{
iter.remove();
}
}
addMessage(request, "directories.remove.right", df.getRname(),df.getRtarget(),df.getRtype());
return mapping.findForward("directory");
}
 
public ActionForward addDirRight(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
String idParent = df.getId();
 
df.getDirectory().getRights().getRight().add(new RightImpl());
addMessage(request, "directories.add.right");
return mapping.findForward("directory");
}
 
public ActionForward removeDirRight(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
 
Iterator<RightsT.Right> iter = df.getDirectory().getRights().getRight().iterator();
while(iter.hasNext())
{
RightsT.Right r =iter.next();
if(r.getName().equals(df.getRname()) && r.getTarget().equals(df.getRtarget()) && df.getRtype().equals(r.getType()))
{
iter.remove();
}
}
addMessage(request, "directories.remove.right", df.getRname(),df.getRtarget(),df.getRtype());
return mapping.findForward("directory");
}
 
public ActionForward addDirGroup(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
String idParent = df.getId();
 
df.getDirectory().getGroupsDeclaration().getGroup().add(new GroupImpl());
addMessage(request, "directories.add.group");
return mapping.findForward("directory");
}
 
public ActionForward removeDirGroup(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("services"))
{
return mapping.findForward("error401");
}
DirectoriesForm df = (DirectoriesForm) form;
 
Iterator<GroupDeclarationT.Group> iter = df.getDirectory().getGroupsDeclaration().getGroup().iterator();
while(iter.hasNext())
{
GroupDeclarationT.Group g =iter.next();
if(g.getName().equals(df.getRname()))
{
iter.remove();
}
}
addMessage(request, "directories.remove.group");
return mapping.findForward("directory");
}
 
 
 
}
Property changes:
Added: svn:executable
+ *
/impl/src/java/pt/estgp/estgweb/web/controllers/configuration/SchedullerTasksJson.java
New file
0,0 → 1,191
package pt.estgp.estgweb.web.controllers.configuration;
 
import com.owlike.genson.Genson;
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.JobServiceTask;
import pt.estgp.estgweb.domain.JobServiceTaskImpl;
import pt.estgp.estgweb.domain.JobServiceTaskScheduler;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.filterManager.exceptions.*;
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 pt.utl.ist.berserk.logic.serviceManager.exceptions.ServiceManagerException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
 
/**
* Created by jorgemachado on 23/11/15.
*/
public class SchedullerTasksJson extends HttpServlet
{
private static final Logger logger = Logger.getLogger(SchedullerTasksJson.class);
 
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try {
process(request,response);
} catch (Throwable e) {
response.sendError(500);
logger.error(e,e);
}
}
 
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try {
process(request,response);
} catch (Throwable e) {
response.sendError(500);
logger.error(e, e);
}
}
 
private void process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
String service = request.getParameter("service");
 
this.getClass().getMethod(service,HttpServletRequest.class,HttpServletResponse.class)
.invoke(this,request,response);
}
 
public void loadLog(HttpServletRequest request,HttpServletResponse response) throws IOException, IncompatibleFilterException, InvalidFilterException, ClassNotIFilterException, FilterRetrieveException, ServiceManagerException, InvalidFilterExpressionException {
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("ci"))
{
response.sendError(403);
return;
}
 
String id = request.getParameter("id");
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{Long.parseLong(id)};
 
try
{
JobServiceTaskImpl j = (JobServiceTaskImpl) sm.execute(RequestUtils.getRequester(request, response), "LoadJobServiceTask", args, names);
 
Genson genson = new Genson.Builder()
.exclude(Object.class)
.include("serviceStartDateFormated", JobServiceTask.class)
.include("serviceLastUpdateDateFormated", JobServiceTask.class)
.include("serviceFinishDateFormated", JobServiceTask.class)
.include("status", JobServiceTask.class)
.include("progress",JobServiceTask.class)
.create();
 
String json = genson.serialize(j);
response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1");
response.setContentLength(json.length());
response.getOutputStream().print(json);
 
}
catch (FilterChainFailedException e)
{
logger.error(e,e);
response.sendError(500);
}
catch (Throwable e)
{
logger.error(e,e);
response.sendError(500);
}
}
 
 
 
public void loadTasks(HttpServletRequest request,HttpServletResponse response) throws IOException, IncompatibleFilterException, InvalidFilterException, ClassNotIFilterException, FilterRetrieveException, ServiceManagerException, InvalidFilterExpressionException {
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("ci"))
{
response.sendError(403);
return;
}
 
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{};
 
try
{
List<JobServiceTaskScheduler> tasks = (List<JobServiceTaskScheduler>) sm.execute(RequestUtils.getRequester(request, response), "LoadJobServiceTaskSchedullers", args, names);
 
 
Genson genson = new Genson.Builder()
.exclude(Object.class)
.include("serviceStartDateFormated", JobServiceTask.class)
.include("serviceLastUpdateDateFormated", JobServiceTask.class)
.include("serviceFinishDateFormated", JobServiceTask.class)
.include("status", JobServiceTask.class)
.include("progress",JobServiceTask.class)
.include("progress",JobServiceTask.class)
.include("lastJobServiceTask",JobServiceTaskScheduler.class)
.create();
 
String json = genson.serialize(tasks);
 
response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1");
response.setContentLength(json.length());
response.getOutputStream().print(json);
 
}
catch (FilterChainFailedException e)
{
logger.error(e,e);
response.sendError(500);
}
catch (Throwable e)
{
logger.error(e,e);
response.sendError(500);
}
}
public static void main(String[] args2) throws IncompatibleFilterException, InvalidFilterException, ClassNotIFilterException, FilterRetrieveException, ServiceManagerException, InvalidFilterExpressionException {
String id = "44365";
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{Long.parseLong(id)};
 
try
{
AbstractDao.getCurrentSession().beginTransaction();
JobServiceTaskImpl j = (JobServiceTaskImpl) DaoFactory.getJobServiceTaskDaoImpl().get(new Long(44365));
 
AbstractDao.getCurrentSession().getTransaction().commit();
 
Genson genson = new Genson.Builder()
.exclude(Object.class)
.include("serviceStartDate", JobServiceTask.class)
.include("serviceLastUpdateDate", JobServiceTask.class)
.include("serviceFinishDate", JobServiceTask.class)
.include("status", JobServiceTask.class)
.include("progress",JobServiceTask.class)
.create();
 
String json = genson.serialize(j);
 
System.out.println("");
}
catch (Throwable e)
{
logger.error(e,e);
 
}
}
}
/impl/src/java/pt/estgp/estgweb/web/FTPFileProxy.java
33,35 → 33,132
*/
private static final Logger logger = Logger.getLogger(FTPFileProxy.class);
 
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
public static class UserCredentialsForFtp
{
String objectRequired = request.getPathInfo();
objectRequired = objectRequired.substring(1);
String server = objectRequired.substring(0,objectRequired.indexOf("/"));
String path = objectRequired.substring(objectRequired.indexOf("/"));
String username;
String password;
}
 
UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
String username = ConfigProperties.getProperty(server + ".user");
String passwordUserInSession = ConfigProperties.getProperty(server + ".pass");
/**
*
* @param server
* @param userSession
* @return CONFERE SITUACAO DE AUTENTICACAO E SERVIDOR e devolve user e pass em uso
*/
 
public static UserCredentialsForFtp getUserCredentialsForFtp(String server, UserSession userSession)
{
UserCredentialsForFtp u = new UserCredentialsForFtp();
boolean useDefaultCredentialsRead = ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read");
if(!useDefaultCredentialsRead)
String passwordUserInSessionCript = (String) ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD);
 
if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
passwordUserInSessionCript != null && userSession.getUser() != null) // E ESTA AUTENTICADO
{
String passwordUserInSessionCript = (String) ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD);
if(passwordUserInSession == null || userSession.getUser() == null)
//ESTA AINDA PODE FALHAR AGORA QUANDO TENTAR SE FOR UM USER SEM LIGACAO AO FTP
//AI TEM DE TENTAR AS DEFAULT SE ESTIVER AUTORIZADO
u.username = userSession.getUsername();
u.password = DesUtils.getInstance().decrypt(passwordUserInSessionCript);
logger.warn("Will use User Credentials for server " + server + " and user " + u.username);
}
else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
(passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // MAS PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
{
logger.warn("There is no user authenticated, is configured to use not default credentials, but will use default password for server " + server);
u.username = ConfigProperties.getProperty(server + ".user");
u.password = ConfigProperties.getProperty(server + ".pass");
}
else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
(passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
!ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // NO ENTANTO NAO PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
{
u.username = null;
u.password = null;
}
else if(useDefaultCredentialsRead) // DEVE USAR AS DEFAULT SEMPRE
{
u.username = ConfigProperties.getProperty(server + ".user");
u.password = ConfigProperties.getProperty(server + ".pass");
}
return u;
}
 
/**
* @param ftpServer
* @param userSession
* @param server
* @param serverUrl
* @return return ftpClient if OK or try to inspect policy of connecting with defaults if authentication fails
* @throws IOException
*/
public static FTPClient getFtpClient(FtpServer ftpServer, UserSession userSession, String server, String serverUrl)
throws IOException
{
FTPClient client = ftpServer.getClient();
if(client == null)
{
//FALHOU PODE A PASS DO USER NAO DAR POR NAO ESTAR NO FTP
//TEM DE VERIFICAR SE PODE USAR DEFAULTS QUANDO AUTENTICACAO FALHA
if(userSession.getUsername() != null &&
ConfigProperties
.getBooleanProperty(
server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
{
logger.warn("There is no user authenticated, is configured to use not default credentials, but will use default password for server " + server);
// ESTA AUTENTICADO E TENTOU USAR A DO USER FALHOU, OU JA ESTA NA DEFAULT E FALHOU A MESMA
//COMO PODE TENTAR USAR AS DEFAULTS NESTE CASO VAI TENTAR
logger.warn("###################");
logger.warn("################### > CANT CONNECT FTP");
//VELHO response.sendError(408);
//NOVO
logger.info("User cant connect to directory, probably user is not in ftp server, trying defaults");
ftpServer = FtpServer.getNewServer(
serverUrl
,ConfigProperties.getProperty(server + ".user")
,ConfigProperties.getProperty(server + ".pass"));
 
return ftpServer.getClient();
}
else if(userSession.getUsername() != null &&
!ConfigProperties
.getBooleanProperty(
server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
{
// USER AUTENTICADO FALHOU E SEM AUTORIZACAO PARA LIGAR COM AS DEFAULTS
logger.info("System is not authorized to use default password for " + server);
return null;
}
else
{
username = userSession.getUsername();
passwordUserInSession = DesUtils.getInstance().decrypt(passwordUserInSessionCript);
logger.warn("Will use User Credentials for server " + server + " and user " + username);
//NEM HA USER JA DEVIA TER FALHADO ANTES
logger.info("No user authenticated will return without response");
return null;
}
 
//velho return;
}
return client;
}
 
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String objectRequired = request.getPathInfo();
objectRequired = objectRequired.substring(1);
String server = objectRequired.substring(0,objectRequired.indexOf("/"));
String path = objectRequired.substring(objectRequired.indexOf("/"));
 
if(username == null || passwordUserInSession == null)
UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
 
 
//LOGICA DE LIGACAO NESTE METODO
UserCredentialsForFtp u = getUserCredentialsForFtp(server,userSession);
 
String username = u.username;
String password = u.password;
 
 
if(username == null || password == null) //NAO PODE LIGAR
{
response.sendError(401);
return;
69,26 → 166,24
 
if(path != null)
{
server = pt.estgp.estgweb.utils.ConfigProperties.getProperty("server." + server);
String serverUrl = pt.estgp.estgweb.utils.ConfigProperties.getProperty("server." + server);
String remoteName = path.substring(path.lastIndexOf("/")+1);
String remoteDirectory = path.substring(0,path.lastIndexOf("/"));
FtpServer ftpServer = FtpServer.getNewServer(server,username,passwordUserInSession);
FtpServer ftpServer = FtpServer.getNewServer(serverUrl,username,password);
FTPClient client = null;
try
{
client = ftpServer.getClient();
client = getFtpClient(ftpServer,userSession,server,serverUrl);
if(client == null)
{
logger.warn("###################");
logger.warn("################### > CANT CONNECT FTP");
response.sendError(408);
return;
}
 
 
client.changeWorkingDirectory(remoteDirectory);
 
 
 
FTPFile[] files = client.listFiles();
boolean found = false;
for (FTPFile file : files) {
124,6 → 219,7
client.disconnect();
}
response.sendError(404);
logger.error(e,e);
return;
}
finally {
/impl/src/doc/TarefasManutencaoBaco.docx
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/doc/EMAIL_SEND_CONF.doc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
/impl/src/doc/FTPSoftwareLigacoesBaco.txt
New file
0,0 → 1,38
Documentação FTP do BACO
 
Existem vários pontos onde o BACO interage com o FTP
 
- FTPService - Permite executar operações de Criação de Dirs, Deletes e Imports
(Tem verificação de password default ou pessoal, usa a pessoal se existir e estiver isso indicado
no servidor conf senao usa a default)
- Se for de acesso estatico ou seja .use.default.credentials.to.updates.and.deletes=true
usa a pass default, neste momento nao esta assim esta a false
- Se o user tiver guardado a password em sessão na gestão das pastas é essa que é usada
e colocada encriptada na password de sessao
- Se nao é usada a de autenticação guardada em sessão encriptada
- Se tudo falhar tenta
 
- LayoutController - Carrega os NavPlaces para Memoria e processa o FTP com um Layout
especifico que depois ira usar o DirWebProxy --> Ionline
substituido mais tarde pelo DirWebProxy
Se for de acesso estatico usa a default senao usa a de sessao do user que esta encriptada
 
 
- DirWebProxy - Liga-se ao FTP nos serviços de directorio para extender os Leafs dos dirs
server.use.default.credentials.to.read=false >>> usa a pessoal
(Tem verificação de password default ou pessoal, usa a pessoal se existir e estiver isso indicado
no servidor conf .use.default.credentials.to.read=false senao usa a default)
 
- FTPFileProxy - Permite sacar um ficheiro por proxy com um LINK do BACO
server.use.default.credentials.to.read=false >>> usa a pessoal
(Tem verificação de password default ou pessoal, usa a pessoal se existir e estiver isso indicado
no servidor conf .use.default.credentials.to.read=false senao usa a default)
 
- AuthenticationService - Coloca a password em Sessao encriptada para usar mais tarde
no caso de o servidor em foco nao ter as credenciais default para uso ou de leitura ou de escrita
 
 
- web/user/ftpclient/ftlClient.jsp - Usado para apresentar o IONLINE na intranet e nas páginas das cadeiras
não tem influencia directa pois é reencaminhado a partir do Layout Controller com o layout do FTP
 
 
/impl/src/updates/version/release2015-11.txt
75,4 → 75,11
- todo lembrar de tirar o teacherComplete dos saves e meter os savez no JSP
 
 
-todo meter os Roles de Validação de Cursos Configuraveis
-todo meter os Roles de Validação de Cursos Configuraveis
 
Trabalho a fazer Mais Tarde
 
- Framework de Autorizações para processos
Nomeadamente incluir Workflow de Tarefas e Responsáveis
Incluir serviços de Verficicação de tarefas por realizar que deverá servir para
validar as tentativas de modificação e de visualização de coisas a fazer
/impl/src/hbm/pt/estgp/estgweb/domain/CourseUnit.hbm.xml
29,6 → 29,9
<property name="status" type="boolean" index="statusIndex" />
<property name="contentsGrants" type="string"/>
<property name="evaluationStreamId" type="string" index="evaluationStreamIdIndex" />
<property name="evaluationOpenByAdmin" type="boolean" index="evaluationOpenByAdminIndex">
<column name="evaluationOpenByAdmin" default="false"/>
</property>
<property name="summariesJson" type="text">
<column name="summariesJson" sql-type="TEXT"/>
</property>
/impl/src/hbm/pt/estgp/estgweb/domain/Course.hbm.xml
20,7 → 20,7
<property name="institutionalCode" type="string"/>
<property name="externalSiteServer" type="string"/>
<property name="externalSitePath" type="string"/>
<property name="degree" type="string"/>
<property name="degree" type="string" index="degreeIndex"/>
<property name="status" type="boolean"/>
<property name="cacheWebDocument" type="text">
<column name="cacheWebDocument" sql-type="TEXT"/>
/impl/src/hbm/pt/estgp/estgweb/domain/Configuration.hbm.xml
29,6 → 29,8
 
<!--CourseUnitEvaluation formatImportYear-->
<property name="courseUnitEvaluationActiveYear" type="string"/>
<property name="courseUnitEvaluationActiveDegrees" type="string"/>
<property name="courseUnitEvaluationActiveCourseIds" type="string"/>
 
<many-to-one name="configurationGrades" class="pt.estgp.estgweb.domain.ConfigurationGrades" lazy="proxy" outer-join="false"/>
<subclass name="pt.estgp.estgweb.domain.ConfigurationImpl" discriminator-value="ConfigurationImpl"/>
/impl/src/hbm/pt/estgp/estgweb/domain/Job.hbm.xml
40,7 → 40,7
<!--Control Target Service Parameters-->
<property name="targetService" type="string"/>
<many-to-one name="createdBy" class="pt.estgp.estgweb.domain.User" lazy="false" outer-join="true"/>
<set name="serviceTaskParameters"><!--lazy="true">-->
<set name="serviceTaskParameters" lazy="false"><!--lazy="true">-->
<key column="job_id"/>
<one-to-many class="pt.estgp.estgweb.domain.JobServiceTaskParameter"/>
</set>
62,6 → 62,9
<property name="description" type="string"/>
 
<!--ScheduleInformation-->
<property name="active" type="boolean">
<column name="active" default="true"/>
</property>
<property name="now" type="boolean"/>
<property name="daily" type="boolean"/>
<property name="weekly" type="boolean"/>
72,8 → 75,9
<property name="minute" type="int"/>
<property name="second" type="int"/>
<property name="targetService" type="string"/>
<many-to-one name="lastJobServiceTask" class="pt.estgp.estgweb.domain.JobServiceTask" lazy="false" outer-join="true"/>
<many-to-one name="createdBy" class="pt.estgp.estgweb.domain.User" lazy="false" outer-join="true"/>
<set name="serviceTaskSchedulerParameters" ><!--lazy="true">-->
<set name="serviceTaskSchedulerParameters" lazy="false"><!--lazy="true">-->
<key column="scheduler_id"/>
<one-to-many class="pt.estgp.estgweb.domain.JobServiceTaskSchedulerParameter"/>
</set>
93,9 → 97,7
<property name="saveDate" type="timestamp"/>
<property name="name" type="string"/>
<property name="description" type="string"/>
<property name="object" type="java.io.Serializable">
<column name="object" sql-type="LONGBLOB"/>
</property>
<property name="object" type="string"/>
<subclass name="pt.estgp.estgweb.domain.JobServiceTaskParameter">
<meta attribute="extends">pt.estgp.estgweb.domain.JobParameter</meta>
<meta attribute="scope-class">public abstract</meta>
/impl/src/web/admin/configuration/directory.jsp
13,25 → 13,21
<jomm:messages/>
<html:errors/>
 
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/variables.less"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/lavish-bootstrap.css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap.css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap-theme.css"/>
 
 
<script src="<%=request.getContextPath()%>/js/jquerytables/jquery-2.1.4.min.js"></script>
<script src="<%=request.getContextPath()%>/js/jquerytables/bootstrap/js/bootstrap.min.js"></script>
 
 
 
<script type="text/javascript" language="JavaScript">
$(document).ready(function()
{
$(".multilang").hide();
$(".advanced").hide();
$(".accessRights").hide();
 
if(document.location.href.indexOf("#")>0)
{
$(".advanced").show();
//$(".accessRights").show();
}
 
});
function setId(form,value)
205,10 → 201,14
 
<div class="panel panel-default">
<div class="panel-heading">
Configurações de Menus <button type="button" class="btn btn-success" onclick="set(form,'refresh');form.submit();">Refrescar com as Alterações</button> <button type="button" style="float:right" class="btn btn-default" onclick="$('.multilang').toggle();return false;">Abrir Multilinguagem</button> <button style="float:right" type="button" class="btn btn-default" onclick="$('.advanced').toggle();return false;">Abrir Configurações Avançadas</button>
Configurações de Menus
<button type="button" class="btn btn-success" onclick="set(form,'refresh');form.submit();">Refrescar com as Alterações</button>
<button type="button" style="float:right" class="btn btn-default" onclick="$('.multilang').toggle();return false;">Multilinguagem</button>
<button type="button" style="float:right" class="btn btn-default" onclick="$('.advanced').toggle();return false;">Avançadas</button>
<button type="button" style="float:right" class="btn btn-default" onclick="$('.accessRights').toggle();return false;">Direitos de Acesso</button>
</div>
<div class="panel-body">
<table class="dataTable tablesorter" style="width: 100%">
<table class="tablesorter dataTable" style="width: 100%">
<thead>
<tr>
<th style="width: 150px">ID</th>
/impl/src/web/admin/configuration/taskLog.jsp
New file
0,0 → 1,189
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.JobServiceTaskScheduler" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.domain.JobServiceTaskImpl" %>
<%@ page import="jomm.utils.MessageResources" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib prefix="hmlt" uri="http://jakarta.apache.org/struts/tags-html" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<jsp:useBean id="SchedulleTasksForm" type="pt.estgp.estgweb.web.form.configuration.SchedulleTasksForm" scope="request"/>
<jomm:messages/>
<html:errors/>
 
<!--<jsp:include page="/layout/scriptsBootstrapSoft.jsp"/>-->
 
 
<script>
 
function updateStatus()
{
$.getJSON( "<%=request.getContextPath()%>/admin/schedullerTasksJson?service=loadLog&id=${SchedulleTasksForm.jobServiceTask.id}", function( data ) {
 
$("#serviceStartDateFormated").html(data.serviceStartDateFormated);
$("#serviceLastUpdateDateFormated").html(data.serviceLastUpdateDateFormated);
$("#serviceFinishDateFormated").html(data.serviceFinishDateFormated);
<%
for(JobServiceTaskImpl.JobStatus jS : JobServiceTaskImpl.JobStatus.values())
{
%>
if(data.status == "<%=jS.name()%>")
{
$("#status").html("<%=MessageResources.getInstance(request).getMessage("job.status."+jS.name())%>");
}
<%
}
%>
$("#status").attr("class", "jobStatus"+data.status);(data.status);
$("#progress").html(data.progress + "%");
$(".progress-bar").css("width",data.progress + "%");
$(".progress-bar").attr("aria-valuenow",data.progress);
$(".progress-bar").html(data.progress + "%");
 
if(data.status == "STARTED" || data.status == "PENDING")
setTimeout("updateStatus()",2000);
});
 
}
$(document).ready(function(){
updateStatus();
 
});
</script>
 
<%
 
%>
 
 
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="configuration.taskLog"/>
</div>
<div class="panel-body">
<table class="tablesorter tablesortersimple">
<thead>
<tr>
<th><bean:message key="configuration.task"/></th>
<th>Iniciado</th>
<th>Última Atualização</th>
<th>Terminado</th>
<th>Criado por</th>
<th>Parametros</th>
<th>Status</th>
<th>Progresso</th>
</tr>
</thead>
<tbody>
<tr>
<td><bean:message key="targetService.${SchedulleTasksForm.jobServiceTask.targetService}"/></td>
<td id="serviceStartDateFormated">${SchedulleTasksForm.jobServiceTask.serviceStartDateFormated}</td>
<td id="serviceLastUpdateDateFormated">${SchedulleTasksForm.jobServiceTask.serviceLastUpdateDateFormated}</td>
<td id="serviceFinishDateFormated">${SchedulleTasksForm.jobServiceTask.serviceFinishDateFormated}</td>
<td>${SchedulleTasksForm.jobServiceTask.createdBy.username}</td>
<td>
<table cellspacing="0" cellspadding="0">
<logic:iterate id="taskParam" name="SchedulleTasksForm" property="jobServiceTask.serviceTaskParameters" type="pt.estgp.estgweb.domain.JobServiceTaskParameter">
<tr>
<td>
${taskParam.name}
</td>
<td>
${taskParam.object}
</td>
</tr>
</logic:iterate>
</table>
</td>
<logic:notEmpty name="SchedulleTasksForm" property="jobServiceTask">
<td id="status" class="jobStatus${SchedulleTasksForm.jobServiceTask.status}">
<bean:message key="job.status.${SchedulleTasksForm.jobServiceTask.status}"/>
</td>
<td id="progress" style="text-align: right">
${SchedulleTasksForm.jobServiceTask.progress} %
</td>
</logic:notEmpty>
<logic:empty name="SchedulleTasksForm" property="jobServiceTask">
<td></td>
<td></td>
</logic:empty>
</tr>
</tbody>
 
</table>
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="0"
aria-valuemin="0" aria-valuemax="100" style="width:0%">
70%
</div>
</div>
<div id="screens"></div>
<a href="<%=request.getContextPath()%>/logServiceStream/${SchedulleTasksForm.jobServiceTask.logFilePath}">Download Log Completo</a>
</div>
</div>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/logtailer/logtail.js"></script>
 
<style>
 
.header {
background-color: #ccc;
padding: 0.5em;
font-family: sans-serif;
}
 
.header .buttons {
float: right;
}
 
.header h2 {
margin: 0;
}
 
.screen {
height: 200px;
background-color: black;
padding: 4px;
overflow: auto;
margin-bottom: 20px;
}
 
.screen div {
padding: 0;
margin: 0;
border: 0;
background-color: black;
color: #bbb;
line-height: 1.2;
white-space: pre-wrap;
font-family: monospace;
}
</style>
<script>
$(document).ready(function(){
//
// this is a list of logs we want to tail on this page. make sure these
// point to your own server instead of mine ;)
//
var logs = {
'Messages' : '<%=request.getContextPath()%>/logServiceStream/${SchedulleTasksForm.jobServiceTask.logFilePath}'
};
//
// for each one we create a log_handler() object, passed it a title,
// log URL and a parent element to put the log tailer into.
//
for (var i in logs){
new log_handler(i, logs[i], $('#screens'));
}
});
</script>
 
 
 
</div>
Property changes:
Added: svn:executable
+ *
/impl/src/web/admin/configuration/grades.jsp
15,13 → 15,7
<jomm:messages/>
<html:errors/>
 
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/variables.less"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/lavish-bootstrap.css"/>
 
 
<script src="<%=request.getContextPath()%>/js/jquerytables/jquery-2.1.4.min.js"></script>
<script src="<%=request.getContextPath()%>/js/jquerytables/bootstrap/js/bootstrap.min.js"></script>
 
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
 
32,8 → 26,9
 
// $('#myTable').tablesorter();
// $('#myTable2').tablesorter();
$("#myCollapse1").hide();
$("#myCollapse2").hide();
 
 
<%
if(request.getAttribute("ConfigurationGradesForm")!=null)
{
44,8 → 39,8
{
 
%>
$("#myCollapse1").show();
 
$("#myCollapse1").collapse('show');
<%
}
else if(confForm.getOp() != null && (
53,7 → 48,7
confForm.getOp().equals("deleteEpocaAvaliacao")))
{
%>
$("#myCollapse2").collapse('show');
$("#myCollapse2").show();
<%
}
}
87,11 → 82,11
 
<button style="float: right" class="btn btn-success" onclick="this.form.op.value='addSatusEpoca';set(this.form,'addSatusEpoca');this.form.submit()">Adicionar Novo</button>
 
<button class="btn btn-info" data-toggle="collapse" data-target="#myCollapse1" onclick="return false;">Status de Época</button>
<button type="button" class="btn btn-info" onclick="$('#myCollapse1').toggle();">Status de Época</button>
 
 
</div>
<div id="myCollapse1" class="collapse">
<div id="myCollapse1">
<div class="panel-body">
<table id="myTable" class="dataTable tablesorter">
<thead>
117,7 → 112,7
<nested:text property="obs" style="width:100%"></nested:text>
</td>
<td>
<a href="<%=request.getContextPath()%>/user/grades.do?op=deleteStatusEpoca&dispatch=deleteStatusEpoca&id=${status.id}"><html:img page="/imgs/delete.gif"/></a>
<a class="btn btn-danger btn-sm" href="<%=request.getContextPath()%>/user/grades.do?op=deleteStatusEpoca&dispatch=deleteStatusEpoca&id=${status.id}"><span class="glyphicon glyphicon-remove"></span></a>
</td>
</tr>
</nested:iterate>
137,9 → 132,9
<div class="panel panel-default">
<div class="panel-heading">
<button style="float:right" class="btn btn-success" onclick="this.form.op.value='addEpocaAvaliacao';set(this.form,'addEpocaAvaliacao');this.form.action+'#epocas';set(this.form,'addEpocaAvaliacao');this.form.submit()">Adicionar Novo</button>
<button class="btn btn-info" data-toggle="collapse" data-target="#myCollapse2" onclick="return false;">Épocas de Avaliação</button>
<button type="button" class="btn btn-info" onclick="$('#myCollapse2').toggle();">Épocas de Avaliação</button>
</div>
<div id="myCollapse2" class="collapse">
<div id="myCollapse2" >
<div class="panel-body">
<table id="myTable2" class="dataTable tablesorter">
<thead>
169,7 → 164,7
<nested:text property="obs" style="width:100%"></nested:text>
</td>
<td>
<a href="<%=request.getContextPath()%>/user/grades.do?op=deleteEpocaAvaliacao&dispatch=deleteEpocaAvaliacao&id=${status.id}#epocas"><html:img page="/imgs/delete.gif"/></a>
<a class="btn btn-danger btn-sm" href="<%=request.getContextPath()%>/user/grades.do?op=deleteEpocaAvaliacao&dispatch=deleteEpocaAvaliacao&id=${status.id}#epocas"><span class="glyphicon glyphicon-remove"></span></a>
</td>
</tr>
</nested:iterate>
/impl/src/web/admin/configuration/tasks.jsp
New file
0,0 → 1,208
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="jomm.utils.MessageResources" %>
<%@ page import="pt.estgp.estgweb.domain.JobServiceTaskImpl" %>
<%@ page import="pt.estgp.estgweb.domain.JobServiceTaskScheduler" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib prefix="hmlt" uri="http://jakarta.apache.org/struts/tags-html" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<jomm:messages/>
<html:errors/>
 
 
<%
AbstractDao.getCurrentSession().beginTransaction();
List<JobServiceTaskScheduler> schedulledTasks = DaoFactory.getJobServiceTaskSchedulerDaoImpl().findAll();
request.setAttribute("tasks",schedulledTasks);
%>
 
<script>
 
function updateStatus()
{
 
$.getJSON( "<%=request.getContextPath()%>/admin/schedullerTasksJson?service=loadTasks", function( data ) {
 
var task;
for(var i =0;i<data.length;i++)
{
var id = data[i].id;
var progress = data[i].lastJobServiceTask.progress + "%";
var status = data[i].lastJobServiceTask.status;
 
 
if(data[i].now == false && ((progress != null && progress != 0) || status != "PENDING"))
{
$("#log" + id).attr("href","<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=loadLog&id=" + data[i].lastJobServiceTask.id);
$("#log" + id).show();
$("#progress"+id).html(progress);
<%
for(JobServiceTaskImpl.JobStatus jS : JobServiceTaskImpl.JobStatus.values())
{
%>
if(status == "<%=jS.name()%>")
{
$("#ultima"+id).html("<%=MessageResources.getInstance(request).getMessage("job.status."+jS.name())%>");
}
<%
}
%>
}
else if(data[i].now == true)
{
$("#log" + id).hide();
if($("#ultimaIcon"+id).attr("class").indexOf("glyphicon-warning-sign") > -1)
{
$("#ultimaIcon"+id).removeClass("glyphicon-warning-sign");
$("#ultimaIcon"+id).addClass("glyphicon-random");
}
else
{
$("#ultimaIcon"+id).addClass("glyphicon-warning-sign");
$("#ultimaIcon"+id).removeClass("glyphicon-random");
}
}
}
setTimeout("updateStatus()",2000);
});
 
}
$(document).ready(function(){
updateStatus();
 
});
</script>
 
 
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="configuration.tasks"/>
 
 
<a href="<%=request.getContextPath()%>/user/configurationJobTasks.do" style="float:right" class="btn btn-default"><span class="glyphicon glyphicon-list-alt">Consultar Todos os Logs</span></a>
<button type="button" style="float:right" class="btn btn-success" onclick="set(form,'new');form.submit();"><span class="glyphicon glyphicon-plus">Agendar</span></button>
<a href="<%=request.getContextPath()%>/user/configurationSchedulleTasks.do" class="btn btn-info"><span class="glyphicon glyphicon-refresh"></span></a>
</div>
<div class="panel-body">
<table id="myTable" class="tablesorter">
<thead>
<tr>
<th>Agora</th>
<th><bean:message key="configuration.task"/></th>
<th>Tipo</th>
<th>Calendarização</th>
 
<th>Criador</th>
<th>Parametros</th>
<th>Última</th>
<th>Progresso</th>
<th></th>
</tr>
</thead>
<tbody>
<logic:iterate id="task" name="tasks" type="pt.estgp.estgweb.domain.JobServiceTaskSchedulerImpl">
<tr>
<td>
<logic:equal value="false" name="task" property="now">
<a href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=runNow&id=${task.id}" class="btn btn-default">
<span class="glyphicon glyphicon-play"></span>
</a>
</logic:equal>
</td>
<td><bean:message key="targetService.${task.targetService}"/></td>
<td><bean:message key="configuration.task.${task.typeMsgKey}"/></td>
<td>
<logic:equal value="true" name="task" property="weekly">
<bean:message key="weekday.day"/> <bean:message key="weekday.${task.weekDayMsgKey}"/>
</logic:equal>
<logic:equal value="true" name="task" property="monthly">
<bean:message key="monthday.day"/> ${task.monthday}
</logic:equal>
<bean:message key="day.time"/>
${task.hour}:${task.minute}
</td>
 
<td>${task.createdBy.username}</td>
<td>
<table cellspacing="0" cellspadding="0">
<logic:iterate id="taskParam" name="task" property="serviceTaskSchedulerParameters" type="pt.estgp.estgweb.domain.JobServiceTaskSchedulerParameter">
<tr>
<td>
${taskParam.name}
</td>
<td>
${taskParam.object}
</td>
</tr>
</logic:iterate>
</table>
</td>
<td id="ultima${task.id}" <logic:equal value="false" name="task" property="now">class="jobStatus${task.lastJobServiceTask.status}"</logic:equal>>
<logic:equal value="true" name="task" property="now">
<span id="ultimaIcon${task.id}" class="glyphicon glyphicon glyphicon-random"></span>
</logic:equal>
<logic:equal value="false" name="task" property="now">
<logic:notEmpty name="task" property="lastJobServiceTask">
<bean:message key="job.status.${task.lastJobServiceTask.status}"/>
</logic:notEmpty>
</logic:equal>
</td>
<td id="progress${task.id}" style="text-align: right">
<logic:equal value="true" name="task" property="now">
<span class="glyphicon glyphicon glyphicon-random"></span>
</logic:equal>
<logic:equal value="false" name="task" property="now">
<logic:notEmpty name="task" property="lastJobServiceTask">
${task.lastJobServiceTask.progress} %
</logic:notEmpty>
</logic:equal>
</td>
 
<td>
<logic:notEmpty name="task" property="lastJobServiceTask">
<a id="log${task.id}" href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=loadLog&id=${task.lastJobServiceTask.id}" class="btn btn-default">
<span class="glyphicon glyphicon-list-alt"></span>
</a>
</logic:notEmpty>
 
<logic:equal value="true" name="task" property="active">
<a alt="Desactivar" class="btn btn-success" href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=toggleActive&id=${task.id}" >
<span class="glyphicon glyphicon-ok"></span>
</a>
</logic:equal>
<logic:equal value="false" name="task" property="active">
<a alt="Activar" class="btn btn-warning" href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=toggleActive&id=${task.id}" >
<span class="glyphicon glyphicon-ban-circle"></span>
</a>
</logic:equal>
 
<a alt="Apagar" class="btn btn-danger" onclick="return confirm('Tem a certeza que deseja apagar esta tarefa? <bean:message key="targetService.${task.targetService}"/>')" href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=delete&id=${task.id}">
<span class="glyphicon glyphicon-remove"></span>
</a>
 
<a alt="Editar" class="btn btn-warning" href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=load&id=${task.id}">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</td>
 
</tr>
</logic:iterate>
</tbody>
 
</table>
</div>
</div>
</div>
 
 
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
Property changes:
Added: svn:executable
+ *
/impl/src/web/admin/configuration/leafNode.jsp
93,20 → 93,15
</nested:select>
</td>
<td class="advanced" style="white-space: nowrap">
<button type="button" class="btn btn-danger btn-sm" onclick="if(confirm('<nested:message key="directories.remove.ask" arg0="${leaf.id}"/>')){set(form,'removeLeaf');setId(form,'<nested:write property="id"/>');form.submit()}else{return false;}"><span class="glyphicon glyphicon-remove"></span></button>
<button type="button" class="btn btn-danger btn-sm" onclick="if(confirm('<nested:message key="directories.remove.ask" arg0="${leaf.id}"/>')){set(form,'removeLeaf');setId(form,'<nested:write property="id"/>');form.submit()}else{return false;}"><span class="glyphicon glyphicon-remove"></span></button> <button type="button" onclick="set(form,'addLeaf');setId(form,'<nested:write property="id"/>');form.action = form.action + '#<nested:write property="id"/>';form.submit()" class="btn btn-default btn-sm"><span class="glyphicon glyphicon-plus"></span></button>
</td>
<!--<td>remoteExtensionRoot</td>
<td>ftpDirectory</td>
<td>size</td>
<td>mimeType</td>-->
</tr>
<tr class="advanced">
<td style="padding-left: <%=rightsPad%>px" colspan="11">
<button type="button" onclick="set(form,'addLeaf');setId(form,'<nested:write property="id"/>');form.action = form.action + '#<nested:write property="id"/>';form.submit()" class="btn btn-default btn-sm"><span class="glyphicon glyphicon-plus"></span></button>
</td>
</tr>
<nested:notEmpty property="rights">
<tr class="advanced">
<tr class="accessRights">
 
<td style="padding-left: <%=rightsPad%>px">Direitos Acesso (<nested:write property="id"/>)</td>
<td colspan="10">
/impl/src/web/admin/configuration/jobTasks.jsp
New file
0,0 → 1,91
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.JobServiceTask" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.domain.dao.impl.JobServiceTaskDaoImpl" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib prefix="hmlt" uri="http://jakarta.apache.org/struts/tags-html" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<jomm:messages/>
<html:errors/>
 
 
<%--<jsp:include page="/layout/scriptsBootstrapSoft.jsp"/>--%>
 
<%
AbstractDao.getCurrentSession().beginTransaction();
List<JobServiceTaskDaoImpl> jobTasks = DaoFactory.getJobServiceTaskDaoImpl().findLastNJobTasks(100);
request.setAttribute("tasks",jobTasks);
%>
 
 
 
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="configuration.jobtasks"/>
</div>
<div class="panel-body">
<table id="myTable" class="tablesorter">
<thead>
<tr>
<th class="filter-true"><bean:message key="configuration.jobtasks"/></th>
<th class="filter-true">Data Inicio</th>
<th class="filter-true">Criador</th>
<th class="filter-true">Parametros</th>
<th class="filter-true">Estado</th>
<th class="filter-true">Progresso</th>
<th></th>
</tr>
</thead>
<tbody>
<logic:iterate id="task" name="tasks" type="pt.estgp.estgweb.domain.JobServiceTaskImpl">
<tr>
<td><bean:message key="targetService.${task.targetService}"/></td>
<td>${task.serviceStartDateFormated}</td>
<td>${task.createdBy.username}</td>
<td>
<table cellspacing="0" cellspadding="0">
<logic:iterate id="taskParam" name="task" property="serviceTaskParameters" type="pt.estgp.estgweb.domain.JobServiceTaskParameter">
<tr>
<td>
${taskParam.name}
</td>
<td>
${taskParam.object}
</td>
</tr>
</logic:iterate>
</table>
</td>
<td class="jobStatus${task.status}">
<bean:message key="job.status.${task.status}"/>
</td>
<td style="text-align: right">
${task.progress} %
</td>
<td>
<a href="<%=request.getContextPath()%>/user/configurationTasks.do?dispatch=loadLog&from=jobtasks&id=${task.id}" class="btn btn-default">
<span class="glyphicon glyphicon-list-alt"></span>
</a>
</td>
 
</tr>
</logic:iterate>
</tbody>
 
</table>
</div>
</div>
</div>
 
 
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
Property changes:
Added: svn:executable
+ *
/impl/src/web/admin/configuration/task.jsp
New file
0,0 → 1,121
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.JobServiceTaskScheduler" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib prefix="hmlt" uri="http://jakarta.apache.org/struts/tags-html" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<jomm:messages/>
<html:errors/>
 
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/variables.less"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/lavish-bootstrap.css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap.css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap-theme.css"/>
 
 
 
<script src="<%=request.getContextPath()%>/js/jquerytables/jquery-2.1.4.min.js"></script>
<script src="<%=request.getContextPath()%>/js/jquerytables/bootstrap/js/bootstrap.min.js"></script>
 
 
 
<%
AbstractDao.getCurrentSession().beginTransaction();
List<JobServiceTaskScheduler> schedulledTasks = DaoFactory.getJobServiceTaskSchedulerDaoImpl().findAll();
request.setAttribute("tasks",schedulledTasks);
%>
 
 
 
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="configuration.tasks"/>
<button type="button" style="float:right" class="btn btn-default" onclick="set(form,'new');form.submit();"><span class="glyphicon glyphicon-list-alt">Consultar Todos os Logs</span></button>
<button type="button" style="float:right" class="btn btn-success" onclick="set(form,'new');form.submit();"><span class="glyphicon glyphicon-plus">Agendar</span></button>
</div>
<div class="panel-body">
<table class="datatable tablesorter">
<thead>
<tr>
<th><bean:message key="configuration.task"/></th>
<th>Tipo</th>
<th>Calendarização</th>
 
<th>Criador</th>
<th>Parametros</th>
<th>Última</th>
<th>Progresso</th>
<th></th>
</tr>
</thead>
<tbody>
<logic:iterate id="task" name="tasks" type="pt.estgp.estgweb.domain.JobServiceTaskSchedulerImpl">
<tr>
<td><bean:message key="targetService.${task.targetService}"/></td>
<td><bean:message key="configuration.task.${task.typeMsgKey}"/></td>
<td>
<logic:equal value="true" name="task" property="weekly">
<bean:message key="weekday.day"/> <bean:message key="weekday.${task.weekDayMsgKey}"/>
</logic:equal>
<logic:equal value="true" name="task" property="monthly">
<bean:message key="monthday.day"/> ${task.monthday}
</logic:equal>
<bean:message key="day.time"/>
${task.hour}:${task.minute}
</td>
 
<td>${task.createdBy.username}</td>
<td>
<table cellspacing="0" cellspadding="0">
<logic:iterate id="taskParam" name="task" property="serviceTaskSchedulerParameters" type="pt.estgp.estgweb.domain.JobServiceTaskSchedulerParameter">
<tr>
<td>
${taskParam.name}
</td>
<td>
${taskParam.object}
</td>
</tr>
</logic:iterate>
</table>
</td>
<td class="jobStatus${task.lastJobServiceTask.status}">
<logic:notEmpty name="task" property="lastJobServiceTask">
<bean:message key="job.status.${task.lastJobServiceTask.status}"/>
</logic:notEmpty>
</td>
<td style="text-align: right">
<logic:notEmpty name="task" property="lastJobServiceTask">
${task.lastJobServiceTask.progress} %
</logic:notEmpty>
</td>
 
<td>
<button type="button" class="btn btn-default">
<span class="glyphicon glyphicon-list-alt"></span>
</button>
 
 
</td>
 
</tr>
</logic:iterate>
</tbody>
 
</table>
</div>
</div>
</div>
 
 
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
Property changes:
Added: svn:executable
+ *
/impl/src/web/css/style.css
2,7 → 2,12
BODY *, .contentPortal, .contentPortal p, .contentPortal li, div {
FONT-FAMILY: "bitstream vera sans", Trebuchet MS, Verdana, Arial, Helvetica, sans-serif;
FONT-SIZE: 12px;
 
}
BODY
{
background-color: white;
}
 
 
 
25,21 → 30,21
 
/*Errors and Warnings*/
.statusOK, .active {
padding: 2px;
padding: 2px ;
list-style-type: none;
color: green;
background-color: #FFEEDD;
color: green !important;
background-color: #FFEEDD !important;
}
 
.statusERROR *, .statusERROR, .inactive {
color: red;
color: red !important;
}
 
.statusWARNING *, .statusWARNING {
padding: 2px;
list-style-type: none;
color: yellow;
background-color: black;
color: yellow !important;
background-color: black !important;
}
 
#header #headerTable
89,7 → 94,7
}
 
h1 {
font-size: 1.2em;
font-size: 1.2em !important;
margin: 5;
color: #808081;
}
98,17 → 103,20
.seccao h1 {
border-bottom:1px solid black;
padding:3px;
font-size: 1.3em;
font-size: 1.3em !important;
margin: 0;
font-weight:bold;
}
 
p,li{
color:black;
}
.seccao h2 {
background-color: #EEEEEE;
padding:2px;
border-bottom:1px solid black;
margin: 0;
font-size: 1em;
font-size: 1em !important;
font-weight:normal;
padding-left:10px;
}
116,14 → 124,14
.seccao h3 {
padding:2px;
border-bottom:1px solid black;
font-size: 0.96em;
font-size: 0.96em !important;
padding-left:20px;
}
 
.seccao h4 {
padding:2px;
border-bottom:1px solid black;
font-size: 0.9em;
font-size: 0.9em !important;
font-weight:normal;
padding-left:35px;
}
2061,3 → 2069,41
 
 
 
.jobStatusPENDING
{
background-color: #ffffff !important;
}
.jobStatusSTARTED
{
background-color: darkgray !important;
}
.jobStatusFINISHED
{
background-color: #00ff00 !important;
}
.jobStatusFINISHED_ERRORS, .jobStatusFAILED, .jobStatusUNKNOWN_ERROR
{
background-color: #ff0000 !important;
}
.jobStatusFINISHED_WARNINGS
{
background-color: #ffff00 !important;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/impl/src/web/js/logtailer/logtail.js
New file
0,0 → 1,152
function log_handler(name, url, parent){
 
var self = this;
 
this.url = url;
this.parent = parent;
this.name = name;
 
this.header = $('<div class="header"></div>').appendTo(parent);
this.playback = $('<a href="#"></a>').text('Pausa').appendTo($('<div class="buttons"></div>').appendTo(this.header));
this.header.append($('<h2></h2>').text(name));
this.screen = $('<div class="screen"></div>').appendTo(parent);
this.screen.html('<div></div>');
 
this.playback.click(function(){
self.clicked();
return false;
});
 
this.lx = 1;
this.lines = {};
this.line_keys = [];
this.max_lines = 100000;
this.idx = 0;
 
this.paused = false;
this.inflight = null;
 
this.addLine = function(line, repaint){
 
var id = self.lx++;
 
self.line_keys.push(id);
self.lines[id] = $('<div/>').text(line).html();
 
if (self.line_keys.length > self.max_lines){
var dkey = self.line_keys.shift();
delete self.lines[dkey];
}
 
if (repaint) self.repaint();
 
return id;
};
 
this.repaint = function(){
 
var buffer = "";
var l = self.line_keys.length;
 
for (var i=0; i<l; i++){
buffer += self.lines[self.line_keys[i]] + "\n";
}
 
self.screen.find('div').html(buffer);
self.screen.scrollTop(self.screen[0].scrollHeight);
};
 
this.onLoaded = function(o, success, req){
 
self.inflight = null;
 
// if we've been pause, we ignore this response - we'll
// send it again once we unpause
if (self.paused) return;
 
if (!o){
if (!req.status){
self.addLine('[ERROR] Can\'t connect to log server', 1);
}else{
self.addLine('[ERROR] Error from log server: '+req.status, 1);
}
self.pause();
return;
}
 
if (!o.ok){
self.addLine('[ERROR] '+o.error);
self.pause();
return;
}
 
if (o.lines){
for (var i=0; i<o.lines.length; i++){
self.addLine(o.lines[i]);
}
self.repaint();
}
 
if (o.l){
self.idx = o.l;
}
 
if (!self.paused){
window.setTimeout(function(){ self.pumpLog(); }, 2000);
}
};
 
this.onError = function(req, status, ex){
 
self.addLine('[ERROR] '+status, 1);
self.pause();
};
 
this.pumpLog = function(){
 
self.inflight = $.ajax({
url: self.url+'?l='+self.idx,
success: this.onLoaded,
error: this.onError,
dataType: 'json'
});
};
 
this.pause = function(){
 
if (self.paused) return;
self.paused = true;
 
// make sure the request we're running now never completes
if (self.inflight){
self.inflight.success = null;
self.inflight.error = null;
}
 
self.playback.text('Resume');
 
self.addLine('--paused--', 1);
};
 
this.resume = function(){
 
if (!self.paused) return;
self.paused = false;
 
self.playback.text('Pause');
self.pumpLog();
 
self.addLine('--resumed--', 1);
}
 
this.clicked = function(){
if (self.paused){
self.resume();
}else{
self.pause();
}
}
 
this.repaint();
this.pumpLog();
}
/impl/src/web/js/jquerytables/jquerytable/theme.blue.css
New file
0,0 → 1,229
/*************
Blue Theme
*************/
/* overall */
.tablesorter-blue {
width: 100%;
background-color: #fff;
margin: 10px 0 15px;
text-align: left;
border-spacing: 0;
border: #cdcdcd 1px solid;
border-width: 1px 0 0 1px;
}
.tablesorter-blue th,
.tablesorter-blue td {
border: #cdcdcd 1px solid;
border-width: 0 1px 1px 0;
}
 
/* header */
.tablesorter-blue th,
.tablesorter-blue thead td {
font: 12px/18px Arial, Sans-serif;
font-weight: bold;
color: #000;
background-color: #99bfe6;
border-collapse: collapse;
padding: 4px;
text-shadow: 0 1px 0 rgba(204, 204, 204, 0.7);
}
.tablesorter-blue tbody td,
.tablesorter-blue tfoot th,
.tablesorter-blue tfoot td {
padding: 4px;
vertical-align: top;
}
.tablesorter-blue .header,
.tablesorter-blue .tablesorter-header {
/* black (unsorted) double arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
/* white (unsorted) double arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==); */
/* image */
/* background-image: url(images/black-unsorted.gif); */
background-repeat: no-repeat;
background-position: center right;
padding: 4px 18px 4px 4px;
white-space: normal;
cursor: pointer;
}
.tablesorter-blue .headerSortUp,
.tablesorter-blue .tablesorter-headerSortUp,
.tablesorter-blue .tablesorter-headerAsc {
background-color: #9fbfdf;
/* black asc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
/* white asc arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); */
/* image */
/* background-image: url(images/black-asc.gif); */
}
.tablesorter-blue .headerSortDown,
.tablesorter-blue .tablesorter-headerSortDown,
.tablesorter-blue .tablesorter-headerDesc {
background-color: #8cb3d9;
/* black desc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
/* white desc arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); */
/* image */
/* background-image: url(images/black-desc.gif); */
}
.tablesorter-blue thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
 
/* tfoot */
.tablesorter-blue tfoot .tablesorter-headerSortUp,
.tablesorter-blue tfoot .tablesorter-headerSortDown,
.tablesorter-blue tfoot .tablesorter-headerAsc,
.tablesorter-blue tfoot .tablesorter-headerDesc {
/* remove sort arrows from footer */
background-image: none;
}
 
/* tbody */
.tablesorter-blue td {
color: #3d3d3d;
background-color: #fff;
padding: 4px;
vertical-align: top;
}
 
/* hovered row colors
you'll need to add additional lines for
rows with more than 2 child rows
*/
.tablesorter-blue tbody > tr.hover > td,
.tablesorter-blue tbody > tr:hover > td,
.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.even.hover > td,
.tablesorter-blue tbody > tr.even:hover > td,
.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #d9d9d9;
}
.tablesorter-blue tbody > tr.odd.hover > td,
.tablesorter-blue tbody > tr.odd:hover > td,
.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #bfbfbf;
}
 
/* table processing indicator */
.tablesorter-blue .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
 
/* Zebra Widget - row alternating colors */
.tablesorter-blue tbody tr.odd > td {
background-color: #ebf2fa;
}
.tablesorter-blue tbody tr.even > td {
background-color: #fff;
}
 
/* Column Widget - column sort colors */
.tablesorter-blue td.primary,
.tablesorter-blue tr.odd td.primary {
background-color: #99b3e6;
}
.tablesorter-blue tr.even td.primary {
background-color: #c2d1f0;
}
.tablesorter-blue td.secondary,
.tablesorter-blue tr.odd td.secondary {
background-color: #c2d1f0;
}
.tablesorter-blue tr.even td.secondary {
background-color: #d6e0f5;
}
.tablesorter-blue td.tertiary,
.tablesorter-blue tr.odd td.tertiary {
background-color: #d6e0f5;
}
.tablesorter-blue tr.even td.tertiary {
background-color: #ebf0fa;
}
 
/* caption */
caption {
background-color: #fff;
}
 
/* filter widget */
.tablesorter-blue .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-blue .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-blue .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-blue .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-blue .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-blue input.tablesorter-filter,
.tablesorter-blue select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
 
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}
Property changes:
Added: svn:executable
+ *
/impl/src/web/js/jquerytables/jquerytable/desc.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquerytables/jquerytable/style.css
New file
0,0 → 1,39
/* tables */
table.tablesorter {
font-family:arial;
background-color: #CDCDCD;
margin:10px 0pt 15px;
font-size: 8pt;
width: 100%;
text-align: left;
}
table.tablesorter thead tr th, table.tablesorter tfoot tr th {
background-color: #e6EEEE;
border: 1px solid #FFF;
font-size: 8pt;
padding: 4px;
}
table.tablesorter thead tr .header {
background-image: url(bg.gif);
background-repeat: no-repeat;
background-position: center right;
cursor: pointer;
}
table.tablesorter tbody td {
color: #3D3D3D;
padding: 4px;
background-color: #FFF;
vertical-align: top;
}
table.tablesorter tbody tr.odd td {
background-color:#F0F0F6;
}
table.tablesorter thead tr .headerSortUp {
background-image: url(asc.gif);
}
table.tablesorter thead tr .headerSortDown {
background-image: url(desc.gif);
}
table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
background-color: #8dbdd8;
}
/impl/src/web/js/jquerytables/jquerytable/theme.green.css
New file
0,0 → 1,39
table.tablesorter {
font-size: 12px;
background-color: #4D4D4D;
width: 1024px;
border: 1px solid #000;
}
table.tablesorter th {
text-align: left;
padding: 5px;
background-color: #6E6E6E;
}
table.tablesorter td {
color: #FFF;
padding: 5px;
}
table.tablesorter .even {
background-color: #3D3D3D;
}
table.tablesorter .odd {
background-color: #6E6E6E;
}
table.tablesorter .header {
background-image: url(bg.png);
background-repeat: no-repeat;
border-left: 1px solid #FFF;
border-right: 1px solid #000;
border-top: 1px solid #FFF;
padding-left: 30px;
padding-top: 8px;
height: auto;
}
table.tablesorter .headerSortUp {
background-image: url(asc.png);
background-repeat: no-repeat;
}
table.tablesorter .headerSortDown {
background-image: url(desc.png);
background-repeat: no-repeat;
}
/impl/src/web/js/jquerytables/jquerytable/asc.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquerytables/jquerytable/theme.estg.css
New file
0,0 → 1,229
/*************
Blue Theme
*************/
/* overall */
.tablesorter-blue {
width: 100%;
background-color: #fff;
margin: 10px 0 15px;
text-align: left;
border-spacing: 0;
border: #cdcdcd 1px solid;
border-width: 1px 0 0 1px;
}
.tablesorter-blue th,
.tablesorter-blue td {
border: #cdcdcd 1px solid;
border-width: 0 1px 1px 0;
}
 
/* header */
.tablesorter-blue th,
.tablesorter-blue thead td {
font: 12px/18px Arial, Sans-serif;
font-weight: bold;
color: #000;
background-color: #e6b262;
border-collapse: collapse;
padding: 4px;
text-shadow: 0 1px 0 rgba(204, 204, 204, 0.7);
}
.tablesorter-blue tbody td,
.tablesorter-blue tfoot th,
.tablesorter-blue tfoot td {
padding: 4px;
vertical-align: top;
}
.tablesorter-blue .header,
.tablesorter-blue .tablesorter-header {
/* black (unsorted) double arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
/* white (unsorted) double arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==); */
/* image */
/* background-image: url(images/black-unsorted.gif); */
background-repeat: no-repeat;
background-position: center right;
padding: 4px 18px 4px 4px;
white-space: normal;
cursor: pointer;
}
.tablesorter-blue .headerSortUp,
.tablesorter-blue .tablesorter-headerSortUp,
.tablesorter-blue .tablesorter-headerAsc {
background-color: #e6b262;
/* black asc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
/* white asc arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); */
/* image */
/* background-image: url(images/black-asc.gif); */
}
.tablesorter-blue .headerSortDown,
.tablesorter-blue .tablesorter-headerSortDown,
.tablesorter-blue .tablesorter-headerDesc {
background-color: #e6b262;
/* black desc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
/* white desc arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); */
/* image */
/* background-image: url(images/black-desc.gif); */
}
.tablesorter-blue thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
 
/* tfoot */
.tablesorter-blue tfoot .tablesorter-headerSortUp,
.tablesorter-blue tfoot .tablesorter-headerSortDown,
.tablesorter-blue tfoot .tablesorter-headerAsc,
.tablesorter-blue tfoot .tablesorter-headerDesc {
/* remove sort arrows from footer */
background-image: none;
}
 
/* tbody */
.tablesorter-blue td {
color: #3d3d3d;
background-color: #fff;
padding: 4px;
vertical-align: top;
}
 
/* hovered row colors
you'll need to add additional lines for
rows with more than 2 child rows
*/
.tablesorter-blue tbody > tr.hover > td,
.tablesorter-blue tbody > tr:hover > td,
.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.even.hover > td,
.tablesorter-blue tbody > tr.even:hover > td,
.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #d9d9d9;
}
.tablesorter-blue tbody > tr.odd.hover > td,
.tablesorter-blue tbody > tr.odd:hover > td,
.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #bfbfbf;
}
 
/* table processing indicator */
.tablesorter-blue .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
 
/* Zebra Widget - row alternating colors */
.tablesorter-blue tbody tr.odd > td {
background-color: #faf2f6;
}
.tablesorter-blue tbody tr.even > td {
background-color: #fff;
}
 
/* Column Widget - column sort colors */
.tablesorter-blue td.primary,
.tablesorter-blue tr.odd td.primary {
background-color: #e6b721;
}
.tablesorter-blue tr.even td.primary {
background-color: #e8cf60;
}
.tablesorter-blue td.secondary,
.tablesorter-blue tr.odd td.secondary {
background-color: #e8d68a;
}
.tablesorter-blue tr.even td.secondary {
background-color: #e8d6b5;
}
.tablesorter-blue td.tertiary,
.tablesorter-blue tr.odd td.tertiary {
background-color: #e8dec8;
}
.tablesorter-blue tr.even td.tertiary {
background-color: #e8e2dd;
}
 
/* caption */
caption {
background-color: #fff;
}
 
/* filter widget */
.tablesorter-blue .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-blue .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-blue .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-blue .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-blue .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-blue input.tablesorter-filter,
.tablesorter-blue select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
 
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}
Property changes:
Added: svn:executable
+ *
/impl/src/web/js/jquerytables/jquerytable/bg.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquerytables/jquerytable/filter.formatter.css
New file
0,0 → 1,183
/**** Filter Formatter Elements ****/
.tablesorter .tablesorter-filter-row td {
text-align: center;
font-size: 0.9em;
font-weight: normal;
}
 
/**** Sliders ****/
/* shrink the sliders to look nicer inside of a table cell */
.tablesorter .ui-slider, .tablesorter input.range {
width: 90%;
margin: 2px auto 2px auto; /* add enough top margin so the tooltips will fit */
font-size: 0.8em;
}
.tablesorter .ui-slider {
top: 12px;
}
.tablesorter .ui-slider .ui-slider-handle {
width: 0.9em;
height: 0.9em;
}
.tablesorter .ui-datepicker {
font-size: 0.8em;
}
.tablesorter .ui-slider-horizontal {
height: 0.5em;
}
/* Add tooltips to slider handles */
.tablesorter .value-popup:after {
content : attr(data-value);
position: absolute;
bottom: 14px;
left: -7px;
min-width: 18px;
height: 12px;
background-color: #444;
background-image: -webkit-gradient(linear, left top, left bottom, from(#444444), to(#999999));
background-image: -webkit-linear-gradient(top, #444, #999);
background-image: -moz-linear-gradient(top, #444, #999);
background-image: -o-linear-gradient(top, #444, #999);
background-image: linear-gradient(to bottom, #444, #999);
-webkit-border-radius: 3px;
border-radius: 3px;
-webkit-background-clip: padding-box; background-clip: padding-box;
-webkit-box-shadow: 0px 0px 4px 0px #777;
box-shadow: 0px 0px 4px 0px #777;
border: #444 1px solid;
color: #fff;
font: 1em/1.1em Arial, Sans-Serif;
padding: 1px;
text-align: center;
}
.tablesorter .value-popup:before {
content: "";
position: absolute;
width: 0;
height: 0;
border-top: 8px solid #777;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
top: -8px;
left: 50%;
margin-left: -8px;
margin-top: -1px;
}
 
/**** Date Picker ****/
.tablesorter .dateFrom, .tablesorter .dateTo {
width: 80px;
margin: 2px 5px;
}
 
/**** Color Picker/HTML5Number Toggle button ****/
.tablesorter .button {
width: 14px;
height: 14px;
background: #fcfff4;
background: -webkit-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: -moz-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: -o-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: -ms-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfff4', endColorstr='#b3bead', GradientType=0 );
margin: 1px 5px 1px 1px;
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
border-radius: 25px;
-webkit-box-shadow: inset 0px 1px 1px white, 0px 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: inset 0px 1px 1px white, 0px 1px 3px rgba(0,0,0,0.5);
box-shadow: inset 0px 1px 1px white, 0px 1px 3px rgba(0,0,0,0.5);
position: relative;
top: 3px;
display: inline-block;
}
 
.tablesorter .button label {
cursor: pointer;
position: absolute;
width: 10px;
height: 10px;
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
border-radius: 25px;
left: 2px;
top: 2px;
-webkit-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,1);
-moz-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,1);
box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,1);
background: #45484d;
background: -webkit-linear-gradient(top, #222 0%, #45484d 100%);
background: -moz-linear-gradient(top, #222 0%, #45484d 100%);
background: -o-linear-gradient(top, #222 0%, #45484d 100%);
background: -ms-linear-gradient(top, #222 0%, #45484d 100%);
background: linear-gradient(top, #222 0%, #45484d 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#222', endColorstr='#45484d', GradientType=0 );
}
 
.tablesorter .button label:after {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
content: '';
position: absolute;
width: 8px;
height: 8px;
background: #55f;
background: -webkit-linear-gradient(top, #aaf 0%, #55f 100%);
background: -moz-linear-gradient(top, #aaf 0%, #55f 100%);
background: -o-linear-gradient(top, #aaf 0%, #55f 100%);
background: -ms-linear-gradient(top, #aaf 0%, #55f 100%);
background: linear-gradient(top, #aaf 0%, #55f 100%);
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
border-radius: 25px;
top: 1px;
left: 1px;
-webkit-box-shadow: inset 0px 1px 1px #fff, 0px 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: inset 0px 1px 1px #fff, 0px 1px 3px rgba(0,0,0,0.5);
box-shadow: inset 0px 1px 1px #fff, 0px 1px 3px rgba(0,0,0,0.5);
}
 
.tablesorter .button label:hover::after {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
filter: alpha(opacity=30);
opacity: 0.3;
}
 
.tablesorter .button input[type=checkbox] {
visibility: hidden;
}
 
.tablesorter .button input[type=checkbox]:checked + label:after {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
filter: alpha(opacity=100);
opacity: 1;
}
 
.tablesorter .colorpicker {
width: 30px;
height: 18px;
}
.tablesorter .ui-spinner-input {
width: 100px;
height: 18px;
}
.tablesorter .currentColor, .tablesorter .ui-spinner {
position: relative;
}
.tablesorter input.number {
position: relative;
}
 
/* hide filter row */
.tablesorter .tablesorter-filter-row.hideme td * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
Property changes:
Added: svn:executable
+ *
/impl/src/web/layout/scripts.jsp
2,11 → 2,11
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
 
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/menu/assets/skins/sam/menu.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/button/assets/skins/sam/button.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/container/assets/skins/sam/container.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/editor/assets/skins/sam/editor.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/menu/assets/skins/sam/menu.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/button/assets/skins/sam/button.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/container/assets/skins/sam/container.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/yui/build/editor/assets/skins/sam/editor.css" />
 
 
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/style.css"/>
14,12 → 14,12
<script type="text/javascript" src="<%=request.getContextPath()%>/js/ajax.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/compactedPopup.js"></script>
 
 
<!--
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquery/style.css"/>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-latest.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.tablesorter.js"></script>
-->
 
 
<%
String link = (String) request.getAttribute(TopImageFilter.TOP_CSS);
if (link != null)
33,12 → 33,283
<script type="text/javascript" language="JavaScript">
var cal = new CalendarPopup();
 
//TABLE SORTER
/* //TABLE SORTER
$(document).ready(function()
{
$("#myTable").tablesorter();
 
}
);
);*/
 
</script>
</script>
 
 
 
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquerytables/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquerytables/jquery.tablesorter.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquerytables/jquery.tablesorter.widgets.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquerytables/bootstrap/js/bootstrap.js"></script>
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap.css" type="text/css"/>
<!--<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap-theme.css" type="text/css"/>-->
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/jquerytable/theme.estg.css" type="text/css"/>
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/jquerytable/filter.formatter.css" type="text/css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/variables.less"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/lavish-bootstrap.css"/>
 
<script language="javascript">
$(document).ready(function()
{
if($("#myTable"))
{
$("#myTable").tablesorter({
theme: 'blue',
 
 
sortMultiSortKey: 'altKey',
//sortList: [[0,0]],
widgets: ["zebra","filter"],
 
ignoreCase: false,
widthFixed : true,
widgetOptions : {filter_reset : 'button.reset',filter_columnFilters : true},
textExtraction: function(node) {
// extract data from markup and return it
if($(node).find(':input').size()>0)
{
var values = $(node).find(":input").map(function() {
return $(this).val()
}).get().join(",");
 
 
return values;
}
return $(node).text();
}
 
/* ,
 
widgetOptions : {
 
// filter_anyMatch options was removed in v2.15; it has been replaced by the filter_external option
 
// If there are child rows in the table (rows with class name from "cssChildRow" option)
// and this option is true and a match is found anywhere in the child row, then it will make that row
// visible; default is false
filter_childRows : false,
 
// if true, filter child row content by column; filter_childRows must also be true
filter_childByColumn : false,
 
// if true, a filter will be added to the top of each table column;
// disabled by using -> headers: { 1: { filter: false } } OR add class="filter-false"
// if you set this to false, make sure you perform a search using the second method below
filter_columnFilters : true,
 
// if true, allows using "#:{query}" in AnyMatch searches (column:query; added v2.20.0)
filter_columnAnyMatch: true,
 
// extra css class name (string or array) added to the filter element (input or select)
filter_cellFilter : '',
 
// extra css class name(s) applied to the table row containing the filters & the inputs within that row
// this option can either be a string (class applied to all filters) or an array (class applied to indexed filter)
filter_cssFilter : '', // or []
 
// add a default column filter type "~{query}" to make fuzzy searches default;
// "{q1} AND {q2}" to make all searches use a logical AND.
filter_defaultFilter : {},
 
// filters to exclude, per column
filter_excludeFilter : {},
 
// jQuery selector (or object) pointing to an input to be used to match the contents of any column
// please refer to the filter-any-match demo for limitations - new in v2.15
filter_external : '',
 
// class added to filtered rows (rows that are not showing); needed by pager plugin
filter_filteredRow : 'filtered',
 
// add custom filter elements to the filter row
// see the filter formatter demos for more specifics
filter_formatter : null,
 
// add custom filter functions using this option
// see the filter widget custom demo for more specifics on how to use this option
filter_functions : null,
 
// hide filter row when table is empty
filter_hideEmpty : true,
 
// if true, filters are collapsed initially, but can be revealed by hovering over the grey bar immediately
// below the header row. Additionally, tabbing through the document will open the filter row when an input gets focus
filter_hideFilters : true,
 
// Set this option to false to make the searches case sensitive
filter_ignoreCase : true,
 
// if true, search column content while the user types (with a delay)
filter_liveSearch : true,
 
// a header with a select dropdown & this class name will only show available (visible) options within that drop down.
 
 
// default placeholder text (overridden by any header "data-placeholder" setting)
filter_placeholder : { search : '', select : '' },
 
// jQuery selector string of an element used to reset the filters
filter_reset : 'button.reset',
 
// Use the $.tablesorter.storage utility to save the most recent filters (default setting is false)
filter_saveFilters : true,
 
// Delay in milliseconds before the filter widget starts searching; This option prevents searching for
// every character while typing and should make searching large tables faster.
filter_searchDelay : 300,
 
// allow searching through already filtered rows in special circumstances; will speed up searching in large tables if true
filter_searchFiltered: true,
 
// include a function to return an array of values to be added to the column filter select
filter_selectSource : null,
 
// if true, server-side filtering should be performed because client-side filtering will be disabled, but
// the ui and events will still be used.
filter_serversideFiltering : false,
 
// Set this option to true to use the filter to find text from the start of the column
// So typing in "a" will find "albert" but not "frank", both have a's; default is false
filter_startsWith : false,
 
// Filter using parsed content for ALL columns
// be careful on using this on date columns as the date is parsed and stored as time in seconds
filter_useParsedData : false,
 
// data attribute in the header cell that contains the default filter value
filter_defaultAttrib : 'data-value',
 
// filter_selectSource array text left of the separator is added to the option value, right into the option text
filter_selectSourceSeparator : '|'
 
}*/
}
);
}
 
if($("#myTable2"))
{
$("#myTable2").tablesorter({
theme: 'blue',
sortMultiSortKey: 'altKey',
//sortList: [[0,0]],
widgets: ["zebra","filter"],
ignoreCase: false,
widthFixed : true,
widgetOptions : {filter_reset : 'button.reset',filter_columnFilters : true},
textExtraction: function(node) {
// extract data from markup and return it
if($(node).find(':input').size()>0)
{
var values = $(node).find(":input").map(function() {
return $(this).val()
}).get().join(",");
 
 
return values;
}
return $(node).text();
}
}
);
}
 
if($(".tablesortersimple"))
{
$(".tablesortersimple").tablesorter({
theme: 'blue',
sortMultiSortKey: 'altKey',
//sortList: [[0,0]],
widgets: ["zebra","filter"],
ignoreCase: false,
widthFixed : true,
widgetOptions : {filter_reset : 'button.reset',filter_columnFilters : false},
textExtraction: function(node) {
// extract data from markup and return it
if($(node).find(':input').size()>0)
{
var values = $(node).find(":input").map(function() {
return $(this).val()
}).get().join(",");
 
 
return values;
}
return $(node).text();
}
}
);
}
 
 
 
// External search
// buttons set up like this:
// <button type="button" data-filter-column="4" data-filter-text="2?%">Saved Search</button>
$('button[data-filter-column]').click(function(){
/*** first method *** data-filter-column="1" data-filter-text="!son"
add search value to Discount column (zero based index) input */
var filters = [],
$t = $(this),
col = $t.data('filter-column'), // zero-based index
txt = $t.data('filter-text') || $t.text(); // text to add to filter
 
filters[col] = txt;
// using "table.hasFilters" here to make sure we aren't targeting a sticky header
if($('#myTable'))
$.tablesorter.setFilters( $('#myTable'), filters, true ); // new v2.9
if($('#myTable2'))
$.tablesorter.setFilters( $('#myTable2'), filters, true ); // new v2.9
 
/** old method (prior to tablsorter v2.9 ***
var filters = $('table.tablesorter').find('input.tablesorter-filter');
filters.val(''); // clear all filters
filters.eq(col).val(txt).trigger('search', false);
******/
 
/*** second method ***
this method bypasses the filter inputs, so the "filter_columnFilters"
option can be set to false (no column filters showing)
******/
/*
var columns = [];
columns[5] = '2?%'; // or define the array this way [ '', '', '', '', '', '2?%' ]
$('table').trigger('search', [ columns ]);
*/
 
return false;
});
 
}
 
 
);
</script>
<style>
th.headerSortUp {
background-image: url(<%=request.getContextPath()%>/js/jquerytables/jquerytable/asc.gif);
background-color: #3399FF;
}
th.headerSortDown {
background-image: url(<%=request.getContextPath()%>/js/jquerytables/jquerytable/desc.gif);
background-color: #3399FF;
}
.dorsalActivado span, .dorsal span
{
text-align: center;
background-color: white;
padding: 3px;
border: 1px solid black;
font-weight: bold;
white-space: nowrap;
}
 
</style>
/impl/src/web/layout/footer.jsp
18,7 → 18,7
<div id="license">
<ul class="copyRightLink">
<li><font size=10 align="center"><b>Copyright © <a href="http://www.estgp.pt">ESTG</a> 2010</b></font></li>
<li><font size=10 align="center"><b>Powered by BACO - 2010</b></font></li>
<li><font size=10 align="center"><b>Powered by BACO v3 - 2015</b></font></li>
</ul>
</div>
</td>
/impl/src/web/layout/scriptsBootstrapSoft.jsp
New file
0,0 → 1,10
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/variables.less"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/lavish-bootstrap.css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap.css"/>
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquerytables/bootstrap/css/bootstrap-theme.css"/>
 
 
 
<script src="<%=request.getContextPath()%>/js/jquerytables/jquery-2.1.4.min.js"></script>
<script src="<%=request.getContextPath()%>/js/jquerytables/bootstrap/js/bootstrap.min.js"></script>
/impl/src/web/user/courseunits/courseunitworks.jsp
122,173 → 122,180
</baco:canManage>
<p>
<logic:notEmpty name="CourseUnitView" property="courseUnitAssignements">
<table class="dataTable">
<tr>
<th><bean:message key="saveDate"/></th>
<th><bean:message key="courseunit.title"/></th>
<th><bean:message key="courseunit.assignement.file"/></th>
<th><bean:message key="courseunit.assignement.deliver.date"/></th>
<th><bean:message key="courseunit.assignement.deliver.late.permission"/></th>
<th><bean:message key="courseunit.assignement.deliver.type"/></th>
<baco:canManage name="CourseUnitView">
<table id="myTable" class="tablesorter dataTable">
<thead>
<tr>
<th><bean:message key="saveDate"/></th>
<th><bean:message key="courseunit.title"/></th>
<th><bean:message key="courseunit.assignement.file"/></th>
<th><bean:message key="courseunit.assignement.deliver.date"/></th>
<th><bean:message key="courseunit.assignement.deliver.late.permission"/></th>
<th><bean:message key="courseunit.assignement.deliver.type"/></th>
<baco:canManage name="CourseUnitView">
<%
request.setAttribute("colspanAssignement",6);
%>
<th><bean:message key="courseunit.status"/></th>
<th><bean:message key="courseunit.assignement.delivers"/></th>
<th colspan="3"><bean:message key="manage"/></th>
</baco:canManage>
<baco:isStudentOfCourseUnit courseUnitId="${CourseUnitView.id}">
<%
request.setAttribute("colspanAssignement",8);
%>
<th><bean:message key="courseunit.assignement.deliver"/></th>
<th><bean:message key="courseunit.assignement.deliver.time"/></th>
<th><bean:message key="courseunit.assignement.deliver.grade"/></th>
<th><bean:message key="courseunit.assignement.deliver.obs"/></th>
</baco:isStudentOfCourseUnit>
</tr>
</thead>
<tbody>
<logic:iterate id="work" name="CourseUnitView" property="courseUnitAssignements" type="pt.estgp.estgweb.domain.views.CourseUnitAssignementView">
<tr>
<td align="right">
<a >${work.formatedSaveDate}</a>
</td>
<td>
<a href="javascript:showOrHideOne('assignement${work.id}')">${work.title}</a>
</td>
<td>
<logic:notEmpty name="work" property="workFile">
<a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${work.workFile}">${work.repositoryFile.lastVersion.name} (${work.repositoryFile.lastVersion.sizeKb} Kb)</a>
</logic:notEmpty>
</td>
<%
request.setAttribute("colspanAssignement",6);
String deliverDateStyleClass;
if(work.isActive())
deliverDateStyleClass = "active";
else
deliverDateStyleClass = "inactive";
%>
<th><bean:message key="courseunit.status"/></th>
<th><bean:message key="courseunit.assignement.delivers"/></th>
<th colspan="3"><bean:message key="manage"/></th>
</baco:canManage>
<baco:isStudentOfCourseUnit courseUnitId="${CourseUnitView.id}">
<%
request.setAttribute("colspanAssignement",8);
%>
<th><bean:message key="courseunit.assignement.deliver"/></th>
<th><bean:message key="courseunit.assignement.deliver.time"/></th>
<th><bean:message key="courseunit.assignement.deliver.grade"/></th>
<th><bean:message key="courseunit.assignement.deliver.obs"/></th>
</baco:isStudentOfCourseUnit>
</tr>
<logic:iterate id="work" name="CourseUnitView" property="courseUnitAssignements" type="pt.estgp.estgweb.domain.views.CourseUnitAssignementView">
<tr>
<td align="right">
<a >${work.formatedSaveDate}</a>
</td>
<td>
<a href="javascript:showOrHideOne('assignement${work.id}')">${work.title}</a>
</td>
<td>
<logic:notEmpty name="work" property="workFile">
<a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${work.workFile}">${work.repositoryFile.lastVersion.name} (${work.repositoryFile.lastVersion.sizeKb} Kb)</a>
</logic:notEmpty>
</td>
<%
String deliverDateStyleClass;
if(work.isActive())
deliverDateStyleClass = "active";
else
deliverDateStyleClass = "inactive";
%>
<td class="<%=deliverDateStyleClass%> number">
${work.deliverDate}
</td>
<td>
<logic:equal value="true" name="work" property="lateDelivers">
<bean:message key="yes"/>
</logic:equal>
<logic:notEqual value="true" name="work" property="lateDelivers">
<bean:message key="no"/>
</logic:notEqual>
</td>
<td>
<bean:message key="courseunit.assignement.deliver.type.${work.deliverType}"/>
</td>
<baco:canManage name="CourseUnitView">
<td>
<logic:equal value="true" name="work" property="status">
<bean:message key="status.active"/>
</logic:equal>
<logic:notEqual value="true" name="work" property="status">
<bean:message key="status.inactive"/>
</logic:notEqual>
</td>
<td class="number">
<logic:greaterThan value="0" name="work" property="delivers">
<html:link action="/user/startLoadCourseUnitAssignementFromHome?courseUnitAssignementView.id=${work.id}">${work.delivers}</html:link>
</logic:greaterThan>
<logic:equal value="0" name="work" property="delivers">
${work.delivers}
</logic:equal>
</td>
<td>
<html:link action="/user/startEditCourseUnitWorksFromHome?courseUnitAssignementView.id=${work.id}&courseUnitView.id=${CourseUnitView.id}">
<bean:message key="edit"/>
</html:link>
</td>
<td>
<a href="<%=request.getContextPath()%>/user/startValidateInvalidateCourseUnitWorksFromHome.do?courseUnitAssignementView.id=${work.id}">
<logic:equal value="true" name="work" property="status">
<bean:message key="deactivate"/>
<td class="<%=deliverDateStyleClass%> number">
${work.deliverDate}
</td>
<td>
<logic:equal value="true" name="work" property="lateDelivers">
<bean:message key="yes"/>
</logic:equal>
<logic:notEqual value="true" name="work" property="status">
<bean:message key="activate"/>
<logic:notEqual value="true" name="work" property="lateDelivers">
<bean:message key="no"/>
</logic:notEqual>
</a>
</td>
<%
String confirmDelete = MessageResources.getMessage(request, "courseunitwork.confirm.delete");
request.setAttribute("confirmDelete", confirmDelete);
%>
<td>
<logic:equal value="0" name="work" property="delivers">
<html:link onclick="return confirm('${confirmDelete}')" action="/user/startDeleteCourseUnitWorksFromHome?courseUnitAssignementView.id=${work.id}">
<bean:message key="delete"/>
</html:link>
</logic:equal>
<logic:notEqual value="0" name="work" property="delivers">
<%--<bean:message key="delete"/>--%>
</logic:notEqual>
</td>
</baco:canManage>
<baco:isStudentOfCourseUnit courseUnitId="${CourseUnitView.id}">
<td nowrap="nowrap">
</td>
<td>
<bean:message key="courseunit.assignement.deliver.type.${work.deliverType}"/>
</td>
<baco:canManage name="CourseUnitView">
<td>
<logic:equal value="true" name="work" property="status">
<bean:message key="status.active"/>
</logic:equal>
<logic:notEqual value="true" name="work" property="status">
<bean:message key="status.inactive"/>
</logic:notEqual>
</td>
<td class="number">
<logic:greaterThan value="0" name="work" property="delivers">
<html:link action="/user/startLoadCourseUnitAssignementFromHome?courseUnitAssignementView.id=${work.id}">${work.delivers}</html:link>
</logic:greaterThan>
<logic:equal value="0" name="work" property="delivers">
${work.delivers}
</logic:equal>
</td>
<td>
<html:link styleClass="btn btn-default btn-sm" action="/user/startEditCourseUnitWorksFromHome?courseUnitAssignementView.id=${work.id}&courseUnitView.id=${CourseUnitView.id}">
<span class="glyphicon glyphicon-pencil"></span>
</html:link>
</td>
<td>
<logic:equal value="true" name="work" property="status">
<a class="btn btn-success btn-sm" href="<%=request.getContextPath()%>/user/startValidateInvalidateCourseUnitWorksFromHome.do?courseUnitAssignementView.id=${work.id}">
<span class="glyphicon glyphicon-ok-circle"></span>
</a>
</logic:equal>
<logic:notEqual value="true" name="work" property="status">
<a class="btn btn-warning btn-sm" href="<%=request.getContextPath()%>/user/startValidateInvalidateCourseUnitWorksFromHome.do?courseUnitAssignementView.id=${work.id}">
<span class="glyphicon glyphicon-ban-circle"></span>
</a>
</logic:notEqual>
</td>
<%
String confirmDelete = MessageResources.getMessage(request, "courseunitwork.confirm.delete");
request.setAttribute("confirmDelete", confirmDelete);
%>
<td>
<logic:equal value="0" name="work" property="delivers">
 
<%
if(work.canDeliver(request))
{
%>
<html:form action="/user/courseUnitControllerFromHome" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="deliverWork">
<html:hidden property="courseUnitAssignementView.id" value="${work.id}"/>
<html:hidden property="courseUnitView.id" value="${CourseUnitView.id}"/>
<html:file property="uploadFile"/>
<html:link styleClass="btn btn-danger btn-sm" onclick="return confirm('${confirmDelete}')" action="/user/startDeleteCourseUnitWorksFromHome?courseUnitAssignementView.id=${work.id}">
<span class="glyphicon glyphicon-remove"></span>
</html:link>
</logic:equal>
<logic:notEqual value="0" name="work" property="delivers">
<%--<bean:message key="delete"/>--%>
</logic:notEqual>
</td>
</baco:canManage>
<baco:isStudentOfCourseUnit courseUnitId="${CourseUnitView.id}">
<td nowrap="nowrap">
 
<%
if(work.canDeliver(request))
{
%>
<html:form action="/user/courseUnitControllerFromHome" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="deliverWork">
<html:hidden property="courseUnitAssignementView.id" value="${work.id}"/>
<html:hidden property="courseUnitView.id" value="${CourseUnitView.id}"/>
<html:file property="uploadFile"/>
<logic:notEmpty name="work" property="courseUnitDeliverableView">
<input type="submit" value="<bean:message key="replace"/>"/>
</logic:notEmpty>
<logic:empty name="work" property="courseUnitDeliverableView">
<input type="submit" value="<bean:message key="courseunit.assignement.deliver"/>"/>
</logic:empty>
</html:form>
<%
}
%>
 
</td>
<logic:empty name="work" property="courseUnitDeliverableView">
<td class="statusWARNING">
<bean:message key="courseunit.assignement.deliver.time.no"/>
</td>
</logic:empty>
<logic:notEmpty name="work" property="courseUnitDeliverableView">
<input type="submit" value="<bean:message key="replace"/>"/>
<logic:equal name="work" property="lateDeliver" value="true">
<td class="statusERROR">
<bean:message key="courseunit.assignement.deliver.time.late"/>
</td>
</logic:equal>
<logic:notEqual name="work" property="lateDeliver" value="true">
<td class="statusOK">
<bean:message key="courseunit.assignement.deliver.time.ok"/>
</td>
</logic:notEqual>
</logic:notEmpty>
<logic:empty name="work" property="courseUnitDeliverableView">
<input type="submit" value="<bean:message key="courseunit.assignement.deliver"/>"/>
</logic:empty>
</html:form>
<%
}
%>
 
</td>
<logic:empty name="work" property="courseUnitDeliverableView">
<td class="statusWARNING">
<bean:message key="courseunit.assignement.deliver.time.no"/>
</td>
</logic:empty>
<logic:notEmpty name="work" property="courseUnitDeliverableView">
<logic:equal name="work" property="lateDeliver" value="true">
<td class="statusERROR">
<bean:message key="courseunit.assignement.deliver.time.late"/>
<td>
${work.courseUnitDeliverableView.grade}
</td>
</logic:equal>
<logic:notEqual name="work" property="lateDeliver" value="true">
<td class="statusOK">
<bean:message key="courseunit.assignement.deliver.time.ok"/>
<td>
${work.courseUnitDeliverableView.obs}
</td>
</logic:notEqual>
</logic:notEmpty>
<td>
${work.courseUnitDeliverableView.grade}
</td>
<td>
${work.courseUnitDeliverableView.obs}
</td>
</baco:isStudentOfCourseUnit>
<logic:notEmpty name="work" property="courseUnitDeliverableView">
<td>
<a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${work.courseUnitDeliverableView.fileStreamId}"><bean:message key="courseunit.assignement.deliver.version"/> (${work.courseUnitDeliverableView.deliverDateStr})</a>
</td>
</logic:notEmpty>
</tr>
<tr id="assignement${work.id}" style="<%=Globals.HIDDEN%>">
<td colspan="${colspanAssignement}">
${work.formatedDescription}
</td>
</tr>
</logic:iterate>
</baco:isStudentOfCourseUnit>
<logic:notEmpty name="work" property="courseUnitDeliverableView">
<td>
<a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${work.courseUnitDeliverableView.fileStreamId}"><bean:message key="courseunit.assignement.deliver.version"/> (${work.courseUnitDeliverableView.deliverDateStr})</a>
</td>
</logic:notEmpty>
</tr>
<tr id="assignement${work.id}" style="<%=Globals.HIDDEN%>">
<td colspan="${colspanAssignement}">
${work.formatedDescription}
</td>
</tr>
</logic:iterate>
</tbody>
</table>
</logic:notEmpty>
<logic:empty name="CourseUnitView" property="courseUnitAssignements">
/impl/src/web/user/courseunits/courseunitEvaluation.jsp
4,6 → 4,8
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="pt.estgp.estgweb.domain.Teacher" %>
<%@ page import="pt.estgp.estgweb.domain.ConfigurationImpl" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
48,8 → 50,23
 
boolean closed = CourseUnitEvaluationForm.getCourseUnitEvaluationView().getCourseUnitEvaluation().isClosed();
boolean teacherComplete = CourseUnitEvaluationForm.getCourseUnitEvaluationView().getCourseUnitEvaluation().isTeacherComplete();
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYearCreateTransaction();
List<String> activeDegrees = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveDegreesCreateTransaction();
List<Long> activeCourseIds = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveCourseIdsCreateTransaction();
 
boolean isActiveYear = activeYear != null && CourseUnitView.getImportYear().equals(activeYear);
boolean isActiveDegree = activeDegrees!=null && activeDegrees.contains(CourseUnitView.getCourseView().getDegree());
boolean isActiveCourseId = activeCourseIds!=null && activeCourseIds.contains(CourseUnitView.getCourseView().getId());
 
boolean activePeriod =
CourseUnitView.isEvaluationOpenByAdmin() ||
(isActiveYear && (isActiveCourseId || isActiveDegree));
boolean activePeriodRegular =
(isActiveYear && (isActiveCourseId || isActiveDegree));
 
 
 
 
%>
<div class="seccao">
<h2>
105,9 → 122,21
{
 
 
if(!activePeriod)
{
%>
<h2>O periodo de avaliação desta unidade está <label style="background-color: red">ENCERRADO</label> independentemente do seu estado de validação. Apenas a administração tem autorização de excepcionalmente abrir a ficha para edição</h2>
<br/>
<%
}
if(!activePeriodRegular && activePeriod)
{
%>
<h2>Esta unidade foi <label style="background-color: #00ff00">ABERTA</label> pela administração para efectuar processo de avaliação extraordinário</h2>
<br/>
<%
}
 
<%
if(closed)
{
%>
144,7 → 173,7
</table>
<p class="success">Este formulário foi <label style="background-color: green">ACEITE</label> pela <bean:message key="user.role.${CourseUnitView.courseView.validationRole}"/></p>
<%
if(editCoordinatorPart)
if(editCoordinatorPart && activePeriod)
{
%>
<html:form action="/user/courseUnitEvaluationController">
199,7 → 228,7
 
</table>
<%
if(editCoordinatorPart)
if(editCoordinatorPart && activePeriod)
{
%>
<html:form action="/user/courseUnitEvaluationController">
258,9 → 287,15
<script>
$( document ).ready(function() {
<%
if(!activePeriod)
{
%>
$("#formEdit :input").attr("disabled", true);
<%
}
if(closed)
{
%>
{
%>
$("#formEdit :input").attr("disabled", true);
<%
}
288,7 → 323,7
</logic:equal>
 
<%
if(closed)
if(closed || (!activePeriod && CourseUnitView.getEvaluationStreamId() !=null ))
{
%>
<%
304,7 → 339,7
}
%>
<%
}
}
%>
 
<table class="dataTable tableDisabled" width="100%">
422,7 → 457,7
<tr>
<td colspan="2">
<%
if(!teacherComplete && !closed && (editCoordinatorPart || editTeacherPart))
if(activePeriod && !teacherComplete && !closed && (editCoordinatorPart || editTeacherPart))
{
%>
 
431,7 → 466,7
<%
}
 
if(!closed && !teacherComplete && editTeacherPart)
if(activePeriod && !closed && !teacherComplete && editTeacherPart)
{
%>
 
441,7 → 476,7
}
 
 
if(!closed && editCoordinatorPart)
if(activePeriod && !closed && editCoordinatorPart)
{
%>
 
/impl/src/web/user/courseunits/courseunit.jsp
1,8 → 1,7
<%@ page import="pt.estgp.estgweb.domain.Teacher" %>
<%@ page import="pt.estgp.estgweb.domain.TeacherImpl" %>
<%@ page import="pt.estgp.estgweb.Globals" %>
<%@ page import="pt.estgp.estgweb.domain.dao.impl.ConfigurationDaoImpl" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
32,6 → 31,17
 
String activeEvaluationYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYearCreateTransaction();
 
IServiceManager sm = ServiceManager.getInstance();
 
String[] names = new String[]{};
Object[] args = new Object[]{CourseUnitView.getCode(), CourseUnitView.getCourseCode()};
 
pt.estgp.estgweb.domain.views.CourseUnitView courseUnitViewInEvaluation = (pt.estgp.estgweb.domain.views.CourseUnitView) sm.execute(RequestUtils.getRequester(request, response), "LoadCourseUnitInEvaluationBySigesCodes", args, names);
if(courseUnitViewInEvaluation != null)
{
request.setAttribute("CourseUnitInEvaluation",courseUnitViewInEvaluation);
}
 
%>
 
<jomm:messages/>
64,11 → 74,11
</p>
<%
}
else
if(courseUnitViewInEvaluation != null)
{
%>
<p>
<label class="WARNING">Atenção o relatório de avaliação deve ser preenchido no ano <%=activeEvaluationYear%> (Entrar no <%=activeEvaluationYear%> pelo menu lateral esquerdo antes de clicar em relatório de avaliação e confirmar no titulo da unidade).</label>
<label class="WARNING">Atenção tem um relatório de avaliação em fase de preenchimento no ano <%=courseUnitViewInEvaluation.getImportYear()%> (Entrar no <%=courseUnitViewInEvaluation.getImportYear()%> pelo menu lateral esquerdo antes de clicar em relatório de avaliação e confirmar no titulo da unidade).</label>
</p>
<%
}
95,15 → 105,23
<html:form styleClass="form" action="/user/courseUnitControllerFromHome" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="update"/>
<html:hidden property="courseUnitView.id"/>
<h2><bean:message key="courseunit.objectives"/></h2>
<p>
<%--<baco:cantManage name="CourseUnitView">--%>
<logic:present name="CourseUnitView" property="objectives">
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="courseunit.objectives"/>
</div>
<div class="panel-body">
<p><logic:present name="CourseUnitView" property="objectives">
${CourseUnitView.formatedObjectives}
</logic:present>
<logic:notPresent name="CourseUnitView" property="objectives">
<bean:message key="courseunit.objectives.not.available"/>
</logic:notPresent>
</logic:notPresent></p>
</div>
</div>
 
<p>
<%--<baco:cantManage name="CourseUnitView">--%>
 
<%--</baco:cantManage>--%>
<%--<baco:canManage name="CourseUnitView">--%>
<%--<html:textarea styleClass="textarea" property="courseUnitView.objectives"/>--%>
203,7 → 221,7
 
<h2><bean:message key="module.Announcements"/></h2>
<logic:notEmpty name="CourseUnitView" property="announcements">
<div class="listCircleWhite">
<%--<div class="listCircleWhite">
<ul>
<logic:iterate id="announcement" name="CourseUnitView" property="announcements" type="pt.estgp.estgweb.domain.views.AnnouncementView">
<li>
213,7 → 231,20
</li>
</logic:iterate>
</ul>
</div>
</div>--%>
<logic:iterate id="announcement" name="CourseUnitView" property="announcements" type="pt.estgp.estgweb.domain.views.AnnouncementView">
<div class="panel panel-default">
<div class="panel-heading">
<html:link action="/user/startLoadAnnouncementFromCourseUnit?id=${announcement.id}">${announcement.title}</html:link>
</div>
<div class="panel-body">
<p>${announcement.formatedText}</p>
</div>
<div class="panel-footer"><bean:message key="from"/>: ${announcement.owner.name} (${announcement.owner.username}) <bean:message key="at"/> ${announcement.formatedSaveDate} </div>
</div>
</logic:iterate>
 
 
</logic:notEmpty>
<logic:empty name="CourseUnitView" property="announcements">
<p><bean:message key="announcement.zero.placed"/></p>
227,49 → 258,65
 
<div class="seccao">
<logic:notEmpty name="CourseUnitView" property="responsableTeacher">
<h2><bean:message key="courseunit.responsable"/></h2>
<table class="dataTable">
<tr>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="email"/></th>
</tr>
<tr>
<td>
${CourseUnitView.responsableTeacher.code}
</td>
<td>
<html:link action="${user}/startLoadTeacherCourseUnit${fromAction}?code=${CourseUnitView.responsableTeacher.code}&courseUnitView.id=${CourseUnitView.id}">${CourseUnitView.responsableTeacher.name}</html:link>
</td>
<td>
${CourseUnitView.responsableTeacher.safeEmail}
</td>
</tr>
</table>
 
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="courseunit.responsable"/>
</div>
<div class="panel-body">
<table class="dataTable">
<tr>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="email"/></th>
</tr>
<tr>
<td>
${CourseUnitView.responsableTeacher.code}
</td>
<td>
<html:link action="${user}/startLoadTeacherCourseUnit${fromAction}?code=${CourseUnitView.responsableTeacher.code}&courseUnitView.id=${CourseUnitView.id}">${CourseUnitView.responsableTeacher.name}</html:link>
</td>
<td>
${CourseUnitView.responsableTeacher.safeEmail}
</td>
</tr>
</table>
</div>
</div>
 
 
 
</logic:notEmpty>
 
<h2><bean:message key="courseunit.teachers"/></h2>
<table class="dataTable">
<tr>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="email"/></th>
</tr>
<div class="panel panel-default">
<div class="panel-heading">
<bean:message key="courseunit.teachers"/>
</div>
<div class="panel-body">
<table class="dataTable tablesorter">
<tr>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="email"/></th>
</tr>
<logic:iterate id="teacher" name="CourseUnitView" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<td>
${teacher.code}
</td>
<td>
<html:link action="${user}/startLoadTeacherCourseUnit${fromAction}?code=${teacher.code}&courseUnitView.id=${CourseUnitView.id}">${teacher.name}</html:link>
</td>
<td>
${teacher.safeEmail}
</td>
</tr>
</logic:iterate>
</table>
</div>
</div>
 
<logic:iterate id="teacher" name="CourseUnitView" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<td>
${teacher.code}
</td>
<td>
<html:link action="${user}/startLoadTeacherCourseUnit${fromAction}?code=${teacher.code}&courseUnitView.id=${CourseUnitView.id}">${teacher.name}</html:link>
</td>
<td>
${teacher.safeEmail}
</td>
</tr>
</logic:iterate>
</table>
</div>
<div class="seccao">
<h2><bean:message key="courseunit.summaries"/></h2>
277,12 → 324,12
<baco:hasRole role="teacher">
<p><a href="<%=request.getContextPath()%>/ftpProxyStream/ionline${CourseUnitView.sumariosPathFileIntranet}">Descarregar PDF</a></p>
<logic:greaterThan value="0" name="CourseUnitView" property="lateSummaries">
<p style="background-color: yellow">Tem <bean:write name="CourseUnitView" property="lateSummaries"/>
<p style="background-color: yellow">Alerta.Tem <bean:write name="CourseUnitView" property="lateSummaries"/>
<logic:equal name="CourseUnitView" property="lateSummaries" value="1">Sumário</logic:equal>
<logic:greaterThan name="CourseUnitView" property="lateSummaries" value="1">Sumários</logic:greaterThan>
por preencher.
lançados pelos serviços que não estão preenchidos e estão abertos há mais de 48 horas. Se este for um falso alerta pedimos desculpa pelo incómodo.
<a target="_blank" href="http://netpa.ipportalegre.pt">Aceda ao NETPA para regularizar</a>
ou ligue para o Sr José Luis para confirmar a situação:</a>
ou entre em contacto com o Sr José Luis para confirmar a situação:</a>
 
</p>
<ul>
/impl/src/web/user/courseunits/menu.jsp
11,6 → 11,8
<%@ page import="pt.estgp.estgweb.Globals" %>
<%@ page import="pt.estgp.estgweb.utils.ConfigManager" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.domain.CourseUnit" %>
<%@ page import="pt.estgp.estgweb.domain.views.CourseUnitView" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
18,15 → 20,19
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<%
 
<%
String activeEvaluationYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYearCreateTransaction();
try{
if (request.getAttribute("BlogView") != null)
{
BlogView bV = (BlogView) request.getAttribute("BlogView");
request.setAttribute("CourseUnitView",bV.getCourseUnitView());
}
 
boolean activePeriod =
DaoFactory.getConfigurationDaoImpl().isCourseUniEvaluationActivePeriodInTransaction(CourseUnitView.getId());
%>
 
 
48,8 → 54,7
%>
 
 
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
 
<div class="linkMenuBlock">
<div class="linkMenuBlockTitle"><bean:message key="courseunit.menu.unit"/></div>
<div class="linkLeftMenu">
83,7 → 88,7
<li style="vertical-align: middle">
<html:link action="/user/startLoadCourseUnitEvaluation.do?courseUnitId=${CourseUnitView.id}"><bean:message key="courseunit.menu.evaluation"/>
<%
if(activeEvaluationYear != null && activeEvaluationYear.equals(CourseUnitView.getImportYear()))
if(activePeriod && !CourseUnitView.isValidEvaluation())
{
%>
<img src="<%=request.getContextPath()%>/imgs/preencher.gif" width="35px"/>
186,11 → 191,19
 
 
<%
 
 
IServiceManager sm = ServiceManager.getInstance();
 
String[] names = new String[]{};
Object[] args = new Object[]{CourseUnitView.getCode(), CourseUnitView.getCourseCode()};
 
pt.estgp.estgweb.domain.views.CourseUnitView courseUnitViewInEvaluation = (pt.estgp.estgweb.domain.views.CourseUnitView) sm.execute(RequestUtils.getRequester(request, response), "LoadCourseUnitInEvaluationBySigesCodes", args, names);
 
 
names = new String[]{};
args = new Object[]{CourseUnitView.getCode(), CourseUnitView.getCourseCode()};
 
List<pt.estgp.estgweb.domain.views.CourseUnitView> courseUnitViews = (List<pt.estgp.estgweb.domain.views.CourseUnitView>) sm.execute(RequestUtils.getRequester(request, response), "LoadCourseUnitsBySigesCodes", args, names);
if(courseUnitViews.size() > 1)
{
213,16 → 226,29
}
%>
</div>
<%
 
%>
<div class="linkLeftMenu">
<div class="listClean">
<ul>
<logic:iterate id="item" name="OldUnits">
<logic:iterate id="item" name="OldUnits" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<li>
<logic:equal value="${CourseUnitView.id}" name="item" property="id">
&gt;${item.importYear}
</logic:equal>
<logic:notEqual value="${CourseUnitView.id}" name="item" property="id">
<html:link action="${user}/startLoadCourseUnit${fromAction}?courseUnitView.id=${item.id}">${item.importYear}</html:link>
<html:link action="${user}/startLoadCourseUnit${fromAction}?courseUnitView.id=${item.id}">
${item.importYear}
<%
if(courseUnitViewInEvaluation !=null && courseUnitViewInEvaluation.getId()==item.getId())
{
%>
<img src="<%=request.getContextPath()%>/imgs/preencher.gif" width="35px"/>
<%
}
%>
</html:link>
</logic:notEqual>
 
</li>
/impl/src/web/user/home/teacher.jsp
149,8 → 149,8
try{
HibernateUtils.getCurrentSession().beginTransaction();
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
if(activeYear != null)
{
List<String> activeDegrees = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveDegrees();
 
List<CourseUnit> evaluations = DaoFactory.getCourseUnitDaoImpl().loadTeacherUnitsMissingEvaluation(UserSession);
List<CourseUnit> programs = DaoFactory.getCourseUnitDaoImpl().loadMissingPrograms(UserSession.getUser().getId());
if(programs != null && programs.size() > 0 || evaluations!= null && evaluations.size() > 0)
184,7 → 184,28
if(evaluations != null && evaluations.size() > 0)
{
%>
<div class="panel-body-h1">Relatórios de avaliação por preencher/entregar</div>
<div class="panel-body-h1">Relatórios de avaliação por preencher/entregar
<%
if(activeDegrees != null)
{
%>
(graus em processo de validação:
<%
String sep = "";
for(String activeDegree: activeDegrees)
{
%>
<%=sep + MessageResources.getInstance(request).getMessage("course."+activeDegree)%>
<%
sep = ", ";
}
%>
)
<%
}
%>
 
</div>
<ul>
<%
for(CourseUnit cu: evaluations)
203,7 → 224,7
</div>
<%
}
}
 
HibernateUtils.getCurrentSession().getTransaction().commit();
}catch(Throwable e)
{
218,8 → 239,8
try{
HibernateUtils.getCurrentSession().beginTransaction();
String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
if(activeYear != null)
{
List<String> activeDegrees = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveDegrees();
 
List<CourseUnitDaoImpl.CourseMissingValidationProgram> result0 = DaoFactory.getCourseUnitDaoImpl().loadMissingPrograms(UserSession);
List<CourseUnitDaoImpl.CourseMissingValidationProgram> result1 = DaoFactory.getCourseUnitDaoImpl().loadMissingProgramValidate(UserSession);
List<CourseUnitDaoImpl.CourseMissingValidationEvaluation> result2 = DaoFactory.getCourseUnitDaoImpl().loadMissingEvaluationValidate(UserSession);
287,7 → 308,27
 
%>
 
<div class="panel-body-h1">Relatórios de avaliação por validar</div>
<div class="panel-body-h1">Relatórios de avaliação por validar
<%
String sep = "";
if(activeDegrees != null)
{
%>
(graus em processo de validação:
<%
for(String activeDegree: activeDegrees)
{
%>
<%=sep + MessageResources.getInstance(request).getMessage("course."+activeDegree)%>
<%
sep = ", ";
}
%>
)
<%
}
%>
</div>
 
<%
for(CourseUnitDaoImpl.CourseMissingValidationEvaluation mis:result2)
301,7 → 342,7
for(CourseUnit cu: mis.courseUnits)
{
%>
<li><a href="<%=request.getContextPath()%>/user/startLoadCourseUnitEvaluation.do?courseUnitId=<%=cu.getId()%>"><%=cu.getImportYear()%> / <%=cu.getName()%> / <%=cu.getCode()%></a></li>
<li><a href="<%=request.getContextPath()%>/user/startLoadCourseUnitEvaluation.do?courseUnitId=<%=cu.getId()%>"><%=cu.getName()%> / <%=cu.getCode()%></a></li>
<%
}
%>
323,7 → 364,27
 
%>
 
<div class="panel-body-h1">Relatórios de avaliação ainda não preenchidos</div>
<div class="panel-body-h1">Relatórios de avaliação ainda não preenchidos
<%
String sep = "";
if(activeDegrees != null)
{
%>
(graus em processo de validação:
<%
for(String activeDegree: activeDegrees)
{
%>
<%=sep + MessageResources.getInstance(request).getMessage("course."+activeDegree)%>
<%
sep = ",";
}
%>
)
<%
}
%>
</div>
 
<%
for(CourseUnitDaoImpl.CourseMissingValidationEvaluation mis:result3)
337,7 → 398,7
for(CourseUnit cu: mis.courseUnits)
{
%>
<li><a href="<%=request.getContextPath()%>/user/startLoadCourseUnitEvaluation.do?courseUnitId=<%=cu.getId()%>"><%=cu.getImportYear()%> / <%=cu.getName()%> / <%=cu.getCode()%></a></li>
<li><a href="<%=request.getContextPath()%>/user/startLoadCourseUnitEvaluation.do?courseUnitId=<%=cu.getId()%>"><%=cu.getName()%> / <%=cu.getCode()%></a></li>
<%
}
%>
357,7 → 418,7
</div>
<%
}
}
 
HibernateUtils.getCurrentSession().getTransaction().commit();
}catch(Throwable e)
{
/impl/src/web/user/serviceZone/topnavConfigurationTasks.jsp
New file
0,0 → 1,10
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "configuration.tasks");
%>
<jsp:include page="/layout/topnav.jsp"/>
Property changes:
Added: svn:executable
+ *
/impl/src/web/user/serviceZone/topnavConfigurationTaskLog.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace("/user/configurationSchedulleTasks.do", "configuration.tasks");
topNav.addNavPlace(null, "configuration.taskLog");
%>
<jsp:include page="/layout/topnav.jsp"/>
Property changes:
Added: svn:executable
+ *
/impl/src/web/user/serviceZone/serviceZone.jsp
74,19 → 74,20
<div class="head">
<bean:message key="intranet.services"/>
</div>
<ul>
 
<ul>
<li><bean:message key="configuration"/>
 
<ul>
<li><a href="<%=request.getContextPath()%>/user/configurationGrades.do"><bean:message key="configuration.grades"/></a></li>
<li><a href="<%=request.getContextPath()%>/user/configurationDirectories.do"><bean:message key="configuration.directories"/></a></li>
<baco:hasRole role="admin,services,all">
<ul>
<li><bean:message key="configuration"/>
 
</ul>
</li>
</ul>
 
<ul>
<li><a href="<%=request.getContextPath()%>/user/configurationGrades.do"><bean:message key="configuration.grades"/></a></li>
<li><a href="<%=request.getContextPath()%>/user/configurationDirectories.do"><bean:message key="configuration.directories"/></a></li>
<li><a href="<%=request.getContextPath()%>/user/configurationSchedulleTasks.do"><bean:message key="configuration.tasks"/></a></li>
</ul>
</li>
</ul>
</baco:hasRole>
<baco:isModuleOn module="processes">
 
<ul>
/impl/src/web/user/serviceZone/topnavConfigurationJobTasks.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace("/user/configurationSchedulleTasks.do", "configuration.tasks");
topNav.addNavPlace(null, "configuration.jobtasks");
%>
<jsp:include page="/layout/topnav.jsp"/>
Property changes:
Added: svn:executable
+ *
/impl/src/web/user/serviceZone/topnavConfigurationTaskLogFromJobTasks.jsp
New file
0,0 → 1,12
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace("/user/configurationSchedulleTasks.do", "configuration.tasks");
topNav.addNavPlace("/user/configurationJobTasks.do", "configuration.jobtasks");
topNav.addNavPlace(null, "configuration.taskLog");
%>
<jsp:include page="/layout/topnav.jsp"/>
Property changes:
Added: svn:executable
+ *
/impl/src/web/user/serviceZone/topnavConfigurationTask.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace("/user/configurationSchedulleTasks.do", "configuration.tasks");
topNav.addNavPlace(null, "configuration.task");
%>
<jsp:include page="/layout/topnav.jsp"/>
Property changes:
Added: svn:executable
+ *
/impl/build.xml
476,6 → 476,7
classpathref="pathToToolsLib" classpath="${build.dir.classes}"/>
 
 
 
<target name="generateHibernateSql" depends="build">
<schemaexport
properties="${jdbc.properties.build}/${jdbc.properties.filename}"
/common/json/genson-0.97.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream