Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1069 → Rev 1081

/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,14 → 502,59
directories.saved=Operação salva com sucesso
 
 
##TAREFAS AGENDADAS
 
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
 
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.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 → 576,21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/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,8
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
##ESTA CONFIGURACAO ESTA FUNCIONAL
## Ver nos Ficheiros FtpService metodo run
## Ver LayoutController
137,14 → 140,12
## 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
grupos.use.default.credentials.to.updates.and.deletes=false
 
/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,32
</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>
 
 
 
</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/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);
233,6 → 232,8
return logMessages;
}
 
 
 
/**
* Envio de Notificação aos operadores do CI
* @param subject
485,10 → 486,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,38
package pt.estgp.estgweb.services.jobs;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.JobServiceTaskImpl;
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;
 
/**
* 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("JobServiceTaskLog");
 
 
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;
}
}
 
/impl/src/java/pt/estgp/estgweb/services/jobs/JobScheduleService.java
106,6 → 106,9
public static void main(String[] args) throws SQLException
{
AbstractDao.getCurrentSession().beginTransaction();
scheduleImportSummaries();
scheduleImportTeachers();
scheduleImportCourses();
scheduleImportStudents();
AbstractDao.getCurrentSession().getTransaction().commit();
}
130,10 → 133,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 → 145,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 → 184,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 → 196,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 → 212,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Sumaries");
jobServiceTaskScheduler.setDescription("Sumarios");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
226,7 → 231,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 → 246,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Courses");
jobServiceTaskScheduler.setDescription("Cursos");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
261,9 → 267,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 → 283,7
}
};
sess.setUser(u);
jobServiceTaskScheduler.setDescription("TESTE Students");
jobServiceTaskScheduler.setDescription("Estudantes");
new JobScheduleService().createOrUpdateScheduleServiceTask(jobServiceTaskScheduler,sess);
 
}
294,9 → 302,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 → 318,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,8
jobServiceTask.setRequestStop(false);
jobServiceTask.setOwner(schedule.getCreatedBy());
jobServiceTask.setJobHandler(new SerializableNullJobHandler());
DaoFactory.getJobServiceTaskDaoImpl().save(jobServiceTask);
schedule.setLastJobServiceTask(jobServiceTask);
try {
String filePath = Class.forName(schedule.getTargetService()).getSimpleName() + "-" + DatesUtils.getFormatedFileSystem(new Date());
jobServiceTask.setLogFilePath( filePath + ".log");
140,10 → 140,10
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
/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/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/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/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/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/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,378
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.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
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("ci"))
{
return mapping.findForward("error401");
}
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
{
 
if(!UserSessionProxy.loadUserSessionFromRequest(request).getUser().isAdmin() && !UserSessionProxy.loadUserSessionFromRequest(request).getUser().hasRole("ci"))
{
return mapping.findForward("error401");
}
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 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,138
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.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;
 
/**
* 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 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/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>
72,8 → 72,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 → 94,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 == "PENDDING")
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 id="myTable" class="tablesorter">
<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,114
<%@ 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/>
 
 
<!--<jsp:include page="/layout/scriptsBootstrapSoft.jsp"/>-->
 
<%
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"/>
<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>
</div>
<div class="panel-body">
<table id="myTable" class="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>
<logic:notEmpty name="task" property="lastJobServiceTask">
<a 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>
 
 
</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.jobtask"/></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