Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 207 → Rev 211

/impl/conf/language/MessageResources.properties
129,7 → 129,9
deactivate=Desactivar
manage=Gerir
replace=Substituir
work=Trabalho
 
 
#Menus Portais
portal.orgaos=Orgãos
portal.conselho.pedagogico=Conselho Pedagógico
/impl/conf/language/MessageResourcesCourseUnits.properties
4,9 → 4,10
#
################################################################################
module.CourseUnits=Unidades Curriculares
course=Curso ({0})
courseunit=Unidade Curricular ({0})
course={0} &gt
courseunit={0}
 
courseunit.teachers=Corpo Docente
courseunit.objectives=Objectivos da Unidade
courseunit.programfilepath=Programa Curricular
courseunit.programfilepath.not.available=O Programa Curricular não está disponivel
18,7 → 19,7
courseunit.program.todo=Upload do programa da unidade
courseunit.question.todo=Dúvida
courseunit.assignement.todo=Trabalho por entregar
course.unit.works=(Trabalhos)
course.unit.works=Trabalhos
courseunit.works=Trabalhos
courseunit.new=Criar Unidade Curricular
courseunit.edit=Editar Unidade Curricular
37,9 → 38,13
 
courseunit.assignement=Trabalho: {0}
 
courseunit.assignement.delivered.date=Data de Entrega
courseunit.assignement.deliver.date=Data Limite de Entrega
courseunit.assignement.deliver.type=Tipo de entrega
courseunit.assignement.deliver.type.zipfile=Ficheiro Comprimido (ZIP)
courseunit.assignement.deliver.grade=Nota
courseunit.assignement.deliver.show.obs=Adicionar observações
courseunit.assignement.deliver.obs=obs
courseunit.assignement.deliver.type.nofile=Entrega não controlada pelo sistema
courseunit.assignement.deliver.late.permission=Permitir entregas atrasadas
courseunit.assignement.delivers=Número de Entregas
50,13 → 55,25
courseunit.assignement.deliver.sucess=Trabalho {0} entregue com sucesso
errors.courseunit.assignement.deliver.file=O Ficheiro que escolheu não existe ou estão vazio
errors.courseunit.assignement.deliver.zip=Por favor escolha um ficheiro comprimido em formato ZIP
errors.courseunit.assignement.file.type=Por favor escolha um ficheiro comprimido em formato ZIP
courseunit.students=Estudantes
 
courseunit.assignement.deliver.time=Entregue
courseunit.assignement.deliver.time.ok=Entregue a Horas
courseunit.assignement.deliver.time.late=Entrega atrasada
courseunit.assignement.deliver.time.no=Por Entregar
 
courseunit.menu.home=Inicio
courseunit.menu.put.question=Colocar dúvida
courseunit.menu.assignements=Trabalhos
courseunit.menu.blog=Blog da Unidade
courseunit.menu.presences=Presenças
courseunit.menu.contents=Conteúdos
courseunit.menu.grades=Avaliação
 
replace=Substituir
 
courseunit.assignement.file=Enunciado
 
 
 
93,3 → 110,6
 
 
 
 
 
 
/impl/conf/WEB-INF/struts/struts-blog.xml
90,5 → 90,29
<forward name="from.add.role" path="page.submit.blog.from.serviceZone"/>
</action>
 
 
<action path="/user/startAddPostFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=addPost&amp;from=CourseUnit"/>
<action path="/user/startEditPostFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=editPost&amp;from=CourseUnit"/>
<action path="/user/startDeletePostFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=deletePost&amp;from=CourseUnit"/>
<action path="/user/startValidatePostFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=validatePost&amp;from=CourseUnit"/>
 
<action path="/user/startSubmitBlogFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=start&amp;from=CourseUnit"/>
<action path="/user/startDeleteBlogFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=delete&amp;from=CourseUnit"/>
<action path="/user/startEditBlogFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=edit&amp;from=CourseUnit"/>
<action path="/user/startLoadBlogFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=load&amp;from=CourseUnit"/>
<action path="/user/startLoadBlogMonthFromCourseUnit" forward="/user/blogsControllerFromCourseUnit.do?dispatch=loadMonth&amp;from=CourseUnit"/>
<action path="/user/blogsControllerFromCourseUnit"
type="pt.estgp.estgweb.web.controllers.blogs.BlogsController"
name="BlogForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.separators.home">
<forward name="load" path="page.load.blog.from.courseUnit"/>
<forward name="submit" path="page.submit.blog.from.courseUnit"/>
<forward name="loadMonth" path="page.load.blog.month.from.courseUnit"/>
<forward name="from.add.role" path="page.submit.blog.from.courseUnit"/>
</action>
 
</action-mappings>
</struts-config>
/impl/conf/WEB-INF/struts/struts-courseunits.xml
38,12 → 38,14
</action>
 
<!--<action path="/user/startLoadCourseUnitFromHome" forward="page.load.courseunit.from.home"/>-->
startLoadCourseUnitAssignementFromHome
 
<action path="/user/startCourseUnitBlogFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=startBlog&amp;from=CourseUnit"/>
<action path="/user/startLoadCourseUnitAssignementFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=loadAssignement&amp;from=Home"/>
<action path="/user/startValidateInvalidateCourseUnitWorksFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=validateInvalidateAssignement&amp;from=Home"/>
<action path="/user/startDeleteCourseUnitWorksFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=deleteAssignement&amp;from=Home"/>
<action path="/user/startEditCourseUnitWorksFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=editAssignement&amp;from=Home"/>
<action path="/user/startLoadCourseUnitWorksFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=loadWorks&amp;from=Home"/>
<action path="/user/startLoadCourseUnitStudentsFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=loadStudents&amp;from=Home"/>
<action path="/user/startLoadCourseUnitFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=load&amp;from=Home"/>
<action path="/user/courseUnitControllerFromHome"
type="pt.estgp.estgweb.web.controllers.courseunits.CourseUnitsController"
55,6 → 57,8
<forward name="load" path="page.load.courseunit.from.home"/>
<forward name="load.works" path="page.load.courseunit.works.from.home"/>
<forward name="load.assignement" path="page.load.courseunit.assignement.from.home"/>
<forward name="load.blog" path="page.load.blog.from.courseUnit"/>
<forward name="load.students" path="page.load.courseunit.students.from.home"/>
<forward name="submit" path="page.submit.courseunit.from.home"/>
</action>
 
/impl/conf/WEB-INF/struts/tiles-courseunits.xml
44,12 → 44,40
<put name="left" value="/user/courseunits/menu.jsp"/>
<put name="body" value="/user/courseunits/courseunitassignement.jsp"/>
</definition>
<definition name="page.load.courseunit.students.from.home" extends="page.separators.home">
<put name="title" value="Alunos Inscritos da Unidade Curricular"/>
<put name="topnav" value="/user/home/topnavCourseUnitStudents.jsp"/>
<put name="left" value="/user/courseunits/menu.jsp"/>
<put name="body" value="/user/courseunits/students.jsp"/>
</definition>
 
 
 
 
<definition name="page.submit.blog.from.courseUnit" extends="page.separators.home">
<put name="title" value="Blog da Unidade Curricular"/>
<put name="topnav" value="/user/courseunits/topnavCreateBlog.jsp"/>
<put name="left" value="/user/courseunits/menu.jsp"/>
<put name="body" value="/user/courseunits/submitBlog.jsp"/>
</definition>
<definition name="page.load.blog.from.courseUnit" extends="page.separators.home">
<put name="title" value="Blog da Unidade Curricular"/>
<put name="topnav" value="/user/courseunits/topnavLoadBlog.jsp"/>
<put name="left" value="/user/courseunits/menu.jsp"/>
<put name="body" value="/user/courseunits/blog.jsp"/>
</definition>
<definition name="page.load.blog.month.from.courseUnit" extends="page.separators.home">
<put name="title" value="Blog da Unidade Curricular"/>
<put name="topnav" value="/user/courseunits/topnavLoadBlogMonth.jsp"/>
<put name="left" value="/user/courseunits/menu.jsp"/>
<put name="body" value="/user/courseunits/blog.jsp"/>
</definition>
 
 
 
 
 
 
<!--Administrative pages-->
 
<definition name="page.submit.courseunit.admin.from.service.zone" extends="page.separators.serviceZone">
/impl/conf/WEB-INF/struts/tiles-blog.xml
12,13 → 12,11
<put name="topnav" value="/admin/blogs/topnavCreateBlog.jsp"/>
<put name="body" value="/admin/blogs/submitBlog.jsp"/>
</definition>
 
<definition name="page.load.blog" extends="base.layout1">
<put name="title" value="Blog"/>
<put name="topnav" value="/public/blogs/topnavLoadBlog.jsp"/>
<put name="body" value="/public/blogs/blog.jsp"/>
</definition>
 
<definition name="page.load.blog.month" extends="base.layout1">
<put name="title" value="Blog"/>
<put name="body" value="/public/blogs/blog.jsp"/>
31,11 → 29,6
<put name="topnav" value="/user/home/topnavCreateBlog.jsp"/>
<put name="body" value="/admin/blogs/submitBlog.jsp"/>
</definition>
<definition name="page.submit.blog.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Submit Blog"/>
<put name="topnav" value="/user/serviceZone/topnavCreateBlog.jsp"/>
<put name="body" value="/admin/blogs/submitBlog.jsp"/>
</definition>
<definition name="page.load.blog.from.home" extends="page.separators.home">
<put name="title" value="Load Blog"/>
<put name="topnav" value="/user/home/topnavLoadBlog.jsp"/>
46,6 → 39,13
<put name="topnav" value="/user/home/topnavLoadBlogMonth.jsp"/>
<put name="body" value="/public/blogs/blog.jsp"/>
</definition>
 
 
<definition name="page.submit.blog.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Submit Blog"/>
<put name="topnav" value="/user/serviceZone/topnavCreateBlog.jsp"/>
<put name="body" value="/admin/blogs/submitBlog.jsp"/>
</definition>
<definition name="page.load.blog.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Load Blog"/>
<put name="topnav" value="/user/serviceZone/topnavLoadBlog.jsp"/>
/impl/conf/log4j.properties
20,7 → 20,11
log4j.appender.hibernate.sessionServiceClass=HibernateHelper
log4j.appender.hibernate.loggingEventClass=LogEvent
 
# suppress warnings from the SessionImpl (like Narrowing proxy to class com.atlassian.confluence.pages.Page - this operation breaks ==)
log4j.logger.org.hibernate.engine.StatefulPersistenceContext.ProxyWarnLog=ERROR
log4j.additivity.org.hibernate.engine.StatefulPersistenceContext.ProxyWarnLog=false
 
 
#default category
log4j.rootLogger = info, defaultLog, stdout
 
/impl/conf/berserk/sd.xml
670,6 → 670,17
</filterChains>
</service>
<service>
<name>StartCourseUnitBlog</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CourseUnitBlogService</implementationClass>
<description>start course unit blog creating if don't exist</description>
<isTransactional>true</isTransactional>
<defaultMethod>startUnitBlog</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
</filterChains>
</service>
<service>
<name>DeliverCourseUnitWork</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CourseUnitWorkService</implementationClass>
<description>Load course unit works</description>
682,6 → 693,18
</filterChains>
</service>
<service>
<name>UpdateCourseUnitDeliverables</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CourseUnitWorkService</implementationClass>
<description>update deliverables with grade and observations</description>
<isTransactional>true</isTransactional>
<defaultMethod>updateDeliverables</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="OwnerCourseUnit"/>
</filterChains>
</service>
<service>
<name>ValidateInvalidateCourseUnitWork</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CourseUnitWorkService</implementationClass>
<description>Load course unit works</description>
/impl/conf/berserk/fd.xml
167,4 → 167,10
<description>Check if a resource can be loaded</description>
<isTransactional>false</isTransactional>
</filter>
<filter>
<name>ResourceAccessControlCourseUnit</name>
<implementationClass>pt.estgp.estgweb.filters.filters.ResourceAccessControlCourseUnitFilter</implementationClass>
<description>Check if a resource can be loaded</description>
<isTransactional>false</isTransactional>
</filter>
</filterDefinitions>
/impl/conf/berserk/fcd.xml
268,7 → 268,12
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>
</filterChain>
<!--<filterChain>-->
<!--<name>InternalCourseUnitBlog</name>-->
<!--<expression>!(BooleanCheck("serializable","pt.estgp.estgweb.domain.CourseUnitImpl","unitBlog.courseUnitInternal")) || ResourceAccessControlCourseUnit</expression>-->
<!--<description>Check if the the boolean is true</description>-->
<!--<invocationTiming>1</invocationTiming>-->
<!--<filterClass>pt.estgp.estgweb.filters.chains.LoadControlFilter</filterClass>-->
<!--</filterChain>-->
 
 
 
</filterChainsDefinitions>
/impl/src/java/jomm/utils/DiacriticFilter.java
New file
0,0 → 1,123
 
package clef;
 
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Token;
 
import java.io.*;
 
 
/**
* Normalizes token text to lower case.
*
* @version $Id: DiacriticFilter.java,v 1.2 2007/12/27 01:45:58 jmachado Exp $
*/
public final class DiacriticFilter extends TokenFilter
{
public DiacriticFilter(TokenStream in)
{
super(in);
}
 
public final Token next() throws IOException
{
Token t = input.next();
 
if (t == null)
return null;
String value = t.termText();
return new Token(clean(value),t.startOffset(),t.endOffset());
}
 
public static String clean(String value)
{
StringBuilder finalTerm = new StringBuilder();
for (int j=0 ; j < value.length() ; j++)
{
char c = value.charAt(j);
switch(c)
{
case 131: c = 'f'; break;
case 138: c = 'S'; break;
case 140: c = 'E'; break;
case 154: c = 'S'; break;
case 156: c = 'e'; break;
case 159: c = 'Y'; break;
case 167: c = 'S'; break;
case 169: c = 'c'; break;
case 192: c = 'A'; break;
case 193: c = 'A'; break;
case 194: c = 'A'; break;
case 195: c = 'A'; break;
case 196: c = 'A'; break;
case 197: c = 'A'; break;
case 198: c = 'A'; break;
case 199: c = 'C'; break;
case 200: c = 'E'; break;
case 201: c = 'E'; break;
case 202: c = 'E'; break;
case 203: c = 'E'; break;
case 204: c = 'I'; break;
case 205: c = 'I'; break;
case 206: c = 'I'; break;
case 207: c = 'I'; break;
case 208: c = 'D'; break;
case 209: c = 'N'; break;
case 210: c = 'O'; break;
case 211: c = 'O'; break;
case 212: c = 'O'; break;
case 213: c = 'O'; break;
case 214: c = 'O'; break;
case 215: c = 'X'; break;
case 216: c = 'O'; break;
case 217: c = 'U'; break;
case 218: c = 'U'; break;
case 219: c = 'U'; break;
case 220: c = 'U'; break;
case 221: c = 'Y'; break;
case 222: c = 'P'; break;
case 223: c = 'B'; break;
case 224: c = 'a'; break;
case 225: c = 'a'; break;
case 226: c = 'a'; break;
case 227: c = 'a'; break;
case 228: c = 'a'; break;
case 229: c = 'a'; break;
case 230: c = 'a'; break;
case 231: c = 'c'; break;
case 232: c = 'e'; break;
case 233: c = 'e'; break;
case 234: c = 'e'; break;
case 235: c = 'e'; break;
case 236: c = 'i'; break;
case 237: c = 'i'; break;
case 238: c = 'i'; break;
case 239: c = 'i'; break;
case 240: c = 'o'; break;
case 241: c = 'n'; break;
case 242: c = 'o'; break;
case 243: c = 'o'; break;
case 244: c = 'o'; break;
case 245: c = 'o'; break;
case 246: c = 'o'; break;
case 247: break;
case 248: c = 'o'; break;
case 249: c = 'u'; break;
case 250: c = 'u'; break;
case 251: c = 'u'; break;
case 252: c = 'u'; break;
case 253: c = 'y'; break;
case 254: c = 'p'; break;
}
finalTerm.append(c);
}
return finalTerm.toString();
}
 
public static void main(String args[])
{
for(int i = 0; i < 255;i++)
System.out.println(i + ":" + (char)i);
}
}
/impl/src/java/jomm/dao/impl/AbstractDao.java
26,7 → 26,7
public abstract class AbstractDao<CLAZZ> implements IDomainObjectDao<CLAZZ>
{
 
 
/**
* Return the number of results that match the given criteria.
*
55,9 → 55,9
public CLAZZ getLast(String maxField)
{
List<CLAZZ> objs = createCriteria()
.addOrder( Order.desc(maxField) )
.setMaxResults(1)
.list();
.addOrder( Order.desc(maxField) )
.setMaxResults(1)
.list();
if(objs != null && objs.size() > 0)
return objs.get(0);
else
107,18 → 107,18
 
}
public static void commit() {
try
{
getCurrentSession().connection().commit();
}
catch (HibernateException e)
{
throw new DaoException(e);
}
catch (SQLException e)
{
throw new DaoException(e);
}
try
{
getCurrentSession().connection().commit();
}
catch (HibernateException e)
{
throw new DaoException(e);
}
catch (SQLException e)
{
throw new DaoException(e);
}
}
 
 
184,7 → 184,7
 
/**
* Create an SQLQuery based on the given query string.
*
*
* @param queryString an SQL query
* @return an SQLQuery
*/
225,12 → 225,12
throw new DaoException(e);
}
}
 
/**
* Returns results as a page.
*
*
* Finds "sizeOfPage" objects, starting from the page "pageIndex".
*
*
* @param pageIndex page number
* @param sizeOfPage results in page
* @return persistent objects
243,10 → 243,10
try
{
Criteria criteria = createCriteria();
 
criteria.setFirstResult(pageIndex * sizeOfPage);
criteria.setMaxResults(sizeOfPage);
 
return criteria.list();
}
catch (HibernateException e)
278,10 → 278,106
*
* @SuppressWarnings("unchecked")
*/
public static Object load( Class cl, Serializable dbKey) {
try
{
Object c = getCurrentSession().load(cl, dbKey);
if(c!=null && !((DomainObject)c).getReferenceClass().getName().equals(cl.getName()))
{
Class cC = ((DomainObject)c).getReferenceClass();
return getCurrentSession().load(cC,dbKey);
}
return c;
}
catch (HibernateException e)
{
throw new DaoException(e);
}
}
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @SuppressWarnings("unchecked")
*/
public static Object get( Class cl, Serializable dbKey) {
try
{
Object c = getCurrentSession().get(cl, dbKey);
if(c!=null && !((DomainObject)c).getReferenceClass().getName().equals(cl.getName()))
{
Class cC = ((DomainObject)c).getReferenceClass();
return getCurrentSession().get(cC,dbKey);
}
return c;
}
catch (HibernateException e)
{
throw new DaoException(e);
}
}
 
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @SuppressWarnings("unchecked")
*/
public static Object load( String cl, Serializable dbKey) {
try
{
Object c = getCurrentSession().load(cl, dbKey);
if(c!=null && !((DomainObject)c).getReferenceClass().getName().equals(cl))
{
Class cC = ((DomainObject)c).getReferenceClass();
return getCurrentSession().load(cC,dbKey);
}
return c;
}
catch (HibernateException e)
{
throw new DaoException(e);
}
}
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @SuppressWarnings("unchecked")
*/
public static Object get( String cl, Serializable dbKey) {
try
{
Object c = getCurrentSession().get(cl, dbKey);
if(c!=null && !((DomainObject)c).getReferenceClass().getName().equals(cl))
{
Class cC = ((DomainObject)c).getReferenceClass();
return getCurrentSession().get(cC,dbKey);
}
return c;
}
catch (HibernateException e)
{
throw new DaoException(e);
}
}
 
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @SuppressWarnings("unchecked")
*/
public final CLAZZ load(Serializable dbKey) {
try
{
return (CLAZZ) getCurrentSession().load(getReferenceClass(), dbKey);
CLAZZ c = (CLAZZ) getCurrentSession().load(getReferenceClass(), dbKey);
if(c != null && !((DomainObject)c).getReferenceClass().getName().equals(getReferenceClass().getName()))
{
Class cC = ((DomainObject)c).getReferenceClass();
return (CLAZZ) getCurrentSession().load(cC,dbKey);
}
return c;
}
catch (HibernateException e)
{
337,14 → 433,14
{
return loadOrNullLockWrite("id",dbKey);
}
/**
/**
* Used by the base DAO classes but here for your modification Load object
* matching the given key and return it.
*
* @SuppressWarnings("unchecked")
*/
public CLAZZ loadOrNullLockWrite(String field, Serializable dbKey)
{
{
try
{
return (CLAZZ) createCriteria().add(eq(field,dbKey)).uniqueResult();
384,7 → 480,13
*/
public final CLAZZ get(Serializable dbKey) {
try {
return (CLAZZ) getCurrentSession().get(getReferenceClass(), dbKey);
CLAZZ c = (CLAZZ) getCurrentSession().get(getReferenceClass(), dbKey);
if(c!=null && !((DomainObject)c).getReferenceClass().getName().equals(getReferenceClass().getName()))
{
Class cC = ((DomainObject)c).getReferenceClass();
return (CLAZZ) getCurrentSession().get(cC,dbKey);
}
return c;
}
catch (HibernateException e) {
throw new DaoException(e);
399,7 → 501,7
* using the current value of the identifier property if the assigned
* generator is used.)
*/
public Serializable save(CLAZZ obj)
public Serializable save(CLAZZ obj)
{
try {
DomainObject o = (DomainObject) obj;
431,9 → 533,9
 
/**
* Saves a collection of objects without returning the DbKey.
*
*
* To obtain the DbKey, use the object itself.
*
*
* @param objs List of objects to save
*/
public final void save(Collection<CLAZZ> objs)
612,7 → 714,7
 
/**
* Deletes a collection of objects.
*
*
* @param objs Objects to delete
*/
public final void delete(Collection<CLAZZ> objs)
704,7 → 806,7
 
if (pageSize >= 0 && pageSize < count) {
return criteria.setFirstResult(pageSize * pageNumber)
.setMaxResults(pageSize);
.setMaxResults(pageSize);
}
 
return criteria;
/impl/src/java/pt/estgp/estgweb/services/courseunits/UsersUnitsService.java
32,7 → 32,7
t.getId();
courseUnit.getTeachers().remove(t);
courseUnit.getTeachers().add(t);
return loadCourseUnitService.run(courseUnitId,true,true,userSession);
return loadCourseUnitService.run(courseUnitId,true,true,false,userSession);
}
 
public CourseUnitView removeTeacher(long teacherId,long courseUnitId, UserSession userSession) throws ServiceException
40,16 → 40,16
CourseUnit courseUnit = DaoFactory.getCourseUnitDaoImpl().get(courseUnitId);
TeacherImpl t = (TeacherImpl) DaoFactory.getTeacherDaoImpl().get(teacherId);
courseUnit.getTeachers().remove(t);
return loadCourseUnitService.run(courseUnitId,true,true,userSession);
return loadCourseUnitService.run(courseUnitId,true,true,false,userSession);
}
 
public CourseUnitView addStudent(int code,long courseUnitId, UserSession userSession) throws ServiceException
public CourseUnitView addStudent(int code, long courseUnitId, UserSession userSession) throws ServiceException
{
CourseUnit courseUnit = DaoFactory.getCourseUnitDaoImpl().get(courseUnitId);
StudentImpl s = (StudentImpl) DaoFactory.getStudentDaoImpl().loadBySigesCode(code);
courseUnit.getStudents().remove(s);
courseUnit.getStudents().add(s);
return loadCourseUnitService.run(courseUnitId,true,true,userSession);
return loadCourseUnitService.run(courseUnitId,true,true,false,userSession);
}
 
public CourseUnitView removeStudent(int code,long courseUnitId, UserSession userSession) throws ServiceException
57,6 → 57,6
CourseUnit courseUnit = DaoFactory.getCourseUnitDaoImpl().get(courseUnitId);
StudentImpl s = (StudentImpl) DaoFactory.getStudentDaoImpl().loadBySigesCode(code);
courseUnit.getStudents().remove(s);
return loadCourseUnitService.run(courseUnitId,true,true,userSession);
return loadCourseUnitService.run(courseUnitId,true,true,false,userSession);
}
}
/impl/src/java/pt/estgp/estgweb/services/courseunits/CreateCourseUnitAdminService.java
29,7 → 29,7
public class CreateCourseUnitAdminService implements IService
{
 
LoadCourseUnitWorksService loadCourseUnitWorksService = new LoadCourseUnitWorksService();
CourseUnitWorkService loadCourseUnitWorksService = new CourseUnitWorkService();
 
private static final Logger logger = Logger.getLogger(CreateCourseUnitAdminService.class);
 
54,6 → 54,6
 
 
 
return loadCourseUnitWorksService.run(courseUnit.getId(),userSession);
return loadCourseUnitWorksService.loadCourseUnitWorks(courseUnit.getId(),userSession);
}
}
/impl/src/java/pt/estgp/estgweb/services/courseunits/LoadCourseUnitService.java
5,10 → 5,7
import pt.estgp.estgweb.services.blogs.LoadBlogPostsService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.views.BlogPostView;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.views.UserView;
import pt.estgp.estgweb.domain.views.*;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import org.apache.log4j.Logger;
36,17 → 33,18
{
 
RepositoryService repositoryService = new RepositoryService();
LoadCourseUnitAnnouncements loadCourseUnitAnnouncements = new LoadCourseUnitAnnouncements();
 
private static final Logger logger = Logger.getLogger(LoadCourseUnitService.class);
 
public CourseUnitView run(long id, boolean initTeachers, boolean initStudents, UserSession userSession) throws ServiceException
public CourseUnitView run(long id, boolean initTeachers, boolean initStudents, boolean initBlog, UserSession userSession) throws ServiceException
{
CourseUnit c = DaoFactory.getCourseUnitDaoImpl().get(id);
 
if(c == null)
return null;
CourseUnitView cV = new CourseUnitView(c,initTeachers,initStudents);
CourseUnitView cV = new CourseUnitView(c,initTeachers,initStudents,initBlog);
 
if(c.getProgramStreamId()!= null)
{
57,6 → 55,12
cV.setExtension(repositoryFile.getLastVersion().getExtension());
}
}
 
if(initTeachers)
{
List<AnnouncementView> announcementViews = loadCourseUnitAnnouncements.run(id,userSession);
cV.setAnnouncements(announcementViews);
}
return cV;
}
}
/impl/src/java/pt/estgp/estgweb/services/courseunits/CourseUnitWorkService.java
4,11 → 4,14
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.views.CourseUnitAssignementView;
import pt.estgp.estgweb.domain.views.CourseUnitDeliverableView;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.blogs.CreateBlogService;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedException;
import org.apache.log4j.Logger;
 
import java.util.List;
17,6 → 20,7
import java.io.InputStream;
 
import jomm.utils.FilesUtils;
import jomm.utils.MessageResources;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
39,28 → 43,43
LoadCourseUnitService loadCourseUnitService = new LoadCourseUnitService();
 
 
 
private static final Logger logger = Logger.getLogger(CourseUnitWorkService.class);
 
 
public CourseUnitView create(CourseUnitAssignementView cUV, long id, UserSession userSession) throws ServiceException
public CourseUnitView create(CourseUnitAssignementView cUV, long id, InputStream file, String name, int size, String contentType, UserSession userSession) throws ServiceException
{
CourseUnit courseUnit = DaoFactory.getCourseUnitDaoImpl().get(id);
CourseUnitAssignement cU;
CourseUnitAssignement assignement;
if(cUV.getId() > 0)
cU = DaoFactory.getCourseUnitAssignementDaoImpl().get(cUV.getId());
assignement = DaoFactory.getCourseUnitAssignementDaoImpl().get(cUV.getId());
else
{
cU = DomainObjectFactory.createCourseUnitAssignementImpl();
cU.setCourseUnit(courseUnit);
assignement = DomainObjectFactory.createCourseUnitAssignementImpl();
assignement.setCourseUnit(courseUnit);
}
cUV.persistViewInObject(cU);
DaoFactory.getCourseUnitAssignementDaoImpl().save(cU);
cUV.persistViewInObject(assignement);
 
if(name != null && name.length() > 0 && size > 0 && file != null)
{
 
String extension = FilesUtils.getExtension(name);
if(assignement.getRepositoryStream() == null || assignement.getRepositoryStream().trim().length() == 0)
{
String identifier = repositoryService.storeRepositoryFile(file, contentType, extension, size, name, "courseunit.assignement.file " + courseUnit.getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDomain,userSession);
assignement.setRepositoryStream(identifier);
}
else
repositoryService.updateRepositoryFile(assignement.getRepositoryStream(), file, contentType, extension, size, name, "courseunit.assignement.file " + courseUnit.getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDomain);
}
 
DaoFactory.getCourseUnitAssignementDaoImpl().save(assignement);
return loadCourseUnitWorks(id,userSession);
}
 
public CourseUnitView loadCourseUnitWorks(long id, UserSession userSession) throws ServiceException
{
CourseUnitView cV = loadCourseUnitService.run(id,false,false,userSession);
CourseUnitView cV = loadCourseUnitService.run(id,false,false,false,userSession);
 
if(cV == null)
return null;
71,7 → 90,7
{
boolean invalids = false;
List<CourseUnitAssignementView> views = new ArrayList<CourseUnitAssignementView>();
if(userSession.getUser() != null && ((CourseUnitImpl)courseUnit).isOwnedBy(userSession.getUser()))
if(userSession.getUser() != null && ((CourseUnitImpl)courseUnit).isOwnedBy(userSession.getUser(),true))
{
invalids = true;
}
81,6 → 100,11
{
long delivers = DaoFactory.getCourseUnitDeliverableDaoImpl().countAssignements(a.getId());
CourseUnitAssignementView view = new CourseUnitAssignementView(a,delivers);
if(view.getWorkFile() != null && view.getWorkFile().length() > 0)
{
RepositoryFileImpl repositoryFile = repositoryService.loadView(a.getRepositoryStream());
view.setRepositoryFile(repositoryFile);
}
views.add(view);
}
}
129,17 → 153,17
if(deliverable == null)
{
deliverable = DomainObjectFactory.createCourseUnitDeliverableImpl();
String identifier = repositoryService.storeRepositoryFile(file, contentType, extension, size, name, "courseunit.assignement " + assignement.getCourseUnit().getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDomain,userSession);
deliverable.setDeliverableFilePath(identifier);
String identifier = repositoryService.storeRepositoryFile(file, contentType, extension, size, name, "courseunit.assignement " + assignement.getCourseUnit().getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDeliverableDomain,userSession);
deliverable.setDeliverableRepositoryStream(identifier);
deliverable.setCourseUnitAssignement(assignement);
deliverable.setStudent((Student) userSession.getUser());
DaoFactory.getCourseUnitDeliverableDaoImpl().save(deliverable);
}
else
{
repositoryService.updateRepositoryFile(deliverable.getDeliverableFilePath(), file, contentType, extension, size, name, "courseunit.assignement " + assignement.getCourseUnit().getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDomain);
repositoryService.updateRepositoryFile(deliverable.getDeliverableRepositoryStream(), file, contentType, extension, size, name, "courseunit.assignement " + assignement.getCourseUnit().getName() + " of " + userSession.getUser().getUsername(), ResourceAccessControlEnum.courseunitDeliverableDomain);
}
deliverable.setUpdateDate(new Date());
deliverable.setDeliverDate(new Date());
return loadCourseUnitWorks(courseUnitId,userSession);
}
//todo alterar o dominio de filtragem
156,6 → 180,34
}
courseUnitAssignementView.setDeliverables(views);
courseUnitAssignementView.setCourseUnitView(new CourseUnitView(assignement.getCourseUnit()));
if(courseUnitAssignementView.getWorkFile() != null && courseUnitAssignementView.getWorkFile().length() > 0)
{
RepositoryFileImpl repositoryFile = repositoryService.loadView(assignement.getRepositoryStream());
courseUnitAssignementView.setRepositoryFile(repositoryFile);
}
return courseUnitAssignementView;
}
 
public CourseUnitAssignementView updateDeliverables(long courseUnitId, long courseUnitAssignementId, List<CourseUnitDeliverableView> deliverableViews, UserSession userSession) throws ServiceException
{
CourseUnitAssignement assignement = DaoFactory.getCourseUnitAssignementDaoImpl().load(courseUnitAssignementId);
if(assignement.getCourseUnit().getId() != courseUnitId)
{
logger.warn("Trying change deliverable of a not owned course unit:" + userSession.getUser().getId() + " " + userSession.getUser().getName());
throw new ServiceException("Access Denied", new AccessDeniedException("Trying change deliverable of a not owned course unit"));
}
for(CourseUnitDeliverableView deliverable: deliverableViews)
{
CourseUnitDeliverable courseUnitDeliverable = DaoFactory.getCourseUnitDeliverableDaoImpl().load(deliverable.getId());
if(courseUnitDeliverable.getCourseUnitAssignement().getId() != assignement.getId())
{
logger.warn("Trying change deliverable of a not owned course unit:" + userSession.getUser().getId() + " " + userSession.getUser().getName());
throw new ServiceException("Access Denied", new AccessDeniedException("Trying change deliverable of a not owned course unit"));
}
deliverable.persistViewInObject(courseUnitDeliverable);
}
return loadAssignement(courseUnitAssignementId,userSession);
}
 
 
}
/impl/src/java/pt/estgp/estgweb/services/courseunits/CourseUnitBlogService.java
New file
0,0 → 1,55
package pt.estgp.estgweb.services.courseunits;
 
import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.blogs.CreateBlogService;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.views.CourseUnitAssignementView;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.RepositoryFile;
import pt.estgp.estgweb.domain.CourseUnitImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import org.apache.log4j.Logger;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
*
*
* Created at 17/Out/2003 , 23:45:24
*
*/
/**
* @author Jorge Machado
*
*
* Created at 17/Out/2003 , 23:45:24
*
*/
public class CourseUnitBlogService implements IService
{
CreateBlogService createBlogService = new CreateBlogService();
LoadCourseUnitService loadCourseUnitService = new LoadCourseUnitService();
 
private static final Logger logger = Logger.getLogger(CourseUnitBlogService.class);
 
public CourseUnitView startUnitBlog(long courseUnitId, UserSession userSession) throws ServiceException
{
CourseUnitImpl courseUnit = (CourseUnitImpl) DaoFactory.getCourseUnitDaoImpl().get(courseUnitId);
 
if(courseUnit.getUnitBlog() == null)
{
BlogView b = new BlogView();
b.setTitle(courseUnit.getName() + " Blog");
b.setInternal(true);
b.setAutoValidation(true);
b.setStatus(true);
b.setCourseUnitInternal(true);
b.setCourseUnitView(new CourseUnitView(courseUnit));
createBlogService.run(b,userSession);
}
return loadCourseUnitService.run(courseUnitId,false,false,true,userSession);
}
}
/impl/src/java/pt/estgp/estgweb/services/courseunits/LoadCourseUnitAnnouncements.java
New file
0,0 → 1,45
package pt.estgp.estgweb.services.courseunits;
 
import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.services.blogs.LoadBlogService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.domain.views.AnnouncementView;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.AnnouncementImpl;
import pt.estgp.estgweb.domain.UserImpl;
import pt.estgp.estgweb.domain.CourseUnitAnnouncementImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import org.apache.log4j.Logger;
 
import java.util.List;
import java.util.ArrayList;
 
/**
* @author Jorge Machado
* @date 19/Mai/2008
* @see pt.estgp.estgweb.services.blogs
*/
public class LoadCourseUnitAnnouncements implements IService
{
private static final Logger logger = Logger.getLogger(LoadBlogService.class);
 
public List<AnnouncementView> run(long courseUnit, UserSession userSession) throws ServiceException
{
List<CourseUnitAnnouncementImpl> announcements;
if(((UserImpl)userSession.getUser()).isInCourseUnit(courseUnit,true))
{
announcements = DaoFactory.getCourseUnitAnnouncementDaoImpl().loadCourseUnitAnnouncements(courseUnit);
}
else
{
announcements = DaoFactory.getCourseUnitAnnouncementDaoImpl().loadExternalCourseUnitAnnouncements(courseUnit);
}
 
List<AnnouncementView> announcementViews = new ArrayList<AnnouncementView>();
for(AnnouncementImpl announcement: announcements)
{
announcementViews.add(new AnnouncementView(announcement));
}
return announcementViews;
}
}
/impl/src/java/pt/estgp/estgweb/services/blogs/LoadBlogService.java
3,9 → 3,8
import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.views.BlogPostView;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.Blog;
import pt.estgp.estgweb.domain.BlogImpl;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import org.apache.log4j.Logger;
14,6 → 13,7
import java.util.ArrayList;
 
import jomm.utils.MyCalendar;
import jomm.dao.impl.AbstractDao;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
40,9 → 40,11
{
 
Blog b = DaoFactory.getBlogDaoImpl().get(id);
 
if(b == null)
return null;
BlogView bV = new BlogView(b);
 
List<BlogView.MonthPosts> monthIds = getMonths(id);
List<BlogPostView> posts = loadBlogPostsService.loadLastPosts(id,userSession);
/impl/src/java/pt/estgp/estgweb/services/blogs/CreateBlogService.java
2,15 → 2,14
 
import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.Blog;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.Globals;
import org.apache.log4j.Logger;
 
import java.util.Date;
import java.util.HashSet;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
37,8 → 36,22
Blog b;
if(bV.getId() <= 0)
{
b = DomainObjectFactory.createBlogImpl();
b.setOwner(userSession.getUser());
if(bV.getCourseUnitView() != null)
{
CourseUnit c = DaoFactory.getCourseUnitDaoImpl().get(bV.getCourseUnitView().getId());
b = DomainObjectFactory.createCourseUnitBlogImpl();
((CourseUnitBlogImpl)b).setCourseUnit(c);
if(c.getBlogs() == null)
c.setBlogs(new HashSet());
c.getBlogs().add((CourseUnitBlog) b);
if(c.getTeachers()!=null && c.getTeachers().size() > 0)
b.setOwner(c.getTeachers().iterator().next());
}
else
{
b = DomainObjectFactory.createBlogImpl();
b.setOwner(userSession.getUser());
}
b.setSaveDate(new Date());
DaoFactory.getBlogDaoImpl().save(b);
}
/impl/src/java/pt/estgp/estgweb/services/blogs/CreateBlogPostService.java
66,7 → 66,7
 
Blog b = DaoFactory.getBlogDaoImpl().load(blogId);
 
if(b.isAutoValidation() || b.isOwnedBy(userSession.getUser()) || userSession.getUser().isSuperuserOrAdmin())
if(b.isAutoValidation() || b.isOwnedBy(userSession.getUser(),true) || userSession.getUser().isSuperuserOrAdmin())
{
bPV.setStatus(true);
}
/impl/src/java/pt/estgp/estgweb/domain/UserImpl.java
1,5 → 1,7
package pt.estgp.estgweb.domain;
 
import jomm.dao.impl.AbstractDao;
 
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
/impl/src/java/pt/estgp/estgweb/domain/AnnouncementImpl.java
20,12 → 20,17
 
private static final Logger logger = Logger.getLogger(AnnouncementImpl.class);
 
public boolean isOwnedBy(GenericUser u)
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return u.getId() == getOwner().getId();
}
 
public boolean isOwnedBy(GenericUser u)
{
return isOwnedBy(u,false);
}
 
public GenericUser getOwner()
{
return super.getOwner();
/impl/src/java/pt/estgp/estgweb/domain/IAddContents.java
10,5 → 10,6
{
 
public boolean canAddContent(GenericUserImpl u);
public boolean canAddContent(GenericUserImpl u, boolean transaction);
 
}
/impl/src/java/pt/estgp/estgweb/domain/CourseUnitImpl.java
24,9 → 24,14
 
public boolean isOwnedBy(GenericUser u)
{
return u != null && u instanceof TeacherImpl && ((TeacherImpl)u).hasCourseUnit(getId(),true);
return isOwnedBy(u, false);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return u != null && u instanceof TeacherImpl && ((TeacherImpl)u).hasCourseUnit(getId(),transaction);
}
 
/**
* Not implemented can be variuous teachers
* @return null
58,4 → 63,11
{
return true;
}
 
public CourseUnitBlogImpl getUnitBlog()
{
if(getBlogs()!=null && getBlogs().size() > 0)
return (CourseUnitBlogImpl) getBlogs().iterator().next();
return null;
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/AnnouncementDaoImpl.java
196,6 → 196,8
return createCriteria().add(eq("owner.id", ownerId)).addOrder(Order.desc("updateDate")).list();
}
 
 
public List<Announcement> loadInvalidAnnouncements()
{
return createCriteria()
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseUnitAssignementDaoImpl.java
51,4 → 51,12
 
 
 
public CourseUnitAssignement loadByRepositoryId(String identifier)
{
return
(CourseUnitAssignement)
createCriteria()
.add(eq("repositoryStream",identifier))
.uniqueResult();
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseUnitDeliverableDaoImpl.java
49,7 → 49,7
return
(CourseUnitDeliverable)
createCriteria()
.add(eq("deliverableFilePath",repositoryStreamId))
.add(eq("deliverableRepositoryStream",repositoryStreamId))
.uniqueResult();
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseUnitAnnouncementDaoImpl.java
New file
0,0 → 1,50
package pt.estgp.estgweb.domain.dao.impl;
 
import pt.estgp.estgweb.domain.Announcement;
import pt.estgp.estgweb.domain.AnnouncementImpl;
import pt.estgp.estgweb.domain.CourseUnitAnnouncementImpl;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.common.SearchTypeEnum;
 
import java.util.List;
import java.util.ArrayList;
import java.util.Date;
 
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import jomm.utils.MyCalendar;
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class CourseUnitAnnouncementDaoImpl extends CourseUnitAnnouncementDao
{
public static CourseUnitAnnouncementDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new CourseUnitAnnouncementDaoImpl();
return (CourseUnitAnnouncementDaoImpl) myInstance;
}
 
 
public List<CourseUnitAnnouncementImpl> loadCourseUnitAnnouncements(long courseUnit)
{
return createCriteria()
.add(Restrictions.eq("courseUnit.id", courseUnit))
.addOrder(Order.desc("saveDate")).list();
}
 
public List<CourseUnitAnnouncementImpl> loadExternalCourseUnitAnnouncements(long courseUnit)
{
return createCriteria()
.add(Restrictions.eq("courseUnit.id", courseUnit))
.add(Restrictions.eq("courseUnitInternal",false))
.addOrder(Order.desc("saveDate")).list();
}
 
}
/impl/src/java/pt/estgp/estgweb/domain/dao/DaoFactory.java
21,6 → 21,11
return AnnouncementDaoImpl.getInstance();
}
 
public static CourseUnitAnnouncementDaoImpl getCourseUnitAnnouncementDaoImpl()
{
return CourseUnitAnnouncementDaoImpl.getInstance();
}
 
public static CourseDaoImpl getCourseDaoImpl()
{
return CourseDaoImpl.getInstance();
/impl/src/java/pt/estgp/estgweb/domain/DomainObject.java
39,4 → 39,5
{
return this.getClass();
}
}
/impl/src/java/pt/estgp/estgweb/domain/BlogImpl.java
25,16 → 25,24
{
}
 
 
public boolean canAddPost(GenericUserImpl user)
{
return RoleManager.hasRole(getTargetRolesList(), Globals.ALL_ROLE) || user.hasRole(getTargetRolesList()) || user.isSuperuserOrAdmin() || isOwnedBy(user);
return canAddPost(user,false);
}
 
public boolean canAddPost(GenericUserImpl user, boolean transaction)
{
return RoleManager.hasRole(getTargetRolesList(), Globals.ALL_ROLE) || user.hasRole(getTargetRolesList()) || user.isSuperuserOrAdmin() || isOwnedBy(user,transaction);
}
 
public boolean canAddContent(GenericUserImpl u)
{
return canAddPost(u);
}
public boolean canAddContent(GenericUserImpl u, boolean transaction)
{
return canAddPost(u,transaction);
}
 
public List<String> getTargetRolesList()
{
/impl/src/java/pt/estgp/estgweb/domain/RepositoryFileVersionImpl.java
13,4 → 13,9
{
return getId();
}
 
public int getSizeKb()
{
return getSize() / 1024;
}
}
/impl/src/java/pt/estgp/estgweb/domain/BlogPostImpl.java
55,6 → 55,11
 
public boolean isOwnedBy(GenericUser u)
{
return super.isOwnedBy(u) || getBlog().isOwnedBy(u);
return isOwnedBy(u, false);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return super.isOwnedBy(u,transaction) || getBlog().isOwnedBy(u,transaction);
}
}
/impl/src/java/pt/estgp/estgweb/domain/views/ReminderView.java
190,8 → 190,15
return null;
}
 
 
public boolean isOwnedBy(GenericUser u)
{
return reminder.isOwnedBy(u);
return isOwnedBy(u, false);
}
 
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return reminder.isOwnedBy(u,transaction);
}
}
/impl/src/java/pt/estgp/estgweb/domain/views/BlogPostView.java
76,9 → 76,14
 
public boolean isOwnedBy(GenericUser u)
{
return blogPost.isOwnedBy(u);
return blogPost.isOwnedBy(u,false);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction )
{
return blogPost.isOwnedBy(u,transaction);
}
 
public GenericUser getOwner()
{
return owner;
/impl/src/java/pt/estgp/estgweb/domain/views/AnnouncementView.java
342,9 → 342,14
return null;
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return announcement.isOwnedBy(u,transaction);
}
 
public boolean isOwnedBy(GenericUser u)
{
return announcement.isOwnedBy(u);
return announcement.isOwnedBy(u,false);
}
 
public List<String> getTargetRolesList()
/impl/src/java/pt/estgp/estgweb/domain/views/CourseUnitAssignementView.java
28,9 → 28,11
private boolean lateDelivers;
private String deliverDate;
private Date deliverDateDate;
private String workFile;
private CourseUnitDeliverableView courseUnitDeliverableView;
private List<CourseUnitDeliverableView> deliverables;
private CourseUnitView courseUnitView;
private RepositoryFileImpl repositoryFile;
 
private CourseUnitAssignement courseUnitAssignement;
 
48,6 → 50,8
{
}
 
 
public CourseUnitAssignementView(CourseUnitAssignement courseUnitAssignement, long delivers)
{
super(courseUnitAssignement);
62,6 → 66,7
this.deliverDate = DatesUtils.getStringFromDate(courseUnitAssignement.getDeliverDate());
this.deliverDateDate = courseUnitAssignement.getDeliverDate();
this.lateDelivers = courseUnitAssignement.isLateDelivers();
this.workFile = courseUnitAssignement.getRepositoryStream();
}
 
public void persistViewInObject(CourseUnitAssignement c)
74,6 → 79,16
c.setDeliverType(deliverType);
}
 
public RepositoryFileImpl getRepositoryFile()
{
return repositoryFile;
}
 
public void setRepositoryFile(RepositoryFileImpl repositoryFile)
{
this.repositoryFile = repositoryFile;
}
 
public Date getDeliverDateDate()
{
return deliverDateDate;
89,6 → 104,16
return id;
}
 
public String getWorkFile()
{
return workFile;
}
 
public void setWorkFile(String workFile)
{
this.workFile = workFile;
}
 
public void setId(long id)
{
this.id = id;
/impl/src/java/pt/estgp/estgweb/domain/views/UserView.java
368,6 → 368,11
 
public boolean isOwnedBy(GenericUser u)
{
return isOwnedBy(u,false);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return u.getId() == id;
}
 
/impl/src/java/pt/estgp/estgweb/domain/views/CourseUnitDeliverableView.java
23,6 → 23,8
private Date deliverDate;
private String deliverDateStr;
private UserView student;
private String grade;
private String obs;
 
private CourseUnitDeliverable courseUnitDeliverable;
private CourseUnitAssignementView courseUnitAssignementView;
48,8 → 50,10
super(courseUnitDeliverable);
this.courseUnitDeliverable = courseUnitDeliverable;
this.id = courseUnitDeliverable.getId();
this.fileStreamId = courseUnitDeliverable.getDeliverableFilePath();
this.deliverDate = courseUnitDeliverable.getUpdateDate();
this.grade = courseUnitDeliverable.getGrade();
this.obs = courseUnitDeliverable.getObs();
this.fileStreamId = courseUnitDeliverable.getDeliverableRepositoryStream();
this.deliverDate = courseUnitDeliverable.getDeliverDate();
this.deliverDateStr = DatesUtils.getStringFromDate(deliverDate);
if(courseUnitDeliverable.getStudent() != null)
this.student = new UserView(courseUnitDeliverable.getStudent());
58,9 → 62,20
 
public void persistViewInObject(CourseUnitDeliverable c)
{
c.setGrade(grade);
c.setObs(obs);
}
 
public String getGrade()
{
return grade;
}
 
public void setGrade(String grade)
{
this.grade = grade;
}
 
public UserView getStudent()
{
return student;
82,6 → 97,16
}
 
 
public String getObs()
{
return obs;
}
 
public void setObs(String obs)
{
this.obs = obs;
}
 
public String getFileStreamId()
{
return fileStreamId;
/impl/src/java/pt/estgp/estgweb/domain/views/CourseUnitView.java
27,7 → 27,8
private String semestre;
private String importYear;
private BlogView blog;
private Set<CourseUnitAnnouncement> announcements;
private List<AnnouncementView> announcements;
 
private CourseUnit courseUnit;
private Set<UserView> teachers;
private Set<UserView> students;
54,16 → 55,29
public CourseUnitView(CourseUnit courseUnit, boolean initTeachers, boolean initStudents )
{
super(courseUnit);
init(courseUnit, initTeachers, initStudents);
init(courseUnit, initTeachers, initStudents,false);
}
 
public CourseUnitView(CourseUnit courseUnit, boolean initTeachers, boolean initStudents, boolean initBlog )
{
super(courseUnit);
init(courseUnit, initTeachers, initStudents, initBlog);
}
 
public CourseUnitView(CourseUnit courseUnit)
{
super(courseUnit);
init(courseUnit, false,false);
init(courseUnit, false,false,false);
}
private void init(CourseUnit courseUnit, boolean initTeachers, boolean initStudents)
 
public CourseUnitView(CourseUnit courseUnit, BlogView b)
{
super(courseUnit);
this.blog = b;
init(courseUnit, false,false,false);
}
private void init(CourseUnit courseUnit, boolean initTeachers, boolean initStudents, boolean initBlog)
{
this.courseUnit = courseUnit;
this.courseName = courseUnit.getCourseName();
this.name = courseUnit.getName();
72,6 → 86,9
this.semestre = courseUnit.getSemestre();
this.importYear = courseUnit.getImportYear();
this.courseCode = courseUnit.getCourseCode();
this.objectives = courseUnit.getObjectives();
if(courseUnit.getProgramStreamId() != null)
programStreamId = courseUnit.getProgramStreamId();
// if(courseUnit.getBlog() != null)
// this.blog = new BlogView(courseUnit.getBlog());
this.id = courseUnit.getId();
93,8 → 110,17
students.add(u);
}
}
if(initBlog)
{
blog = new BlogView(((CourseUnitImpl)courseUnit).getUnitBlog(),this);
}
}
 
public void setAnnouncements(List<AnnouncementView> announcements)
{
this.announcements = announcements;
}
 
public int getTeachersSize()
{
if(teachers != null)
249,7 → 275,7
this.extension = extension;
}
 
public Set<CourseUnitAnnouncement> getAnnouncements()
public List<AnnouncementView> getAnnouncements()
{
return announcements;
}
266,8 → 292,13
 
public boolean isOwnedBy(GenericUser u)
{
return u != null && u instanceof TeacherImpl && ((TeacherImpl)u).hasCourseUnit(getId());
return isOwnedBy(u, false);
}
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return u != null && u instanceof TeacherImpl && ((TeacherImpl)u).hasCourseUnit(getId(), transaction);
}
 
/**
* Not implemented can be variuous teachers
/impl/src/java/pt/estgp/estgweb/domain/views/BlogView.java
2,12 → 2,15
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.RoleManager;
 
import java.io.Serializable;
import java.util.List;
 
import jomm.dao.impl.AbstractDao;
 
/**
* @author Jorge Machado
* @date 2/Mar/2008
34,7 → 37,9
private List<MonthPosts> months;
private int month;
private int year;
boolean autoValidation;
private boolean autoValidation;
private boolean courseUnitInternal;
private CourseUnitView courseUnitView;
 
private List<BlogPostView> lastPosts;
 
45,6 → 50,16
public BlogView(Blog blog)
{
super(blog);
init(blog,null);
}
public BlogView(Blog blog, CourseUnitView c)
{
super(blog);
init(blog,c);
}
private void init(Blog blog, CourseUnitView c)
{
 
this.blog = blog;
this.title = blog.getTitle();
this.description = blog.getDescription();
56,6 → 71,19
this.name = blog.getName();
this.internal = blog.isInternal();
autoValidation = blog.isAutoValidation();
if(blog instanceof CourseUnitBlogImpl)
{
if(c != null)
{
courseUnitView = c;
courseUnitInternal = ((CourseUnitBlog)blog).isCourseUnitInternal();
}
else
{
courseUnitInternal = ((CourseUnitBlog)blog).isCourseUnitInternal();
courseUnitView = new CourseUnitView(((CourseUnitBlog)blog).getCourseUnit(),this);
}
}
}
 
public void persistViewInObject(Blog blog)
68,6 → 96,10
blog.setImage(image);
blog.setInternal(internal);
blog.setAutoValidation(autoValidation);
if(blog instanceof CourseUnitBlog)
{
((CourseUnitBlog)blog).setCourseUnitInternal(courseUnitInternal);
}
}
public void persistViewInObjectByAdmin(Blog blog)
{
86,6 → 118,16
this.autoValidation = autoValidation;
}
 
public CourseUnitView getCourseUnitView()
{
return courseUnitView;
}
 
public void setCourseUnitView(CourseUnitView courseUnitView)
{
this.courseUnitView = courseUnitView;
}
 
public String getName()
{
return name;
136,6 → 178,16
this.lastPosts = lastPosts;
}
 
public boolean isCourseUnitInternal()
{
return courseUnitInternal;
}
 
public void setCourseUnitInternal(boolean courseUnitInternal)
{
this.courseUnitInternal = courseUnitInternal;
}
 
public void setInternal(boolean internal)
{
this.internal = internal;
153,9 → 205,14
 
public boolean isOwnedBy(GenericUser u)
{
return blog.isOwnedBy(u);
return blog.isOwnedBy(u,false);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return blog.isOwnedBy(u,transaction);
}
 
public GenericUser getOwner()
{
return owner;
263,6 → 320,10
{
return ((BlogImpl)blog).canAddContent(u);
}
public boolean canAddContent(GenericUserImpl u, boolean transaction)
{
return ((BlogImpl)blog).canAddContent(u,transaction);
}
 
public boolean isInternal()
{
/impl/src/java/pt/estgp/estgweb/domain/IOwned.java
12,6 → 12,7
{
public boolean isOwnedBy(GenericUser u);
public boolean isOwnedBy(GenericUser u, boolean openTransaction);
public GenericUser getOwner();
public List<String> getOwnerRoles();
public String getChoosedOwnerRole();
/impl/src/java/pt/estgp/estgweb/domain/CourseUnitBlogImpl.java
20,7 → 20,7
*/
public boolean canAddPost(GenericUserImpl user, boolean transaction)
{
if(!super.canAddPost(user))
if(!super.canAddPost(user,transaction))
return false;
if(user == null)
return false;
44,4 → 44,17
{
return !isCourseUnitInternal() || canAddPost(user,true);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
if(u instanceof UserImpl)
if(((UserImpl) u).isTeacherOfCourseUnit(getCourseUnit().getId(),transaction))
return true;
return false;
}
 
public boolean isOwnedBy(GenericUser u)
{
return isOwnedBy(u,false);
}
}
/impl/src/java/pt/estgp/estgweb/domain/ReminderImpl.java
23,6 → 23,11
 
public boolean isOwnedBy(GenericUser u)
{
return isOwnedBy(u, false);
}
 
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
return u.getId() == getOwner().getId();
}
 
/impl/src/java/pt/estgp/estgweb/domain/OwnedDomainObject.java
23,6 → 23,12
*/
public abstract List<String> getOwnerRoles();
 
 
public boolean isOwnedBy(GenericUser u)
{
return isOwnedBy(u, false);
}
 
/**
* Check if this object is owned by this user or
* if this user is in group of owners or
31,7 → 37,7
* @param u user to check
* @return true if user is owner
*/
public boolean isOwnedBy(GenericUser u)
public boolean isOwnedBy(GenericUser u, boolean transaction)
{
if(getOwner() == null && getOwnerRoles() == null)
return false;
/impl/src/java/pt/estgp/estgweb/filters/chains/ResourceAccessControlEnum.java
13,6 → 13,7
authenticatedDomain("resource.access.authenticatedDomain", new ResourceAccessControlPublicDomainFilter()),
adminDomain("resource.access.adminDomain",new ResourceAccessControlAdminDomainFilter()),
superUserDomain("resource.access.superDomain",new ResourceAccessControlSuperDomainFilter()),
courseunitDeliverableDomain("resource.access.courseunitDeliverableDomain",new ResourceAccessControlCourseUnitDeliverableFilter()),
courseunitDomain("resource.access.courseunitDomain",new ResourceAccessControlCourseUnitFilter());
 
private String key;
/impl/src/java/pt/estgp/estgweb/filters/chains/ResourceAccessControlFilter.java
1,7 → 1,14
package pt.estgp.estgweb.filters.chains;
 
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.utl.ist.berserk.logic.filterManager.IFilter;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import org.apache.log4j.Logger;
 
/**
* @author Jorge Machado
10,5 → 17,23
*/
public abstract class ResourceAccessControlFilter implements IFilter
{
public abstract boolean canAccessResource(UserSession user, String identifier);
 
private static final Logger logger = Logger.getLogger(ResourceAccessControlFilter.class);
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
UserSession userSession = (UserSession) request.getServiceParameters().getParameter(Globals.USER_SESSION_KEY);
String identifier = (String) request.getServiceParameters().getParameter("identifier");
if(!canAccessResource(userSession,identifier))
{
if(userSession.getUser() != null)
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
else
logger.warn(userSession.getIpAddress() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
}
 
}
 
public abstract boolean canAccessResource(UserSession userSession, String identifier);
}
/impl/src/java/pt/estgp/estgweb/filters/filters/ResourceAccessControlCourseUnitDeliverableFilter.java
New file
0,0 → 1,34
package pt.estgp.estgweb.filters.filters;
 
import pt.estgp.estgweb.filters.chains.ResourceAccessControlFilter;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.Globals;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
import org.apache.log4j.Logger;
 
/**
* @author Jorge Machado
* @date 4/Jun/2008
* @see pt.estgp.estgweb.filters.filters
*/
public class ResourceAccessControlCourseUnitDeliverableFilter extends ResourceAccessControlFilter
{
 
private static final Logger logger = Logger.getLogger(ResourceAccessControlCourseUnitDeliverableFilter.class);
 
public boolean canAccessResource(UserSession userSession, String identifier)
{
CourseUnitDeliverable d = DaoFactory.getCourseUnitDeliverableDaoImpl().loadDeliverableByRepositoryId(identifier);
CourseUnit c = d.getCourseUnitAssignement().getCourseUnit();
return userSession.getUser()!= null &&
(((UserImpl) userSession.getUser()).isTeacherOfCourseUnit(c.getId(), true)
||
userSession.getUser().getId() == d.getStudent().getId());
}
 
}
/impl/src/java/pt/estgp/estgweb/filters/filters/ResourceAccessControlCourseUnitFilter.java
23,26 → 23,8
 
public boolean canAccessResource(UserSession userSession, String identifier)
{
CourseUnitDeliverable d = DaoFactory.getCourseUnitDeliverableDaoImpl().loadDeliverableByRepositoryId(identifier);
CourseUnit c = d.getCourseUnitAssignement().getCourseUnit();
return userSession.getUser()!= null &&
(((UserImpl) userSession.getUser()).isTeacherOfCourseUnit(c.getId(), true)
||
userSession.getUser().getId() == d.getStudent().getId());
CourseUnitAssignement cA = DaoFactory.getCourseUnitAssignementDaoImpl().loadByRepositoryId(identifier);
CourseUnit c = cA.getCourseUnit();
return userSession.getUser()!= null && ((UserImpl) userSession.getUser()).isInCourseUnit(c.getId(), true);
}
 
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
UserSession userSession = (UserSession) request.getServiceParameters().getParameter(Globals.USER_SESSION_KEY);
String identifier = (String) request.getServiceParameters().getParameter("identifier");
if(!canAccessResource(userSession,identifier))
{
if(userSession.getUser() != null)
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
else
logger.warn(userSession.getIpAddress() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
}
 
}
}
/impl/src/java/pt/estgp/estgweb/filters/filters/OwnerUsersClass.java
33,7 → 33,7
 
IOwned iOwned = (IOwned) LoadObjectFromParameters.loadObjectFromClassName((String) filterParameters.getParameter(1),filterParameters,request.getServiceParameters());
 
if(!iOwned.isOwnedBy(userSession.getUser()))
if(!iOwned.isOwnedBy(userSession.getUser(),true))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
/impl/src/java/pt/estgp/estgweb/filters/filters/OwnerUsers.java
41,7 → 41,7
 
IOwned iOwned = (IOwned) LoadObjectFromParameters.loadObject(filterParameters,request.getServiceParameters());
 
if(!iOwned.isOwnedBy(userSession.getUser()))
if(!iOwned.isOwnedBy(userSession.getUser(),true))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
/impl/src/java/pt/estgp/estgweb/filters/filters/BooleanCheck.java
New file
0,0 → 1,28
package pt.estgp.estgweb.filters.filters;
 
import pt.estgp.estgweb.filters.chains.LoadControlFilter;
import pt.estgp.estgweb.filters.filters.utils.LoadObjectFromParameters;
import pt.estgp.estgweb.filters.exceptions.NeedAuthenticationException;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.IInternal;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.utils.ReflectionBean;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
import org.apache.log4j.Logger;
 
public class BooleanCheck extends LoadControlFilter
{
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
Object container = LoadObjectFromParameters.loadObjectFromClassName((String) filterParameters.getParameter(1),filterParameters,request.getServiceParameters());
ReflectionBean rbean = new ReflectionBean("o." + filterParameters.getParameter(2));
Boolean bool = (Boolean) rbean.invoke(container);
if(!bool)
{
throw new NeedAuthenticationException();
}
}
}
/impl/src/java/pt/estgp/estgweb/filters/filters/utils/LoadObjectFromParameters.java
10,6 → 10,7
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
 
/**
* @author Jorge Machado
45,7 → 46,7
 
Object classNameObjectContainer = serviceParameters.getParameter(classNameBean.getName());
Class className = (Class) classNameBean.invoke(classNameObjectContainer);
return AbstractDao.getCurrentSession().load(className,serializable);
return AbstractDao.load(className,serializable);
}
catch (NoSuchMethodException e)
{
99,7 → 100,7
ReflectionBean serializableBean = new ReflectionBean(serializableBeanId);
Object serializableObjectContainer = serviceParameters.getParameter(serializableBean.getName());
Serializable serializable = (Serializable) serializableBean.invoke(serializableObjectContainer);
return AbstractDao.getCurrentSession().load(c,serializable);
return AbstractDao.load(c,serializable);
}
catch (NoSuchMethodException e)
{
123,8 → 124,13
ReflectionBean serializableBean = new ReflectionBean(serializableBeanId);
Object serializableObjectContainer = serviceParameters.getParameter(serializableBean.getName());
Serializable serializable = (Serializable) serializableBean.invoke(serializableObjectContainer);
return AbstractDao.getCurrentSession().load(className,serializable);
return AbstractDao.load(className,serializable);
}
catch(HibernateException h)
{
logger.error(h,h);
throw h;
}
catch (NoSuchMethodException e)
{
logger.fatal(e,e);
/impl/src/java/pt/estgp/estgweb/filters/filters/OwnerUsersClassBean.java
38,7 → 38,7
IOwned iOwned = (IOwned) rbean.invoke(bean);
 
 
if(!iOwned.isOwnedBy(userSession.getUser()))
if(!iOwned.isOwnedBy(userSession.getUser(),true))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
/impl/src/java/pt/estgp/estgweb/filters/filters/CanAddContentClass.java
34,7 → 34,7
 
IAddContents iAddContents = (IAddContents) LoadObjectFromParameters.loadObjectFromClassName((String) filterParameters.getParameter(1),filterParameters,request.getServiceParameters());
 
if(!iAddContents.canAddContent(userSession.getUser()))
if(!iAddContents.canAddContent(userSession.getUser(),true))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
/impl/src/java/pt/estgp/estgweb/web/tags/CanManageTag.java
78,10 → 78,10
{
boolean valid = Boolean.parseBoolean(this.valid);
IValid iValid = (IValid) owned;
return owned != null && userSession.getUser() != null && (iValid.isValid() == valid && owned.isOwnedBy(userSession.getUser()) || (userSession.getUser()).isSuperuserOrAdmin());
return owned != null && userSession.getUser() != null && (iValid.isValid() == valid && owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
}
else
return owned != null && userSession.getUser() != null && (owned.isOwnedBy(userSession.getUser()) || (userSession.getUser()).isSuperuserOrAdmin());
return owned != null && userSession.getUser() != null && (owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
 
}
 
/impl/src/java/pt/estgp/estgweb/web/tags/CantManageTag.java
84,10 → 84,10
{
boolean valid = Boolean.parseBoolean(this.valid);
IValid iValid = (IValid) owned;
return owned != null && userSession.getUser() != null && (iValid.isValid() == valid && owned.isOwnedBy(userSession.getUser()) || (userSession.getUser()).isSuperuserOrAdmin());
return owned != null && userSession.getUser() != null && (iValid.isValid() == valid && owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
}
else
return owned != null && userSession.getUser() != null && (owned.isOwnedBy(userSession.getUser()) || (userSession.getUser()).isSuperuserOrAdmin());
return owned != null && userSession.getUser() != null && (owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
 
}
 
/impl/src/java/pt/estgp/estgweb/web/form/courseunits/CourseUnitsForm.java
8,6 → 8,7
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.views.CourseUnitAssignementView;
import pt.estgp.estgweb.domain.views.UserView;
import pt.estgp.estgweb.domain.views.CourseUnitDeliverableView;
import pt.estgp.estgweb.domain.TeacherImpl;
import pt.estgp.estgweb.domain.Teacher;
import pt.estgp.estgweb.utils.DatesUtils;
20,6 → 21,8
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
 
/**
* @author Jorge Machado
32,6 → 35,7
private static final Logger logger = Logger.getLogger(CourseUnitsForm.class);
 
CourseUnitView courseUnitView = new CourseUnitView();
//aux
long courseId;
long id;
40,10 → 44,10
boolean showNewWorkForm = false;
FormFile uploadFile;
 
 
//courseunit
FormFile programFile;
CourseUnitAssignementView courseUnitAssignementView = new CourseUnitAssignementView();
 
//search
String textToSearch;
String searchType = SearchTypeEnum.AllWords.getMessageKey();
53,6 → 57,16
List<UserView> teachers = null;
 
 
public CourseUnitsForm()
{
 
courseUnitAssignementView.setDeliverables(new ArrayList<CourseUnitDeliverableView>());
for(int i = 0; i < 200; i++)
{
courseUnitAssignementView.getDeliverables().add(new CourseUnitDeliverableView());
}
}
public CourseUnitView getCourseUnitView()
{
return courseUnitView;
231,6 → 245,10
{
addMessageWithKeys(errors,httpServletRequest,"errors.required","courseunit.title");
}
if(uploadFile != null && uploadFile.getFileSize() > 0 && !uploadFile.getFileName().endsWith(".zip"))
{
addMessage(errors,httpServletRequest,"errors.courseunit.assignement.file.type");
}
return errors;
}
 
248,5 → 266,18
return errors;
}
 
public void validateUpdateDeliverables()
{
Iterator<CourseUnitDeliverableView> iter = courseUnitAssignementView.getDeliverables().iterator();
while (iter.hasNext())
{
CourseUnitDeliverableView courseUnitDeliverableView = iter.next();
if(courseUnitDeliverableView.getId() <= 0)
{
iter.remove();
}
}
}
 
 
}
/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsAdminController.java
78,7 → 78,7
CourseUnitsForm cUF = (CourseUnitsForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"serializable"};
Object[] args = new Object[]{cUF.getId(),true,true};
Object[] args = new Object[]{cUF.getId(),true,true,false};
 
CourseUnitView cV = (CourseUnitView) sm.execute(RequestUtils.getRequester(request, response), "LoadCourseUnit", args, names);
request.setAttribute("CourseUnitView",cV);
/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsController.java
10,14 → 10,13
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.domain.views.CourseUnitAssignementView;
import pt.estgp.estgweb.domain.views.BlogView;
import pt.estgp.estgweb.domain.Image;
import pt.estgp.estgweb.filters.exceptions.NotFoundException;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.controllers.blogs.BlogsController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.form.courseunits.CourseUnitsForm;
import pt.estgp.estgweb.web.form.blogs.BlogForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.estgp.estgweb.web.utils.DomainUtils;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterRetrieveException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.IncompatibleFilterException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.InvalidFilterException;
44,21 → 43,21
{
private static final Logger logger = Logger.getLogger(CourseUnitsController.class);
 
private ActionForward loadCourseUnitAndForward(CourseUnitsForm cUF, long id, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
private ActionForward loadCourseUnitAndForward(CourseUnitsForm cUF, long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
CourseUnitView cV = loadCourseUnitView(id, mapping, request, response);
CourseUnitView cV = loadCourseUnitView(id,initTeachers,initStudents, mapping, request, response);
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
return mapping.findForward("load");
}
 
private CourseUnitView loadCourseUnitView(long id, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
private CourseUnitView loadCourseUnitView(long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"serializable"};
Object[] args = new Object[]{id,false,false};
Object[] args = new Object[]{id,initTeachers,initStudents,false};
try
{
CourseUnitView cV = (CourseUnitView) sm.execute(RequestUtils.getRequester(request, response), "LoadCourseUnit", args, names);
74,6 → 73,7
}
}
 
 
public ActionForward load(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
83,7 → 83,12
try
{
CourseUnitsForm cUF = (CourseUnitsForm) form;
return loadCourseUnitAndForward(cUF, Long.parseLong(request.getParameter("id")), mapping, request, response);
long id;
if(request.getParameter("id")!=null)
id = Long.parseLong(request.getParameter("id"));
else
id = cUF.getCourseUnitView().getId();
return loadCourseUnitAndForward(cUF,id ,true,false, mapping, request, response);
}
catch (FilterChainFailedException e)
{
100,6 → 105,40
}
}
 
public ActionForward loadStudents(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitsForm cUF = (CourseUnitsForm) form;
long id;
if(request.getParameter("id")!=null)
id = Long.parseLong(request.getParameter("id"));
else
id = cUF.getCourseUnitView().getId();
CourseUnitView cV = loadCourseUnitView(id,false,true, mapping, request, response);
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
return mapping.findForward("load.students");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward loadWorks(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
164,7 → 203,7
long id = cUF.getCourseUnitView().getId();
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"object","serializable"};
Object[] args = new Object[]{cUF.getCourseUnitAssignementView(), id};
Object[] args = new Object[]{cUF.getCourseUnitAssignementView(), id, cUF.getUploadFile().getInputStream(),cUF.getUploadFile().getFileName(),cUF.getUploadFile().getFileSize(),cUF.getUploadFile().getContentType()};
try
{
String service;
357,7 → 396,7
String[] names = new String[]{"object"};
Object[] args;
 
if(cUF.getProgramFile() == null)
if(cUF.getProgramFile() == null || cUF.getProgramFile().getFileSize() <= 0)
args = new Object[]{cUF.getCourseUnitView(),null,null,0,null};
else //ring name, int size, String contentType, String extensio
args = new Object[]{cUF.getCourseUnitView(),cUF.getProgramFile().getInputStream(),cUF.getProgramFile().getFileName(),cUF.getProgramFile().getFileSize(),cUF.getProgramFile().getContentType()};
384,9 → 423,9
 
 
public ActionForward deliverWork(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
422,16 → 461,50
}
}
 
public ActionForward updateDeliverables(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
CourseUnitsForm cUF = (CourseUnitsForm) form;
cUF.validateUpdateDeliverables();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"serializable","deliverables"};
Object[] args = new Object[]{cUF.getCourseUnitView().getId(),cUF.getCourseUnitAssignementView().getId(), cUF.getCourseUnitAssignementView().getDeliverables()};
CourseUnitAssignementView cAV = (CourseUnitAssignementView) sm.execute(RequestUtils.getRequester(request, response), "UpdateCourseUnitDeliverables", args, names);
cUF.setCourseUnitView(cAV.getCourseUnitView());
cUF.setCourseUnitAssignementView(cAV);
request.setAttribute("CourseUnitView", cAV.getCourseUnitView());
request.setAttribute("CourseUnitAssignementView", cAV);
return mapping.findForward("load.assignement");
 
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
}
 
 
public ActionForward loadAssignement(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
CourseUnitsForm cUF = (CourseUnitsForm) form;
 
IServiceManager sm = ServiceManager.getInstance();
FormFile work = cUF.getUploadFile();
String[] names = new String[]{"serializable"};
454,6 → 527,39
}
}
 
public ActionForward startBlog(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
CourseUnitsForm cUF = (CourseUnitsForm) form;
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"serializable"};
Object[] args = new Object[]{cUF.getCourseUnitView().getId()};
CourseUnitView cUV = (CourseUnitView) sm.execute(RequestUtils.getRequester(request, response), "StartCourseUnitBlog", args, names);
cUF.setCourseUnitView(cUV);
request.setAttribute("CourseUnitView", cUV);
BlogForm bForm = new BlogForm();
bForm.setBlogView(new BlogView());
bForm.getBlogView().setId(cUV.getBlog().getId());
new BlogsController().load(mapping,bForm,request,response);
return mapping.findForward("load.blog");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
}
 
 
 
 
}
/impl/src/java/pt/estgp/estgweb/web/controllers/blogs/BlogServlet.java
40,7 → 40,7
try
{
id = Long.parseLong(identifier.trim());
request.getRequestDispatcher("/startLoadBlog.do?id=" + id).forward(request, response);
request.getRequestDispatcher("/startLoadBlog.do?blogView.id=" + id).forward(request, response);
}
catch (NumberFormatException e)
{
/impl/src/java/pt/estgp/estgweb/web/controllers/blogs/BlogsController.java
61,6 → 61,7
return mapping.findForward("load");
}
 
 
/**
* Load and forward a blog given a name
* @param name
173,6 → 174,8
if (!errors.isEmpty())
{
saveErrors(request, errors);
BlogView bV = loadBlogView(blogForm.getBlogView().getId(), mapping, request, response);
request.setAttribute("BlogView", bV);
return mapping.findForward("submit");
}
 
219,7 → 222,13
{
try
{
return loadBlogAndForward(Long.parseLong(request.getParameter("id")), mapping, request, response);
BlogForm bf = (BlogForm) form;
long id;
if(request.getParameter("id") !=null)
id = Long.parseLong(request.getParameter("id"));
else
id = bf.getBlogView().getId();
return loadBlogAndForward(id, mapping, request, response);
}
catch (FilterChainFailedException e)
{
391,6 → 400,7
String[] names = new String[]{"serializable"};
Object[] args = new Object[]{new Long(request.getParameter("id"))};
BlogView bV = (BlogView) sm.execute(RequestUtils.getRequester(request, response), "LoadEditBlog", args, names);
request.setAttribute("BlogView", bV);
BlogForm blogForm = (BlogForm) form;
blogForm.setBlogView(bV);
blogForm.setSelectedRoles(bV.getTargetRoles());
445,9 → 455,9
}
 
public ActionForward validatePost(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
/impl/src/hbm/pt/estgp/estgweb/domain/GenericUser.hbm.xml
61,7 → 61,7
<property name="userNameNetpa" type="string"/>
<set name="subscribedUnits" lazy="true">
<key column="studentId"/>
<many-to-many class="pt.estgp.estgweb.domain.CourseUnit" column="courseUnitId"/>
<many-to-many class="pt.estgp.estgweb.domain.CourseUnitImpl" column="courseUnitId"/>
</set>
<subclass name="pt.estgp.estgweb.domain.StudentImpl" discriminator-value="StudentImpl"/>
</subclass>
75,7 → 75,7
<property name="unitCheck" type="boolean"/>
<set name="teachedUnits" lazy="true" order-by="courseUnitId">
<key column="teacherId"/>
<many-to-many class="pt.estgp.estgweb.domain.CourseUnit" column="courseUnitId"/>
<many-to-many class="pt.estgp.estgweb.domain.CourseUnitImpl" column="courseUnitId"/>
</set>
<subclass name="pt.estgp.estgweb.domain.TeacherImpl" discriminator-value="TeacherImpl"/>
</subclass>
/impl/src/hbm/pt/estgp/estgweb/domain/Blog.hbm.xml
31,7 → 31,7
<meta attribute="extends">pt.estgp.estgweb.domain.BlogImpl</meta>
<meta attribute="scope-class">public abstract</meta>
<property name="courseUnitInternal" type="boolean" />
<many-to-one name="courseUnit" class="pt.estgp.estgweb.domain.CourseUnit" lazy="proxy" outer-join="false"/>
<many-to-one name="courseUnit" class="pt.estgp.estgweb.domain.CourseUnit" lazy="proxy" outer-join="true"/>
<subclass name="pt.estgp.estgweb.domain.CourseUnitBlogImpl" discriminator-value="CourseUnitBlogImpl"/>
</subclass>
</subclass>
/impl/src/hbm/pt/estgp/estgweb/domain/CourseUnit.hbm.xml
23,15 → 23,13
<property name="institutionCode" type="string" />
<property name="objectives" type="text"/>
<property name="programStreamId" type="string"/>
 
<property name="status" type="boolean" />
<set name="blogs" cascade="delete" lazy="true" order-by="name desc">
<many-to-one name="course" class="pt.estgp.estgweb.domain.Course" lazy="false" outer-join="true"/>
<set name="blogs" cascade="delete" lazy="true" order-by="saveDate asc">
<key column="courseUnit"/>
<one-to-many class="pt.estgp.estgweb.domain.CourseUnitBlog" />
</set>
<many-to-one name="course" class="pt.estgp.estgweb.domain.Course" lazy="false" outer-join="true"/>
<set name="teachers" lazy="true" table="teachedunits">
<set name="teachers" lazy="true" table="teachedUnits">
<key column="courseUnitId"/>
<many-to-many class="pt.estgp.estgweb.domain.TeacherImpl" column="teacherId"/>
</set>
84,9 → 82,10
<property name="lateDelivers" type="boolean"/>
<property name="title" type="string"/>
<property name="description" type="text"/>
<property name="repositoryStream" type="string" index="repositoryStreamIndex"/>
<property name="status" type="boolean"/>
<many-to-one name="courseUnit" class="pt.estgp.estgweb.domain.CourseUnit" lazy="false" outer-join="true"/>
<set name="deliverables" cascade="delete" lazy="true" order-by="updateDate desc">
<set name="deliverables" cascade="delete" lazy="true" order-by="deliverDate asc">
<key column="courseUnitAssignement"/>
<one-to-many class="pt.estgp.estgweb.domain.CourseUnitDeliverable"/>
</set>
102,7 → 101,10
<discriminator column="discrimitator"/>
<timestamp name="updateDate" unsaved-value="null"/>
<property name="saveDate" type="timestamp"/>
<property name="deliverableFilePath" type="string" index="deliverableFilePathIndex"/>
<property name="deliverDate" type="timestamp"/>
<property name="grade" type="string"/>
<property name="obs" type="text"/>
<property name="deliverableRepositoryStream" type="string" index="deliverableRepositoryStreamIndex"/>
<many-to-one name="courseUnitAssignement" class="pt.estgp.estgweb.domain.CourseUnitAssignement" lazy="false" outer-join="true"/>
<many-to-one name="student" class="pt.estgp.estgweb.domain.Student" lazy="false" outer-join="true"/>
<subclass name="pt.estgp.estgweb.domain.CourseUnitDeliverableImpl" discriminator-value="CourseUnitDeliverableImpl"/>
/impl/src/web/css/style.css
889,7 → 889,6
 
.seccao, .seccao p {
margin: 10px;
font-size: 0.95em;
font-family: Helvetica, sans-serif;
}
 
/impl/src/web/user/courseunits/menu.jsp
1,36 → 1,50
<%@ page import="pt.estgp.estgweb.domain.views.BlogView" %>
<%@ 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" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ 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" %>
<%
if (request.getAttribute("BlogView") != null)
{
BlogView bV = (BlogView) request.getAttribute("BlogView");
request.setAttribute("CourseUnitView",bV.getCourseUnitView());
}
%>
<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="linkLeftMenu">
<div class="listClean">
<ul>
<li>
<a href="<%=request.getContextPath()%>/">Inicio</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Colocar Dúvidas</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Blog</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitWorksFromHome.do?courseUnitView.id=${CourseUnitView.id}">Trabalhos</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Notas</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Corpo Docente</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Conteúdos</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Assiduidade</a>
</li>
<li>
<a href="<%=request.getContextPath()%>/">Avaliação</a>
</li>
<baco:isAuthenticated>
<li>
<html:link action="/user/startLoadCourseUnitFromHome?courseUnitView.id=${CourseUnitView.id}"><bean:message key="courseunit.menu.home"/></html:link>
</li>
<li>
<a href="<%=request.getContextPath()%>/"><bean:message key="courseunit.menu.put.question"/></a>
</li>
<li>
<html:link action="/user/startCourseUnitBlogFromHome?courseUnitView.id=${CourseUnitView.id}"><bean:message key="courseunit.menu.blog"/></html:link>
</li>
 
<li>
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitWorksFromHome.do?courseUnitView.id=${CourseUnitView.id}"><bean:message key="courseunit.menu.assignements"/></a>
</li>
<li>
<html:link action="/user/startLoadCourseUnitStudentsFromHome?courseUnitView.id=${CourseUnitView.id}"><bean:message key="courseunit.students"/></html:link>
</li>
<li>
<a href="<%=request.getContextPath()%>/"><bean:message key="courseunit.menu.contents"/></a>
</li>
<li>
<a href="<%=request.getContextPath()%>/"><bean:message key="courseunit.menu.presences"/></a>
</li>
<li>
<a href="<%=request.getContextPath()%>/"><bean:message key="courseunit.menu.grades"/></a>
</li>
</baco:isAuthenticated>
</ul>
</div>
</div>
/impl/src/web/user/courseunits/courseunitworks.jsp
23,97 → 23,107
</baco:canManage>
</h2>
<baco:canManage name="CourseUnitView">
<%
String visibility;
if(CourseUnitsForm.isShowNewWorkForm())
visibility = "position:relative;visibility:visible";
else
visibility = "position:absolute;visibility:hidden";
request.setAttribute("visibility",visibility);
%>
<html:form styleId="assignements" style="${visibility}" action="/user/courseUnitControllerFromHome">
<input type="hidden" name="dispatch" value="createAssignement">
<html:hidden property="courseUnitView.id"/>
<html:hidden property="courseUnitAssignementView.id"/>
<div class="form blockForm">
<table>
<tr>
<th>
<bean:message key="courseunit.title"/>
</th>
<td>
<html:text styleClass="text" property="courseUnitAssignementView.title"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.date"/>
</th>
<td>
<a href="javascript:cal.select(getObjectById('deliverDate'),'anchor1','yyyy/MM/dd')" name="anchor1" id="anchor1"><html:text styleClass="date" property="courseUnitAssignementView.deliverDate" styleId="deliverDate" readonly="true"/></a>
<input type="button" class="removeButton" onClick="CourseUnitsForm.deliverDate.value=null">
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.type"/>
</th>
<td>
<html:select property="courseUnitAssignementView.deliverType">
<html:option value="zipfile" key="courseunit.assignement.deliver.type.zipfile"/>
<html:option value="nofile" key="courseunit.assignement.deliver.type.nofile"/>
</html:select>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.late.permission"/>
</th>
<td>
<html:select property="courseUnitAssignementView.lateDelivers">
<html:option value="true" key="yes"/>
<html:option value="false" key="no"/>
</html:select>
</td>
</tr>
<%
String visibility;
if(CourseUnitsForm.isShowNewWorkForm())
visibility = "position:relative;visibility:visible";
else
visibility = "position:absolute;visibility:hidden";
request.setAttribute("visibility",visibility);
%>
<html:form styleId="assignements" style="${visibility}" action="/user/courseUnitControllerFromHome" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="createAssignement">
<html:hidden property="courseUnitView.id"/>
<html:hidden property="courseUnitAssignementView.id"/>
<div class="form blockForm">
<table>
<tr>
<th>
<bean:message key="courseunit.title"/>
</th>
<td>
<html:text styleClass="text" property="courseUnitAssignementView.title"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.date"/>
</th>
<td>
<a href="javascript:cal.select(getObjectById('deliverDate'),'anchor1','yyyy/MM/dd')" name="anchor1" id="anchor1"><html:text styleClass="date" property="courseUnitAssignementView.deliverDate" styleId="deliverDate" readonly="true"/></a>
<input type="button" class="removeButton" onClick="CourseUnitsForm.deliverDate.value=null">
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.type"/>
</th>
<td>
<html:select property="courseUnitAssignementView.deliverType">
<html:option value="zipfile" key="courseunit.assignement.deliver.type.zipfile"/>
<html:option value="nofile" key="courseunit.assignement.deliver.type.nofile"/>
</html:select>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.late.permission"/>
</th>
<td>
<html:select property="courseUnitAssignementView.lateDelivers">
<html:option value="true" key="yes"/>
<html:option value="false" key="no"/>
</html:select>
</td>
</tr>
 
<tr>
<th>
<bean:message key="courseunit.description"/>
</th>
<td>
<html:textarea styleClass="textarea" property="courseUnitAssignementView.description"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.status"/>
</th>
<td>
<html:select property="courseUnitAssignementView.status">
<html:option value="true">
<bean:message key="status.active"/>
</html:option>
<html:option value="false">
<bean:message key="status.inactive"/>
</html:option>
</html:select>
</td>
</tr>
<tr>
<td colspan="2">
<input type="button" onclick="this.form.submit()" value="<bean:message key="confirm"/>"/>
</td>
</tr>
</table>
</div>
</html:form>
<tr>
<th>
<bean:message key="courseunit.description"/>
</th>
<td>
<html:textarea styleClass="textarea" property="courseUnitAssignementView.description"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.file"/>
</th>
<td>
<html:file property="uploadFile"/>
</td>
</tr>
 
<tr>
<th>
<bean:message key="courseunit.status"/>
</th>
<td>
<html:select property="courseUnitAssignementView.status">
<html:option value="true">
<bean:message key="status.active"/>
</html:option>
<html:option value="false">
<bean:message key="status.inactive"/>
</html:option>
</html:select>
</td>
</tr>
<tr>
<td colspan="2">
<input type="button" onclick="this.form.submit()" value="<bean:message key="confirm"/>"/>
</td>
</tr>
</table>
</div>
</html:form>
</baco:canManage>
<p>
<logic:notEmpty name="CourseUnitView" property="courseUnitAssignements">
<table class="dataTable">
<tr>
<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>
127,10 → 137,12
</baco:canManage>
<baco:isStudentOfCourseUnit courseUnitId="${CourseUnitView.id}">
<%
request.setAttribute("colspanAssignement",6);
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">
138,6 → 150,11
<td>
<a href="javascript:showOrHide('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())
202,7 → 219,7
</td>
</baco:canManage>
<baco:isStudentOfCourseUnit courseUnitId="${CourseUnitView.id}">
<td>
<td nowrap="nowrap">
 
<%
if(work.canDeliver(request))
217,7 → 234,7
<input type="submit" value="<bean:message key="replace"/>"/>
</logic:notEmpty>
<logic:empty name="work" property="courseUnitDeliverableView">
<input type="submit" value="<bean:message key="confirm"/>"/>
<input type="submit" value="<bean:message key="courseunit.assignement.deliver"/>"/>
</logic:empty>
</html:form>
<%
242,6 → 259,12
</td>
</logic:notEqual>
</logic:notEmpty>
<td>
${work.courseUnitDeliverableView.grade}
</td>
<td>
${work.courseUnitDeliverableView.obs}
</td>
</baco:isStudentOfCourseUnit>
<logic:notEmpty name="work" property="courseUnitDeliverableView">
<td>
/impl/src/web/user/courseunits/submitBlog.jsp
New file
0,0 → 1,14
<%@ page import="pt.estgp.estgweb.domain.Teacher" %>
<%@ page import="pt.estgp.estgweb.domain.TeacherImpl" %>
<%@ 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-nested.tld" prefix="nested" %>
<%@ 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" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<div id="contentCourseUnit">
<jsp:include page="/admin/blogs/submitBlog.jsp"/>
</div>
/impl/src/web/user/courseunits/students.jsp
New file
0,0 → 1,35
<%@ 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" %>
<%@ 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" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<div id="contentCourseUnit">
<table class="dataTable">
<tr>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="user"/></th>
<th><bean:message key="email"/></th>
</tr>
<logic:iterate id="student" name="CourseUnitView" property="students" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<td>
${student.code}
</td>
<td>
${student.name}
</td>
<td>
${student.username}
</td>
<td>
${student.email}
</td>
</tr>
</logic:iterate>
</table>
</div>
/impl/src/web/user/courseunits/topnavLoadBlog.jsp
New file
0,0 → 1,21
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%@ page import="pt.estgp.estgweb.domain.views.BlogView" %>
<%
if (request.getAttribute("BlogView") != null)
{
BlogView bV = (BlogView) request.getAttribute("BlogView");
request.setAttribute("CourseUnitView", bV.getCourseUnitView());
}
%>
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "course",CourseUnitView.getCourseName());
topNav.addNavPlace("/user/startLoadCourseUnitFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "courseunit",CourseUnitView.getName());
topNav.addNavPlace(null, "blog");
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/courseunits/courseunitassignement.jsp
14,102 → 14,136
<jsp:useBean id="CourseUnitAssignementView" type="pt.estgp.estgweb.domain.views.CourseUnitAssignementView" scope="request"/>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<div id="contentCourseUnit">
<html:errors/>
<jomm:messages/>
<div class="seccao">
<h2>
<bean:message key="courseunit.assignement" arg0="${CourseUnitAssignementView.title}"/>
</h2>
<html:errors/>
<jomm:messages/>
<div class="seccao">
<h2>
<bean:message key="courseunit.assignement" arg0="${CourseUnitAssignementView.title}"/>
</h2>
 
 
<div class="form blockForm">
<table>
<tr>
<th>
<bean:message key="courseunit.title"/>
</th>
<td>
<bean:write name="CourseUnitAssignementView" property="title"/>
<div class="form blockForm">
<table>
<tr>
<th>
<bean:message key="courseunit.title"/>
</th>
<td>
<bean:write name="CourseUnitAssignementView" property="title"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.date"/>
</th>
<td>
<bean:write name="CourseUnitAssignementView" property="deliverDate"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.type"/>
</th>
<td>
<bean:message key="courseunit.assignement.deliver.type.${CourseUnitAssignementView.deliverType}"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.late.permission"/>
</th>
<td>
<logic:equal value="true" name="CourseUnitAssignementView" property="lateDelivers">
<bean:message key="yes"/>
</logic:equal>
<logic:notEqual value="true" name="CourseUnitAssignementView" property="lateDelivers">
<bean:message key="no"/>
</logic:notEqual>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.description"/>
</th>
<td>
<bean:write name="CourseUnitAssignementView" property="description"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.status"/>
</th>
<td>
<logic:equal value="true" name="CourseUnitAssignementView" property="status">
<bean:message key="status.active"/>
</logic:equal>
<logic:notEqual value="true" name="CourseUnitAssignementView" property="status">
<bean:message key="status.inactive"/>
</logic:notEqual>
</td>
</tr>
<logic:notEmpty name="CourseUnitAssignementView" property="workFile">
<tr>
<th>
<bean:message key="courseunit.assignement.file"/>
</th>
<td>
<a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${CourseUnitAssignementView.workFile}"><bean:message key="courseunit.assignement.file"/></a>
</td>
</tr>
</logic:notEmpty>
</table>
</div>
<nested:form action="/user/courseUnitControllerFromHome">
<input type="hidden" name="dispatch" value="updateDeliverables">
<html:hidden property="courseUnitAssignementView.id" value="${CourseUnitAssignementView.id}"/>
 
<html:hidden property="courseUnitView.id" value="${CourseUnitView.id}"/>
 
<table class="dataTable">
<tr>
<th><bean:message key="courseunit.assignement.delivered.date"/></th>
<th><bean:message key="courseunit.assignement.deliver.time"/></th>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="courseunit.assignement.deliver.version"/></th>
<th><bean:message key="courseunit.assignement.deliver.grade"/></th>
<th><bean:message key="courseunit.assignement.deliver.obs"/></th>
</tr>
<nested:iterate id="deliverable" property="courseUnitAssignementView.deliverables" type="pt.estgp.estgweb.domain.views.CourseUnitDeliverableView">
<tr>
<td>${deliverable.deliverDateStr} </td>
<logic:equal name="deliverable" property="lateDeliver" value="true">
<td class="statusERROR">
<bean:message key="courseunit.assignement.deliver.time.late"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.date"/>
</th>
<td>
<bean:write name="CourseUnitAssignementView" property="deliverDate"/>
</logic:equal>
<logic:notEqual name="deliverable" property="lateDeliver" value="true">
<td class="statusOK">
<bean:message key="courseunit.assignement.deliver.time.ok"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.type"/>
</th>
<td>
<bean:message key="courseunit.assignement.deliver.type.${CourseUnitAssignementView.deliverType}"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.assignement.deliver.late.permission"/>
</th>
<td>
<logic:equal value="true" name="CourseUnitAssignementView" property="lateDelivers">
<bean:message key="yes"/>
</logic:equal>
<logic:notEqual value="true" name="CourseUnitAssignementView" property="lateDelivers">
<bean:message key="no"/>
</logic:notEqual>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.description"/>
</th>
<td>
<bean:write name="CourseUnitAssignementView" property="description"/>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.status"/>
</th>
<td>
<logic:equal value="true" name="CourseUnitAssignementView" property="status">
<bean:message key="status.active"/>
</logic:equal>
<logic:notEqual value="true" name="CourseUnitAssignementView" property="status">
<bean:message key="status.inactive"/>
</logic:notEqual>
</td>
</tr>
</table>
</div>
<table class="dataTable">
<tr>
<th><bean:message key="courseunit.assignement.deliver.date"/></th>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="courseunit.assignement.deliver.version"/></th>
</logic:notEqual>
<td>${deliverable.student.code}</td>
<td>${deliverable.student.name}</td>
<td><a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${deliverable.fileStreamId}"><bean:message key="courseunit.assignement.deliver.version"/> (${deliverable.deliverDateStr})</a></td>
<td>
<nested:hidden property="id"/>
<nested:text property="grade"/>
</td>
<td>
<%--<a href="javascript:showOrHide('obs${deliverable.id}')"><bean:message key="courseunit.assignement.deliver.show.obs"/></a>--%>
 
<nested:textarea styleId="obs${deliverable.id}" styleClass="textarea" property="obs"/>
 
</td>
</tr>
<logic:iterate id="deliverable" name="CourseUnitAssignementView" property="deliverables" type="pt.estgp.estgweb.domain.views.CourseUnitDeliverableView">
<tr>
<td>${deliverable.deliverDateStr} </td>
<logic:equal name="deliverable" property="lateDeliver" value="true">
<td class="statusERROR">
<bean:message key="courseunit.assignement.deliver.time.late"/>
</td>
</logic:equal>
<logic:notEqual name="deliverable" property="lateDeliver" value="true">
<td class="statusOK">
<bean:message key="courseunit.assignement.deliver.time.ok"/>
</td>
</logic:notEqual>
<td>${deliverable.student.code}</td>
<td>${deliverable.student.name}</td>
<td><a target="_blank" href="<%=request.getContextPath()%>/repositoryStream/${deliverable.fileStreamId}"><bean:message key="courseunit.assignement.deliver.version"/> (${deliverable.deliverDateStr})</a></td>
</tr>
 
</logic:iterate>
</table>
</div>
</nested:iterate>
<tr>
<td colspan="7">
<input type="button" onclick="this.form.submit()" value="<bean:message key="confirm"/>"/>
</td>
</tr>
</table>
</nested:form>
</div>
</div>
/impl/src/web/user/courseunits/topnavCreateBlog.jsp
New file
0,0 → 1,21
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%@ page import="pt.estgp.estgweb.domain.views.BlogView" %>
<%
if (request.getAttribute("BlogView") != null)
{
BlogView bV = (BlogView) request.getAttribute("BlogView");
request.setAttribute("CourseUnitView", bV.getCourseUnitView());
}
%>
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "course",CourseUnitView.getCourseName());
topNav.addNavPlace("/user/startLoadCourseUnitFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "courseunit",CourseUnitView.getName());
topNav.addNavPlace(null, "submit.blog");
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/courseunits/courseunit.jsp
14,7 → 14,7
<html:form styleClass="form" action="/user/courseUnitControllerFromHome" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="update"/>
<html:hidden property="courseUnitView.id"/>
<h1>${CourseUnitView.name}</h1>
<h1>${CourseUnitView.name} (${CourseUnitView.code})</h1>
<div class="seccao">
<h2><bean:message key="courseunit.objectives"/></h2>
<p>
47,4 → 47,46
</baco:canManage>
 
</html:form>
 
<div class="seccao">
<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>
<logic:iterate id="teacher" name="CourseUnitView" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<td>
${teacher.code}
</td>
<td>
${teacher.name}
</td>
<td>
${teacher.email}
</td>
</tr>
</logic:iterate>
</table>
</div>
<div class="seccao">
<h2><bean:message key="module.Announcements"/></h2>
<logic:notEmpty name="CourseUnitView" property="announcements">
<div class="listCircleWhite">
<ul>
<logic:iterate id="announcement" name="CourseUnitView" property="announcements" type="pt.estgp.estgweb.domain.views.AnnouncementView">
<li>
<h3>${announcement.title}</h3>
<p>${announcement.text}</p>
</li>
</logic:iterate>
</ul>
</div>
</logic:notEmpty>
<logic:empty name="CourseUnitView" property="announcements">
<p><bean:message key="announcement.zero.placed"/></p>
</logic:empty>
</div>
</div>
/impl/src/web/user/courseunits/topnavLoadBlogMonth.jsp
New file
0,0 → 1,18
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="jomm.web.utils.NavPlaceServer" %>
<%@ page import="jomm.web.utils.TopNav" %>
<jsp:useBean id="BlogView" type="pt.estgp.estgweb.domain.views.BlogView" scope="request"/>
<%
request.setAttribute("CourseUnitView",BlogView.getCourseUnitView());
%>
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "course",CourseUnitView.getCourseName());
topNav.addNavPlace("/user/startLoadCourseUnitFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "courseunit",CourseUnitView.getName());
topNav.addNavPlace("/user/startLoadBlogFromHome.do?id="+BlogView.getId(), "blog","(" + BlogView.getTitle() + ")");
topNav.addNavPlace(null, "month." + BlogView.getMonth() + ".year",""+ BlogView.getYear());
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/courseunits/blog.jsp
New file
0,0 → 1,14
<%@ page import="pt.estgp.estgweb.domain.Teacher" %>
<%@ page import="pt.estgp.estgweb.domain.TeacherImpl" %>
<%@ 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-nested.tld" prefix="nested" %>
<%@ 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" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<div id="contentCourseUnit">
<jsp:include page="/public/blogs/blog.jsp"/>
</div>
/impl/src/web/user/home/topnavCourseUnitAssignement.jsp
8,7 → 8,7
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "course",CourseUnitView.getCourseName());
topNav.addNavPlace(null, "courseunit",CourseUnitView.getName());
topNav.addNavPlace("/user/startLoadCourseUnitFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "courseunit",CourseUnitView.getName());
topNav.addNavPlace("/user/startLoadCourseUnitWorksFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "course.unit.works");
topNav.addNavPlace(null, "courseunit.assignement", CourseUnitAssignementView.getTitle());
%>
/impl/src/web/user/home/topnavCourseUnitWorks.jsp
7,7 → 7,7
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "course",CourseUnitView.getCourseName());
topNav.addNavPlace(null, "courseunit",CourseUnitView.getName());
topNav.addNavPlace("/user/startLoadCourseUnitFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "courseunit",CourseUnitView.getName());
topNav.addNavPlace(null, "course.unit.works");
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/home/topnavCourseUnitStudents.jsp
New file
0,0 → 1,13
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<jsp:useBean id="CourseUnitView" type="pt.estgp.estgweb.domain.views.CourseUnitView" scope="request"/>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "course",CourseUnitView.getCourseName());
topNav.addNavPlace("/user/startLoadCourseUnitFromHome.do?courseUnitView.id=" + CourseUnitView.getId(), "courseunit",CourseUnitView.getName());
topNav.addNavPlace(null, "courseunit.students");
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/xsd/curso_EC.xml
New file
0,0 → 1,791
<?xml version="1.0" encoding="UTF-8"?>
<curso xmlns="http://www.estgp.pt/xsd/planoestudos/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.estgp.pt/xsd/planoestudos/1.0/ planoestudos.xsd">
<nome>Engenharia Civil</nome>
<area>EG</area>
<semestre id="S1">
<unidade>
<nome>Análise Matemática I</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Álgebra Linear e Geometria</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Física Geral</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Mineralogia e Geologia</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Topografia e Cartografia</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Desenho de Construção</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência I</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</semestre>
<!--1º semestre de EC-->
<semestre id="S2">
<unidade>
<nome>Análise Matemática II</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Mecânica</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Impacto e Gestão Ambiental</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Química Geral</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Probabilidades e Estatística</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Hidráulica Geral</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência II</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</semestre>
<!--2º semestre de EC-->
<semestre id="S3">
<unidade>
<nome>Análise Matemática III</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Resistência de Materiais I</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Hidráulica Aplicada</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Geologia da Engenharia</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Métodos e Tecnologias da Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Planeamento Regional e Urbano</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência III</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</semestre>
<!--\\3º semestre de EC-->
<semestre id="S4">
<perfil nome="Perfil de Estruturas e Construção">
<unidade>
<nome>Análise de Estruturas</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Física das Construções</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Mecânica de Solos</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Abastecimento de Água e Saneamento</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Materiais Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Resistência de Materiais II</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência IV</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</perfil>
<perfil nome="Planeamento e Infra-Estruturas">
<unidade>
<nome>Análise de Estruturas</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Física das Construções</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Mecânica de Solos</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Abastecimento de Água e Saneamento</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Materiais Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Hidrologia e Infra-Estruturas Hidráulicas</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência IV</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</perfil>
</semestre>
<semestre id="S5">
<perfil nome="Perfil de Estruturas e Construção">
<unidade>
<nome>Betão Armado</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Organização de Obras e Estaleiros</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Vias de Comunicação I</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Conservação e Reabilitação</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Estruturas Metálicas</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Engenharia Sísmica</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência V</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</perfil>
<perfil nome="Planeamento e Infra-Estruturas">
<unidade>
<nome>Betão Armado</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Organização de Obras e Estaleiros</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Vias de Comunicação I</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Urbanização e Transportes</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Sistemas de Informação Geográfica</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Administração Pública e Gestão Municipal</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência V</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</perfil>
</semestre>
<semestre id="S6">
<perfil nome="Perfil de Estruturas e Construção">
<unidade>
<nome>Qualidade na Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Qualidade na Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Fundações e Estruturas de Suporte</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Betão Armado e Pré-Esforçado</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Direcção de Obras</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Economia e Gestão de Empreendimentos</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Projecto de Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência VI</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</perfil>
<perfil nome="Planeamento e Infra-Estruturas">
<unidade>
<nome>Qualidade na Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Qualidade na Construção</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Equipamentos Regionais e Urbanos</nome>
<area>Engenharias</area>
<totalHoras>65</totalHoras>
<horasContacto>
<T>15</T>
<TP>15</TP>
<OT>15</OT>
</horasContacto>
<ECTS>2.5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Vias de Comunicação II</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Gestão e Avaliação de Sistemas e Projectos</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Projecto de Planeamento/Infra-Estruturas</nome>
<area>Engenharias</area>
<totalHoras>130</totalHoras>
<horasContacto>
<T>30</T>
<TP>30</TP>
<OT>30</OT>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
<unidade>
<nome>Unidade de Transferência VI</nome>
<area>Engenharias</area>
<totalHoras>150</totalHoras>
<horasContacto>
<PL>30</PL>
<TC>15</TC>
</horasContacto>
<ECTS>5</ECTS>
<obs/>
</unidade>
</perfil>
</semestre>
</curso>
/impl/src/xsd/planoestudos.xsd
1,77 → 1,82
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 sp2 U (http://www.altova.com) by Jorge Machado (BN) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.estgp.pt/xsd/planoestudos/1.0/"
targetNamespace="http://www.estgp.pt/xsd/planoestudos/1.0/" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:element name="curso">
<xsd:annotation>
<xsd:documentation></xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="area">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="CH"/>
<xsd:enumeration value="CE"/>
<xsd:enumeration value="DG"/>
<xsd:enumeration value="EG"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="semestre" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="unidade" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="area" type="xsd:string"/>
<xsd:element name="totalHoras" type="xsd:int"/>
<xsd:element name="horasContacto">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="T" type="xsd:int" minOccurs="0"/>
<xsd:element name="TP" type="xsd:int" minOccurs="0"/>
<xsd:element name="P" type="xsd:int" minOccurs="0"/>
<xsd:element name="PL" type="xsd:int" minOccurs="0"/>
<xsd:element name="PD" type="xsd:int" minOccurs="0"/>
<xsd:element name="OT" type="xsd:int" minOccurs="0"/>
<xsd:element name="E" type="xsd:int" minOccurs="0"/>
<xsd:element name="S" type="xsd:int" minOccurs="0"/>
<xsd:element name="TC" type="xsd:int" minOccurs="0"/>
<xsd:element name="O" type="xsd:int" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ECTS" type="xsd:int"/>
<xsd:element name="obs" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="S1"/>
<xsd:enumeration value="S2"/>
<xsd:enumeration value="S3"/>
<xsd:enumeration value="S4"/>
<xsd:enumeration value="S5"/>
<xsd:enumeration value="S6"/>
<xsd:enumeration value="S7"/>
<xsd:enumeration value="S8"/>
<xsd:enumeration value="S9"/>
<xsd:enumeration value="S10"/>
<xsd:enumeration value="S11"/>
<xsd:enumeration value="S12"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.estgp.pt/xsd/planoestudos/1.0/" targetNamespace="http://www.estgp.pt/xsd/planoestudos/1.0/" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="curso">
<xsd:annotation>
<xsd:documentation/>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="area">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="CH"/>
<xsd:enumeration value="CE"/>
<xsd:enumeration value="DG"/>
<xsd:enumeration value="EG"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="semestre" maxOccurs="unbounded">
<xsd:complexType>
<xsd:choice>
<xsd:element name="unidade" type="unidadeType" maxOccurs="unbounded"></xsd:element>
<xsd:element name="perfil" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="unidade" type="unidadeType" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="nome" use="required" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
<xsd:attribute name="id" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="S1"/>
<xsd:enumeration value="S2"/>
<xsd:enumeration value="S3"/>
<xsd:enumeration value="S4"/>
<xsd:enumeration value="S5"/>
<xsd:enumeration value="S6"/>
<xsd:enumeration value="S7"/>
<xsd:enumeration value="S8"/>
<xsd:enumeration value="S9"/>
<xsd:enumeration value="S10"/>
<xsd:enumeration value="S11"/>
<xsd:enumeration value="S12"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="unidadeType">
<xsd:sequence>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="area" type="xsd:string"/>
<xsd:element name="totalHoras" type="xsd:int"/>
<xsd:element name="horasContacto">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="T" type="xsd:int" minOccurs="0"/>
<xsd:element name="TP" type="xsd:int" minOccurs="0"/>
<xsd:element name="P" type="xsd:int" minOccurs="0"/>
<xsd:element name="PL" type="xsd:int" minOccurs="0"/>
<xsd:element name="PD" type="xsd:int" minOccurs="0"/>
<xsd:element name="OT" type="xsd:int" minOccurs="0"/>
<xsd:element name="E" type="xsd:int" minOccurs="0"/>
<xsd:element name="S" type="xsd:int" minOccurs="0"/>
<xsd:element name="TC" type="xsd:int" minOccurs="0"/>
<xsd:element name="O" type="xsd:int" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ECTS" type="xsd:float"/>
<xsd:element name="obs" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>