diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java index 49b730e08beb67b09a44b1e02092cd9199928761..4add7a97724b22b33001b95ad3f55316b156150c 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurity.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java @@ -61,6 +61,14 @@ public interface BaseSecurity { */ public boolean isIdentityPermittedOnResourceable(Identity identity, String permission, OLATResourceable olatResourceable); + /** + * Return the list of "allowed to..." + * @param identity + * @param olatResourceable + * @return + */ + public List<String> getIdentityPermissionOnresourceable(Identity identity, OLATResourceable olatResourceable); + /** * Get the identity's roles * diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index 2bc66bb454b4290ef934b867bae1b595b419b0fd..404d4997c6c50390a3cafa6c8b27bf90e8444c2d 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -303,6 +303,21 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity { return query.getResultList(); } + @Override + public List<String> getIdentityPermissionOnresourceable(Identity identity, OLATResourceable olatResourceable) { + Long oresid = olatResourceable.getResourceableId(); + if (oresid == null) { + oresid = new Long(0); + } + List<String> permissions = dbInstance.getCurrentEntityManager() + .createNamedQuery("getIdentityPermissionsOnResourceableCheckType", String.class) + .setParameter("identitykey", identity.getKey()) + .setParameter("resid", oresid) + .setParameter("resname", olatResourceable.getResourceableTypeName()) + .getResultList(); + return permissions; + } + public boolean isIdentityPermittedOnResourceable(Identity identity, String permission, OLATResourceable olatResourceable) { return isIdentityPermittedOnResourceable(identity, permission, olatResourceable, true); } diff --git a/src/main/java/org/olat/basesecurity/PolicyImpl.hbm.xml b/src/main/java/org/olat/basesecurity/PolicyImpl.hbm.xml index d4ce888b5daa73178ac987c84d2af5769f447f4d..2a631652e3452110c3677a762a9549ae0b6c2dd4 100644 --- a/src/main/java/org/olat/basesecurity/PolicyImpl.hbm.xml +++ b/src/main/java/org/olat/basesecurity/PolicyImpl.hbm.xml @@ -43,6 +43,9 @@ <query name="isIdentityPermittedOnResourceable"> <![CDATA[select count(poi) from org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi, org.olat.basesecurity.PolicyImpl as poi, org.olat.resource.OLATResourceImpl as ori where sgmsi.identity.key = :identitykey and sgmsi.securityGroup = poi.securityGroup and poi.permission = :permission and poi.olatResource = ori and (ori.resId = :resid) and ori.resName = :resname]]> </query> + <query name="getIdentityPermissionsOnResourceableCheckType"> + <![CDATA[select distinct poi.permission from org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi, org.olat.basesecurity.PolicyImpl as poi, org.olat.resource.OLATResourceImpl as ori where sgmsi.identity.key=:identitykey and sgmsi.securityGroup=poi.securityGroup and poi.olatResource=ori and (ori.resId=:resid or ori.resId=0) and ori.resName=:resname]]> + </query> </hibernate-mapping> diff --git a/src/main/java/org/olat/core/util/vfs/version/FolderVersioningConfigurator.java b/src/main/java/org/olat/core/util/vfs/version/FolderVersioningConfigurator.java index 47e4e356b82e4ea25ceb78b061c7a1c6274a6718..97bfd3b0e4b698190caef8fcf55f6d2eabdd904a 100644 --- a/src/main/java/org/olat/core/util/vfs/version/FolderVersioningConfigurator.java +++ b/src/main/java/org/olat/core/util/vfs/version/FolderVersioningConfigurator.java @@ -32,6 +32,12 @@ import org.olat.core.util.vfs.VFSContainer; * @author srosse */ public interface FolderVersioningConfigurator { + + /** + * The absolut limit for this instance + * @return -1 for versioning without limit, 0 for no versioning, 1 - n is the maximum number of revision per file + */ + public int getMaxNumOfVersionsAllowed(); /** * @param relPath diff --git a/src/main/java/org/olat/core/util/vfs/version/SimpleVersionConfig.java b/src/main/java/org/olat/core/util/vfs/version/SimpleVersionConfig.java index 45559de0e7e5b2db78ba97f58b2ebfd90a888275..3b9deab164038161509af11f2c8faa65824517fd 100644 --- a/src/main/java/org/olat/core/util/vfs/version/SimpleVersionConfig.java +++ b/src/main/java/org/olat/core/util/vfs/version/SimpleVersionConfig.java @@ -129,6 +129,12 @@ public class SimpleVersionConfig implements GenericEventListener, FolderVersioni } } + @Override + public int getMaxNumOfVersionsAllowed() { + return getVersionAllowed(); + } + + @Override public int versionAllowed(String relPath) { if(StringHelper.containsNonWhitespace(relPath)) { if(relPath.startsWith("/tmp/")//no versioning in tmp diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java index 5483423af1a189d9a1072efa2fb94326beee6ea3..340396e2c5834e9a187857ef8ee4d333f5384d67 100644 --- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java +++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java @@ -91,6 +91,8 @@ public class VersionsFileManager extends VersionsManager implements Initializabl private File rootFolder; private File rootVersionFolder; private VFSContainer rootVersionsContainer; + + private FolderVersioningConfigurator versioningConfigurator; /** * [spring] @@ -98,6 +100,16 @@ public class VersionsFileManager extends VersionsManager implements Initializabl private VersionsFileManager() { INSTANCE = this; } + + /** + * [used by Spring] + * @param versioningConfigurator + */ + public void setVersioningConfigurator(FolderVersioningConfigurator versioningConfigurator) { + this.versioningConfigurator = versioningConfigurator; + } + + @Override public Versions createVersionsFor(VFSLeaf leaf) { @@ -543,6 +555,11 @@ public class VersionsFileManager extends VersionsManager implements Initializabl */ @Override public boolean addToRevisions(Versionable currentVersion, Identity identity, String comment) { + int maxNumOfVersions = versioningConfigurator.getMaxNumOfVersionsAllowed(); + if(maxNumOfVersions == 0) { + return true;//deactivated, return all ok + } + VFSLeaf currentFile = (VFSLeaf) currentVersion; VFSLeaf versionFile = getCanonicalVersionXmlFile(currentFile, true); @@ -603,6 +620,16 @@ public class VersionsFileManager extends VersionsManager implements Initializabl if (identity != null) { versions.setAuthor(identity.getName()); } + + if(maxNumOfVersions >= 0 && versions.getRevisions().size() >= maxNumOfVersions) { + List<VFSRevision> revisions = versions.getRevisions(); + int numOfVersionsToDelete = Math.min(revisions.size(), (revisions.size() - maxNumOfVersions) + 1); + if(numOfVersionsToDelete > 0) { + List<VFSRevision> versionsToDelete = revisions.subList(0, numOfVersionsToDelete); + deleteRevisions(currentVersion, versionsToDelete); + versions = (VersionsFileImpl)currentVersion.getVersions(); + } + } versions.setComment(comment); versions.getRevisions().add(newRevision); versions.setRevisionNr(getNextRevisionNr(versions)); diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsManager.java b/src/main/java/org/olat/core/util/vfs/version/VersionsManager.java index 4049f5b6809d8107693ab2715119cdc52e43b199..b2c4bc35376e46c85c4db1794501544f6701381a 100644 --- a/src/main/java/org/olat/core/util/vfs/version/VersionsManager.java +++ b/src/main/java/org/olat/core/util/vfs/version/VersionsManager.java @@ -92,6 +92,14 @@ public abstract class VersionsManager extends BasicManager { */ public abstract boolean addVersion(Versionable currentVersion, Identity author, String comment, InputStream newVersion); + /** + * Add a new revision to the files. The method check the number of revisions against the absolute + * maximum limit for the instance. + * @param currentVersion + * @param author + * @param comment + * @return + */ public abstract boolean addToRevisions(Versionable currentVersion, Identity author, String comment); /** diff --git a/src/main/java/org/olat/core/util/vfs/version/_spring/versioningCorecontext.xml b/src/main/java/org/olat/core/util/vfs/version/_spring/versioningCorecontext.xml index e90c113ca672285588202ae8b29227e625124fd2..1bc1f9892ada5a798dd382b82c05c31d8b766528 100644 --- a/src/main/java/org/olat/core/util/vfs/version/_spring/versioningCorecontext.xml +++ b/src/main/java/org/olat/core/util/vfs/version/_spring/versioningCorecontext.xml @@ -5,7 +5,9 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> - <bean id="versionsManager" class="org.olat.core.util.vfs.version.VersionsFileManager" init-method="init"/> + <bean id="versionsManager" class="org.olat.core.util.vfs.version.VersionsFileManager" init-method="init"> + <property name="versioningConfigurator" ref="versioningConfigurator" /> + </bean> <bean id="versioningConfigurator" class="org.olat.core.util.vfs.version.SimpleVersionConfig" depends-on="coordinatorManager,org.olat.core.util.WebappHelper,folderModule"> diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java index b1104e23f4ae752e521b8aa5803e6f05f68889b2..0ad03dd2920787a85450a38384a3e1bc3a62c16f 100644 --- a/src/main/java/org/olat/course/PersistingCourseImpl.java +++ b/src/main/java/org/olat/course/PersistingCourseImpl.java @@ -47,6 +47,8 @@ import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback; +import org.olat.core.util.vfs.version.Versionable; +import org.olat.core.util.vfs.version.VersionsFileManager; import org.olat.core.util.xml.XStreamHelper; import org.olat.course.assessment.AssessmentHelper; import org.olat.course.config.CourseConfig; @@ -81,6 +83,8 @@ import com.thoughtworks.xstream.XStream; */ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializable { + private static final long serialVersionUID = -1022498371474445868L; + public static String COURSE_ROOT_DIR_NAME = "course"; private static final String EDITORTREEMODEL_XML = "editortreemodel.xml"; @@ -408,6 +412,12 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ VFSItem vfsItem = getCourseBaseContainer().resolve(fileName); if (vfsItem == null) { vfsItem = getCourseBaseContainer().createChildLeaf(fileName); + } else if(vfsItem.exists() && vfsItem instanceof Versionable) { + try { + VersionsFileManager.getInstance().addToRevisions((Versionable)vfsItem, null, ""); + } catch (Exception e) { + log.error("Cannot versioned " + fileName, e); + } } XStream xstream = CourseXStreamAliases.getWriteCourseXStream(); XStreamHelper.writeObject(xstream, (VFSLeaf)vfsItem, obj); diff --git a/src/main/java/org/olat/course/condition/interpreter/InLearningGroupFunction.java b/src/main/java/org/olat/course/condition/interpreter/InLearningGroupFunction.java index ae284cad23056f60d08ef144e0c59db24e567e73..ec23c4c5ed215500a664cec4a77308fb47d0c127 100644 --- a/src/main/java/org/olat/course/condition/interpreter/InLearningGroupFunction.java +++ b/src/main/java/org/olat/course/condition/interpreter/InLearningGroupFunction.java @@ -81,21 +81,17 @@ public class InLearningGroupFunction extends AbstractFunction { return defaultValue(); } - /* - * the real function evaluation which is used during run time - */ - Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); - - CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); - //System.out.println("todo: check if "+(ident==null? "n/a":ident.getName())+" is in group "+groupName); - + //the real function evaluation which is used during run time if(isGroupKey(groupName)) { Long groupKey = Long.parseLong(groupName); - return cgm.isIdentityInGroup(ident, groupKey) ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE; + return getUserCourseEnv().isIdentityInCourseGroup(groupKey) ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE; + //return cgm.isIdentityInGroup(ident, groupKey) ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE; } - + + CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); List<Long> groupKeys = CoreSpringFactory.getImpl(BusinessGroupService.class).toGroupKeys(groupName, cgm.getCourseResource()); if(!groupKeys.isEmpty()) { + Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); return cgm.isIdentityInGroup(ident, groupKeys.get(0)) ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE; } return ConditionInterpreter.INT_FALSE; diff --git a/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java b/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java index 1a62b862826e1f71e8ab216cfc83b3bf089c50bb..46c504c9ba97d3b0fcd5ce645ba1f80a9de47fd1 100644 --- a/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java +++ b/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java @@ -29,7 +29,6 @@ import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.course.editor.CourseEditorEnv; -import org.olat.course.groupsandrights.CourseGroupManager; import org.olat.course.run.userview.UserCourseEnvironment; /** @@ -65,10 +64,11 @@ public class IsCourseAdministratorFunction extends AbstractFunction { return defaultValue(); } - Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); - CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); - boolean isCourseAdmin = cgm.isIdentityCourseAdministrator(ident); + //Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); + //CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); + boolean isCourseAdmin = getUserCourseEnv().isAdmin();// cgm.isIdentityCourseAdministrator(ident); if(log.isDebug()) { + Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); log.debug("identity "+ident.getName()+", courseadministrator:"+isCourseAdmin+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId()); } return isCourseAdmin ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE; diff --git a/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java b/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java index 25b1970c3f7f57f6af0e2a9bf36337191bcb2e4b..eccec7280b47e795cffc367c828478a29da30f48 100644 --- a/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java +++ b/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java @@ -29,7 +29,6 @@ import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.course.editor.CourseEditorEnv; -import org.olat.course.groupsandrights.CourseGroupManager; import org.olat.course.run.userview.UserCourseEnvironment; /** @@ -61,18 +60,16 @@ public class IsCourseCoachFunction extends AbstractFunction { return defaultValue(); } - Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); - CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); - boolean isCourseCoach = cgm.isIdentityCourseCoach(ident); + //CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); + boolean isCourseCoach = this.getUserCourseEnv().isCoach();// cgm.isIdentityCourseCoach(ident); if (log.isDebug()) { + Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); log.debug("identity "+ident.getName()+", coursecoach:"+isCourseCoach+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId()); } - return isCourseCoach ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE; } protected Object defaultValue() { return ConditionInterpreter.INT_TRUE; } - } diff --git a/src/main/java/org/olat/course/condition/interpreter/IsCourseParticipantFunction.java b/src/main/java/org/olat/course/condition/interpreter/IsCourseParticipantFunction.java index 62e093cf99e0d1cf6f7d86b7c9dda311ddc034b8..5822f64706c56cd2a51d0f5fb2ec0cc4ea9fe42b 100644 --- a/src/main/java/org/olat/course/condition/interpreter/IsCourseParticipantFunction.java +++ b/src/main/java/org/olat/course/condition/interpreter/IsCourseParticipantFunction.java @@ -25,7 +25,6 @@ import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.course.editor.CourseEditorEnv; -import org.olat.course.groupsandrights.CourseGroupManager; import org.olat.course.run.userview.UserCourseEnvironment; /** @@ -63,10 +62,10 @@ public class IsCourseParticipantFunction extends AbstractFunction { return defaultValue(); } - Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); - CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); - boolean isParticipant = cgm.isIdentityCourseParticipant(ident); + //CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager(); + boolean isParticipant = getUserCourseEnv().isParticipant();// cgm.isIdentityCourseParticipant(ident); if (log.isDebug()) { + Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity(); log.debug("identity "+ident.getName()+", coursecoach:"+isParticipant+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId()); } diff --git a/src/main/java/org/olat/course/config/CourseConfigManagerImpl.java b/src/main/java/org/olat/course/config/CourseConfigManagerImpl.java index 89fec404f5b595545daa9e91c1675b96404cafdf..383883000e5fd3b5334f1e12564d20b4357883e7 100644 --- a/src/main/java/org/olat/course/config/CourseConfigManagerImpl.java +++ b/src/main/java/org/olat/course/config/CourseConfigManagerImpl.java @@ -25,10 +25,14 @@ package org.olat.course.config; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.manager.BasicManager; import org.olat.core.util.vfs.VFSConstants; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.version.Versionable; +import org.olat.core.util.vfs.version.VersionsFileManager; import org.olat.core.util.xml.XStreamHelper; import org.olat.course.CourseXStreamAliases; import org.olat.course.ICourse; @@ -44,6 +48,7 @@ import com.thoughtworks.xstream.XStream; */ public class CourseConfigManagerImpl extends BasicManager implements CourseConfigManager { + private static final OLog log = Tracing.createLoggerFor(CourseConfigManagerImpl.class); private static final CourseConfigManagerImpl INSTANCE = new CourseConfigManagerImpl(); @@ -114,6 +119,12 @@ public class CourseConfigManagerImpl extends BasicManager implements CourseConfi if (configFile == null) { // create new config file configFile = course.getCourseBaseContainer().createChildLeaf(COURSECONFIG_XML); + } else if(configFile.exists() && configFile instanceof Versionable) { + try { + VersionsFileManager.getInstance().addToRevisions((Versionable)configFile, null, ""); + } catch (Exception e) { + log.error("Cannot versioned CourseConfig.xml", e); + } } XStreamHelper.writeObject(configFile, courseConfig); } diff --git a/src/main/java/org/olat/course/editor/EditorUserCourseEnvironmentImpl.java b/src/main/java/org/olat/course/editor/EditorUserCourseEnvironmentImpl.java index fb7e38f1bbeb270b24a0363bb53af51ffc5748af..bfeea21f1d97747c1fe62644e34e88665f295ed8 100644 --- a/src/main/java/org/olat/course/editor/EditorUserCourseEnvironmentImpl.java +++ b/src/main/java/org/olat/course/editor/EditorUserCourseEnvironmentImpl.java @@ -25,8 +25,6 @@ package org.olat.course.editor; -import java.util.Map; - import org.olat.core.id.IdentityEnvironment; import org.olat.core.logging.AssertException; import org.olat.course.condition.interpreter.ConditionInterpreter; @@ -90,9 +88,24 @@ public class EditorUserCourseEnvironmentImpl implements UserCourseEnvironment { return sa; } - public Map getTempMap(Class owner, String key) { - // TODO Auto-generated method stub - return null; + @Override + public boolean isIdentityInCourseGroup(Long groupKey) { + //TODO OO-502 + return false; + } + + @Override + public boolean isAdmin() { + return false; } + @Override + public boolean isCoach() { + return false; + } + + @Override + public boolean isParticipant() { + return false; + } } diff --git a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java index 3251aaf5979068f5e1950be03f7a17877148d406..ac6a05bc51f2906a9d68fc28a49271fc9c069303 100644 --- a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java @@ -63,6 +63,14 @@ public interface CourseGroupManager { * @return true if user has course right, false otherwise */ public boolean hasRight(Identity identity, String courseRight); + + /** + * Return the users course rights in any of the available right group context of + * this course + * @param identity + * @return + */ + public List<String> getRights(Identity identity); /** * Checks if an identity is in a learning group with the given name in any diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java index 34b19facfa8fef004564390624d66a0b0dc48ccc..16f84d6ccbdff68292417b550fb80d9a0ca8562f 100644 --- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java @@ -120,6 +120,10 @@ public class PersistingCourseGroupManager extends BasicManager implements Course boolean hasRight = rightManager.hasBGRight(courseRight, identity, courseResource); return hasRight; } + + public List<String> getRights(Identity identity) { + return securityManager.getIdentityPermissionOnresourceable(identity, courseResource); + } @Override public boolean isIdentityInGroup(Identity identity, Long groupKey) { diff --git a/src/main/java/org/olat/course/nodes/SPCourseNode.java b/src/main/java/org/olat/course/nodes/SPCourseNode.java index 4434a438becd9bf4cf51234ae58694a7d1907638..774ab1b4c5fd02e869fe0a7c68448b38792f859a 100644 --- a/src/main/java/org/olat/course/nodes/SPCourseNode.java +++ b/src/main/java/org/olat/course/nodes/SPCourseNode.java @@ -26,7 +26,6 @@ package org.olat.course.nodes; import java.util.List; -import java.util.Map; import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; @@ -96,13 +95,8 @@ public class SPCourseNode extends AbstractAccessableCourseNode { UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) { updateModuleConfigDefaults(false); - String nodeId = ne.getCourseNode().getIdent(); - // obtain a temporary (as long as the users visits the course) map to store - // intermediate data - Map tmpstoremap = userCourseEnv.getTempMap(this.getClass(), nodeId); - VFSContainer container = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); - SPRunController runController = new SPRunController(wControl, ureq, tmpstoremap, userCourseEnv, this, container); + SPRunController runController = new SPRunController(wControl, ureq, userCourseEnv, this, container); return new NodeRunConstructionResult(runController); } diff --git a/src/main/java/org/olat/course/nodes/sp/SPRunController.java b/src/main/java/org/olat/course/nodes/sp/SPRunController.java index f17306aca4cc4f2352908eb7e62a17f0ddfb524f..2beb5d45e5b86958491bf8f90383c967f5f261be 100644 --- a/src/main/java/org/olat/course/nodes/sp/SPRunController.java +++ b/src/main/java/org/olat/course/nodes/sp/SPRunController.java @@ -83,7 +83,6 @@ public class SPRunController extends BasicController { private VFSContainer courseFolderContainer; private String fileName; - private final Map tempstorage; private boolean hasEditRights; private CustomLinkTreeModel linkTreeModel; @@ -101,9 +100,8 @@ public class SPRunController extends BasicController { * @param courseNode * @param courseFolderPath The course folder which contains the single page html file */ - public SPRunController(WindowControl wControl, UserRequest ureq, Map tempstorage, UserCourseEnvironment userCourseEnv, SPCourseNode courseNode, VFSContainer courseFolderContainer) { + public SPRunController(WindowControl wControl, UserRequest ureq, UserCourseEnvironment userCourseEnv, SPCourseNode courseNode, VFSContainer courseFolderContainer) { super(ureq,wControl); - this.tempstorage = tempstorage; this.courseNode = courseNode; this.config = courseNode.getModuleConfiguration(); this.userCourseEnv = userCourseEnv; @@ -153,8 +151,7 @@ public class SPRunController extends BasicController { // refire to listening controllers fireEvent(ureq, event); } else if (event instanceof NewInlineUriEvent) { - NewInlineUriEvent nue = (NewInlineUriEvent)event; - tempstorage.put(KEY_CURRENT_URI, nue.getNewUri()); + //do nothing } } } diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java index e4d879f450320f54f3564d5c3aaa3a8bb29bd5bb..f7b4e8948b0caab532fd6ce26fc7a3543a49e3ad 100644 --- a/src/main/java/org/olat/course/run/RunMainController.java +++ b/src/main/java/org/olat/course/run/RunMainController.java @@ -109,7 +109,6 @@ import org.olat.course.run.glossary.CourseGlossaryFactory; import org.olat.course.run.glossary.CourseGlossaryToolLinkController; import org.olat.course.run.navigation.NavigationHandler; import org.olat.course.run.navigation.NodeClickedRef; -import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironmentImpl; import org.olat.course.statistic.StatisticMainController; import org.olat.group.BusinessGroup; @@ -156,7 +155,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene private StackedController all; private NavigationHandler navHandler; - private UserCourseEnvironment uce; + private UserCourseEnvironmentImpl uce; private LayoutMain3ColsController columnLayoutCtr; private Controller currentToolCtr; @@ -168,9 +167,6 @@ public class RunMainController extends MainLayoutBasicController implements Gene private Map<String, Boolean> courseRightsCache = new HashMap<String, Boolean>(); private boolean isCourseAdmin = false; private boolean isCourseCoach = false; - private List<BusinessGroup> ownedGroups; - private List<BusinessGroup> participatedGroups; - private List<BusinessGroup> waitingListGroups; private CourseNode currentCourseNode; private TreeModel treeModel; @@ -236,20 +232,19 @@ public class RunMainController extends MainLayoutBasicController implements Gene luTree.setExpandSelectedNode(false); contentP = new Panel("building_block_content"); - // get all group memberships for this course - initGroupMemberships(identity); // Initialize the the users roles and right for this course // 1) is guest flag isGuest = ureq.getUserSession().getRoles().isGuestOnly(); - // 2) all course internal rights - initUserRolesAndRights(identity); - // preload user assessment data in assessmnt properties cache to speed up // course loading course.getCourseEnvironment().getAssessmentManager().preloadCache(identity); // build up the running structure for this user; - uce = new UserCourseEnvironmentImpl(ureq.getUserSession().getIdentityEnvironment(), course.getCourseEnvironment()); + // get all group memberships for this course + uce = loadUserCourseEnvironment(ureq, course); + // 2) all course internal rights + reloadUserRolesAndRights(identity); + // build score now uce.getScoreAccounting().evaluateAll(); navHandler = new NavigationHandler(uce, false); @@ -336,6 +331,15 @@ public class RunMainController extends MainLayoutBasicController implements Gene } } + private UserCourseEnvironmentImpl loadUserCourseEnvironment(UserRequest ureq, ICourse course) { + CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); + List<BusinessGroup> coachedGroups = cgm.getOwnedBusinessGroups(ureq.getIdentity()); + List<BusinessGroup> participatedGroups = cgm.getParticipatingBusinessGroups(ureq.getIdentity()); + List<BusinessGroup> waitingLists = cgm.getWaitingListGroups(ureq.getIdentity()); + return new UserCourseEnvironmentImpl(ureq.getUserSession().getIdentityEnvironment(), course.getCourseEnvironment(), + coachedGroups, participatedGroups, waitingLists, null, null, null); + } + private void setLaunchDates(final Identity identity) { CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(createOLATResourceableForLocking(identity), new SyncerExecutor(){ public void execute() { @@ -365,7 +369,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene return extendedCourseTitle; } - private void initUserRolesAndRights(final Identity identity) { + private void reloadUserRolesAndRights(final Identity identity) { CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); // 1) course admins: users who are in repository entry owner group // if user has the role InstitutionalResourceManager and has the same institution like author @@ -377,14 +381,16 @@ public class RunMainController extends MainLayoutBasicController implements Gene isCourseCoach = cgm.isIdentityCourseCoach(identity); // 3) all other rights are defined in the groupmanagement using the learning // group rights + uce.setUserRoles(isCourseAdmin, isCourseCoach); - courseRightsCache.put(CourseRights.RIGHT_GROUPMANAGEMENT, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_GROUPMANAGEMENT))); - courseRightsCache.put(CourseRights.RIGHT_COURSEEDITOR, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_COURSEEDITOR))); - courseRightsCache.put(CourseRights.RIGHT_ARCHIVING, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_ARCHIVING))); - courseRightsCache.put(CourseRights.RIGHT_ASSESSMENT, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_ASSESSMENT))); - courseRightsCache.put(CourseRights.RIGHT_GLOSSARY, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_GLOSSARY))); - courseRightsCache.put(CourseRights.RIGHT_STATISTICS, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_STATISTICS))); - courseRightsCache.put(CourseRights.RIGHT_DB, new Boolean(cgm.hasRight(identity, CourseRights.RIGHT_DB))); + List<String> rights = cgm.getRights(identity); + courseRightsCache.put(CourseRights.RIGHT_GROUPMANAGEMENT, new Boolean(rights.contains(CourseRights.RIGHT_GROUPMANAGEMENT))); + courseRightsCache.put(CourseRights.RIGHT_COURSEEDITOR, new Boolean(rights.contains(CourseRights.RIGHT_COURSEEDITOR))); + courseRightsCache.put(CourseRights.RIGHT_ARCHIVING, new Boolean(rights.contains(CourseRights.RIGHT_ARCHIVING))); + courseRightsCache.put(CourseRights.RIGHT_ASSESSMENT, new Boolean(rights.contains(CourseRights.RIGHT_ASSESSMENT))); + courseRightsCache.put(CourseRights.RIGHT_GLOSSARY, new Boolean(rights.contains(CourseRights.RIGHT_GLOSSARY))); + courseRightsCache.put(CourseRights.RIGHT_STATISTICS, new Boolean(rights.contains(CourseRights.RIGHT_STATISTICS))); + courseRightsCache.put(CourseRights.RIGHT_DB, new Boolean(rights.contains(CourseRights.RIGHT_DB))); } /** @@ -547,7 +553,8 @@ public class RunMainController extends MainLayoutBasicController implements Gene needsRebuildAfterPublish = false; // rebuild up the running structure for this user, after publish; - uce = new UserCourseEnvironmentImpl(ureq.getUserSession().getIdentityEnvironment(), CourseFactory.loadCourse(course.getResourceableId()).getCourseEnvironment()); + course = CourseFactory.loadCourse(course.getResourceableId()); + uce = loadUserCourseEnvironment(ureq, course); // build score now uce.getScoreAccounting().evaluateAll(); navHandler = new NavigationHandler(uce, false); @@ -659,7 +666,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene logAudit("User tried to launch a group but user is not owner or participant " + "of group or group doesn't exist. Hacker attack or group has been changed or deleted. group key :: " + groupKey, null); // refresh toolbox that contained wrong group - initGroupMemberships(ureq.getIdentity()); + reloadGroupMemberships(ureq.getIdentity()); removeAsListenerAndDispose(toolC); toolC = initToolController(ureq.getIdentity(), ureq); listenTo(toolC); @@ -934,9 +941,9 @@ public class RunMainController extends MainLayoutBasicController implements Gene // was adding or removing of the user if (bgme.wasMyselfAdded(identity) || bgme.wasMyselfRemoved(identity)) { // 1) reinitialize all group memberships - initGroupMemberships(identity); + reloadGroupMemberships(identity); // 2) reinitialize the users roles and rights - initUserRolesAndRights(identity); + reloadUserRolesAndRights(identity); // 3) rebuild toolboxes with link to groups and tools removeAsListenerAndDispose(toolC); toolC = initToolController(identity, null); @@ -948,12 +955,12 @@ public class RunMainController extends MainLayoutBasicController implements Gene // check if this affects a right group where the user does participate. // if so, we need // to rebuild the toolboxes - if (PersistenceHelper.listContainsObjectByKey(participatedGroups, bgme.getModifiedGroupKey()) || - PersistenceHelper.listContainsObjectByKey(ownedGroups, bgme.getModifiedGroupKey())) { + if (PersistenceHelper.listContainsObjectByKey(uce.getParticipatingGroups(), bgme.getModifiedGroupKey()) || + PersistenceHelper.listContainsObjectByKey(uce.getCoachedGroups(), bgme.getModifiedGroupKey())) { // 1) reinitialize all group memberships - initGroupMemberships(identity); + reloadGroupMemberships(identity); // 2) reinitialize the users roles and rights - initUserRolesAndRights(identity); + reloadUserRolesAndRights(identity); // 3) rebuild toolboxes with link to groups and tools removeAsListenerAndDispose(toolC); toolC = initToolController(identity, null); @@ -1029,25 +1036,25 @@ public class RunMainController extends MainLayoutBasicController implements Gene } // 2) add coached groups - if (ownedGroups.size() > 0) { + if (uce.getCoachedGroups().size() > 0) { myTool.addHeader(translate("header.tools.ownerGroups")); - for (BusinessGroup group:ownedGroups) { + for (BusinessGroup group:uce.getCoachedGroups()) { myTool.addLink(CMD_START_GROUP_PREFIX + group.getKey().toString(), group.getName()); } } // 3) add participating groups - if (participatedGroups.size() > 0) { + if (uce.getParticipatingGroups().size() > 0) { myTool.addHeader(translate("header.tools.participatedGroups")); - for (BusinessGroup group: participatedGroups) { + for (BusinessGroup group: uce.getParticipatingGroups()) { myTool.addLink(CMD_START_GROUP_PREFIX + group.getKey().toString(), group.getName()); } } // 5) add waiting-list groups - if (waitingListGroups.size() > 0) { + if (uce.getWaitingLists().size() > 0) { myTool.addHeader(translate("header.tools.waitingListGroups")); - for (BusinessGroup group:waitingListGroups) { + for (BusinessGroup group:uce.getWaitingLists()) { int pos = businessGroupService.getPositionInWaitingListFor(identity, group); myTool.addLink(CMD_START_GROUP_PREFIX + group.getKey().toString(), group.getName() + "(" + pos + ")", group .getKey().toString(), null); @@ -1154,11 +1161,12 @@ public class RunMainController extends MainLayoutBasicController implements Gene * * @param identity */ - private void initGroupMemberships(Identity identity) { + private void reloadGroupMemberships(Identity identity) { CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); - ownedGroups = cgm.getOwnedBusinessGroups(identity); - participatedGroups = cgm.getParticipatingBusinessGroups(identity); - waitingListGroups = cgm.getWaitingListGroups(identity); + List<BusinessGroup> coachedGroups = cgm.getOwnedBusinessGroups(identity); + List<BusinessGroup> participatedGroups = cgm.getParticipatingBusinessGroups(identity); + List<BusinessGroup> waitingLists = cgm.getWaitingListGroups(identity); + uce.setGroupMemberships(coachedGroups, participatedGroups, waitingLists); } /** diff --git a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java index 0f4d51428e4d67e6a04c3aa1a00cbc6295bfed0b..028e3d8d6cb3e9d34dd9eb7fb82fa1cc556d0b2d 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java +++ b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java @@ -26,6 +26,7 @@ package org.olat.course.run.preview; import java.io.File; +import java.util.ArrayList; import java.util.List; import org.olat.core.id.Identity; @@ -80,7 +81,12 @@ final class PreviewCourseGroupManager extends BasicManager implements CourseGrou } throw new AssertException("unsupported"); } - + + @Override + public List<String> getRights(Identity identity) { + return new ArrayList<String>(1); + } + @Override public boolean isIdentityInGroup(Identity identity, Long groupKey) { for(BusinessGroup group:groups) { diff --git a/src/main/java/org/olat/course/run/userview/NodeEvaluation.java b/src/main/java/org/olat/course/run/userview/NodeEvaluation.java index 76835b753942e5ae9788503e41a2405b01b5c574..def2ee9967b6b0a18983ed21337b7cebea40718d 100644 --- a/src/main/java/org/olat/course/run/userview/NodeEvaluation.java +++ b/src/main/java/org/olat/course/run/userview/NodeEvaluation.java @@ -53,7 +53,7 @@ public class NodeEvaluation extends GenericNode { private CourseNode courseNode; private GenericTreeNode gtn = null; - private Map accesses = new HashMap(4); + private Map<String, Boolean> accesses = new HashMap<String, Boolean>(4); private boolean visible = false; private boolean atLeastOneAccessible = false; @@ -105,8 +105,8 @@ public class NodeEvaluation extends GenericNode { */ public void build() { // if at least one access capability is true - for (Iterator iter = accesses.values().iterator(); iter.hasNext();) { - Boolean entry = (Boolean) iter.next(); + for (Iterator<Boolean> iter = accesses.values().iterator(); iter.hasNext();) { + Boolean entry = iter.next(); atLeastOneAccessible = atLeastOneAccessible || entry.booleanValue(); } diff --git a/src/main/java/org/olat/course/run/userview/UserCourseEnvironment.java b/src/main/java/org/olat/course/run/userview/UserCourseEnvironment.java index 1f79b83bcce10607b6380e19d1888125682f23e6..0e39622998ff1e45dfcf94933e6aa710e0210240 100644 --- a/src/main/java/org/olat/course/run/userview/UserCourseEnvironment.java +++ b/src/main/java/org/olat/course/run/userview/UserCourseEnvironment.java @@ -25,8 +25,6 @@ package org.olat.course.run.userview; -import java.util.Map; - import org.olat.core.id.IdentityEnvironment; import org.olat.course.condition.interpreter.ConditionInterpreter; import org.olat.course.editor.CourseEditorEnv; @@ -54,16 +52,13 @@ public interface UserCourseEnvironment { public ScoreAccounting getScoreAccounting(); - /** - * @return a temporary map (lives as long as the user is visiting the course) - * @param owner the owning class - * @param key the key - * - * owner's classname and the key form a composite unique key / namespace - */ - public Map getTempMap(Class owner, String key); - + + public boolean isAdmin(); - //TODO: add a method like isCourseAdmin() to be offered in a conditioninterpreter function + public boolean isCoach(); + + public boolean isParticipant(); + public boolean isIdentityInCourseGroup(Long groupKey); + } \ No newline at end of file diff --git a/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java b/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java index 87843f4d1adeaa8c81c7bb05d023933357d8d985..340cc3878ccae8d0c0f92af991839c8b9f4faa6b 100644 --- a/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java +++ b/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java @@ -25,14 +25,16 @@ package org.olat.course.run.userview; -import java.util.HashMap; -import java.util.Map; +import java.util.List; +import org.olat.core.commons.persistence.PersistenceHelper; import org.olat.core.id.IdentityEnvironment; import org.olat.course.condition.interpreter.ConditionInterpreter; import org.olat.course.editor.CourseEditorEnv; +import org.olat.course.groupsandrights.CourseGroupManager; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.scoring.ScoreAccounting; +import org.olat.group.BusinessGroup; /** * Initial Date: Feb 6, 2004 @@ -44,48 +46,130 @@ public class UserCourseEnvironmentImpl implements UserCourseEnvironment { private CourseEnvironment courseEnvironment; private ConditionInterpreter conditionInterpreter; private ScoreAccounting scoreAccounting; - private Map allTempMaps = new HashMap(4); + + private List<BusinessGroup> coachedGroups; + private List<BusinessGroup> participatingGroups; + private List<BusinessGroup> waitingLists; + + private Boolean coach; + private Boolean admin; + private Boolean participant; public UserCourseEnvironmentImpl(IdentityEnvironment identityEnvironment, CourseEnvironment courseEnvironment) { + this(identityEnvironment, courseEnvironment, null, null, null, null, null, null); + } + + public UserCourseEnvironmentImpl(IdentityEnvironment identityEnvironment, CourseEnvironment courseEnvironment, + List<BusinessGroup> coachedGroups, List<BusinessGroup> participatingGroups, List<BusinessGroup> waitingLists, + Boolean coach, Boolean admin, Boolean participant) { this.courseEnvironment = courseEnvironment; this.identityEnvironment = identityEnvironment; this.scoreAccounting = new ScoreAccounting(this); this.conditionInterpreter = new ConditionInterpreter(this); + this.coachedGroups = coachedGroups; + this.participatingGroups = participatingGroups; + this.waitingLists = waitingLists; + this.coach = coach; + this.admin = admin; + this.participant = participant; } /** * @return Returns the courseEnvironment. */ + @Override public CourseEnvironment getCourseEnvironment() { return courseEnvironment; } - + + @Override public IdentityEnvironment getIdentityEnvironment() { return identityEnvironment; } + @Override public ConditionInterpreter getConditionInterpreter() { return conditionInterpreter; } + @Override public ScoreAccounting getScoreAccounting() { return scoreAccounting; } + @Override public CourseEditorEnv getCourseEditorEnv() { // return null signalling this is real user environment return null; } + + @Override + public boolean isIdentityInCourseGroup(Long groupKey) { + if(coachedGroups != null && participatingGroups != null) { + return PersistenceHelper.listContainsObjectByKey(participatingGroups, groupKey) + || PersistenceHelper.listContainsObjectByKey(coachedGroups, groupKey); + } + CourseGroupManager cgm = courseEnvironment.getCourseGroupManager(); + return cgm.isIdentityInGroup(identityEnvironment.getIdentity(), groupKey); + } + + @Override + public boolean isCoach() { + if(coach != null) { + return coach.booleanValue(); + } + //lazy loading + CourseGroupManager cgm = courseEnvironment.getCourseGroupManager(); + boolean coachLazy = cgm.isIdentityCourseCoach(identityEnvironment.getIdentity()); + coach = new Boolean(coachLazy); + return coachLazy; + } - public Map getTempMap(Class owner, String key) { - // thread safe since only called by the gui dispatch thread of one user - String compKey = owner.getName()+":"+key; - Map m = (Map) allTempMaps.get(compKey); - if (m == null) { - m = new HashMap(4); - allTempMaps.put(compKey, m); + @Override + public boolean isAdmin() { + if(admin != null) { + return admin.booleanValue(); } - return m; + //lazy loading + CourseGroupManager cgm = courseEnvironment.getCourseGroupManager(); + boolean admiLazy = cgm.isIdentityCourseAdministrator(identityEnvironment.getIdentity()); + admin = new Boolean(admiLazy); + return admiLazy; } + @Override + public boolean isParticipant() { + if(participant != null) { + return participant.booleanValue(); + } + //lazy loading + CourseGroupManager cgm = courseEnvironment.getCourseGroupManager(); + boolean partLazy = cgm.isIdentityCourseParticipant(identityEnvironment.getIdentity()); + participant = new Boolean(partLazy); + return partLazy; + } + + public List<BusinessGroup> getCoachedGroups() { + return coachedGroups; + } + + public List<BusinessGroup> getParticipatingGroups() { + return participatingGroups; + } + + public List<BusinessGroup> getWaitingLists() { + return waitingLists; + } + + public void setGroupMemberships(List<BusinessGroup> coachedGroups, List<BusinessGroup> participatingGroups, List<BusinessGroup> waitingLists) { + this.coachedGroups = coachedGroups; + this.participatingGroups = participatingGroups; + this.waitingLists = waitingLists; + } + + public void setUserRoles(boolean admin, boolean coach) { + this.admin = new Boolean(admin); + this.coach = new Boolean(coach); + this.participant = null;//reset it + } } diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java index ff6a582ed294b144303fb2839f0bc3b82adfff49..22f5a9043ff361b9821d234869f0f02c7064b832 100644 --- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java +++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java @@ -201,6 +201,12 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle return admin; } + protected boolean isEmpty() { + return groupListCtr == null ? true : + (groupListCtr.getTableDataModel() == null ? true : + groupListCtr.getTableDataModel().getRowCount() == 0); + } + @Override protected void doDispose() { // diff --git a/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java index 44a956cda85b438e610bd97aa11428f853be6fa9..bae424fc2738520d54f4a3515d1f4a5f51b47c01 100644 --- a/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java +++ b/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java @@ -65,8 +65,8 @@ public class OverviewBusinessGroupListController extends BasicController impleme mainVC = createVelocityContainer("group_list_overview"); - boolean marked = updateMarkedGroups(ureq).updateMarkedGroups(); - if(!marked) { + boolean markedEmpty = updateMarkedGroups(ureq).isEmpty(); + if(markedEmpty) { updateAllGroups(ureq); } @@ -74,10 +74,10 @@ public class OverviewBusinessGroupListController extends BasicController impleme segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); markedGroupsLink = LinkFactory.createLink("marked.groups", mainVC, this); markedGroupsLink.setElementCssClass("o_sel_group_bookmarked_groups_seg"); - segmentView.addSegment(markedGroupsLink, marked); + segmentView.addSegment(markedGroupsLink, !markedEmpty); allGroupsLink = LinkFactory.createLink("opengroups.all", mainVC, this); allGroupsLink.setElementCssClass("o_sel_group_all_groups_seg"); - segmentView.addSegment(allGroupsLink, !marked); + segmentView.addSegment(allGroupsLink, markedEmpty); ownedGroupsLink = LinkFactory.createLink("owned.groups", mainVC, this); ownedGroupsLink.setElementCssClass("o_sel_group_owned_groups_seg"); segmentView.addSegment(ownedGroupsLink, false); diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 47e57856b056351760826a5b87b4f23ee500d232..175946a3358cebbb6be29e45e0327c8aa76b0afd 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -600,6 +600,10 @@ public class RepositoryManager extends BasicManager { * @throws AssertException if the softkey could not be found (strict=true) */ public RepositoryEntry lookupRepositoryEntryBySoftkey(String softkey, boolean strict) { + if(softkey == null || "sf.notconfigured".equals(softkey)) { + return null; + } + StringBuilder sb = new StringBuilder(); sb.append("select v from ").append(RepositoryEntry.class.getName()).append(" v") .append(" inner join fetch v.olatResource as ores ") diff --git a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java index 56f42b2a3f96ac8f16801bda295b5753221dca83..1f6868e018d9105e9603f7244c0a0e58a08f1d31 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java @@ -582,9 +582,9 @@ public class RepositoryDetailsController extends BasicController implements Gene doCloseDetailView(ureq); return; } else if (sourceLink == downloadButton){ - doDownload(ureq, false); + doDownload(ureq, repositoryEntry, false); } else if (sourceLink == launchButton){ - doLaunch(ureq); + doLaunch(ureq, repositoryEntry); } else if (sourceLink == loginLink){ DispatcherAction.redirectToDefaultDispatcher(ureq.getHttpResp()); } else if (sourceLink.getUserObject() instanceof IdentityShort) { @@ -617,7 +617,7 @@ public class RepositoryDetailsController extends BasicController implements Gene private void doCloseDetailView(UserRequest ureq) { // REVIEW:pb:note:handles jumps from Catalog and Course if (jumpfromcourse && repositoryEntry.getCanLaunch()) { - doLaunch(ureq); + doLaunch(ureq, repositoryEntry); } else { fireEvent(ureq, Event.DONE_EVENT); } @@ -654,28 +654,28 @@ public class RepositoryDetailsController extends BasicController implements Gene * * @param ureq */ - boolean doLaunch(UserRequest ureq) { - RepositoryHandler typeToLaunch = RepositoryHandlerFactory.getInstance().getRepositoryHandler(repositoryEntry); + boolean doLaunch(UserRequest ureq, RepositoryEntry re) { + RepositoryHandler typeToLaunch = RepositoryHandlerFactory.getInstance().getRepositoryHandler(re); if (typeToLaunch == null){ StringBuilder sb = new StringBuilder(translate("error.launch")); sb.append(": No launcher for repository entry: "); - sb.append(repositoryEntry.getKey()); + sb.append(re.getKey()); throw new OLATRuntimeException(RepositoryDetailsController.class,sb.toString(), null); } - if (RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) == null) { + if (RepositoryManager.getInstance().lookupRepositoryEntry(re.getKey()) == null) { showInfo("info.entry.deleted"); return false; } try { - String businessPath = "[RepositoryEntry:" + repositoryEntry.getKey() + "]"; + String businessPath = "[RepositoryEntry:" + re.getKey() + "]"; boolean ok = NewControllerFactory.getInstance().launch(businessPath, ureq, getWindowControl()); if(ok) { fireEvent(ureq, LAUNCHED_EVENT); } return ok; } catch (CorruptedCourseException e) { - logError("Corrupted course: " + repositoryEntry, e); + logError("Corrupted course: " + re, e); return false; } } @@ -721,16 +721,16 @@ public class RepositoryDetailsController extends BasicController implements Gene * * @param ureq */ - void doDownload(UserRequest ureq, boolean backwardsCompatible) { - RepositoryHandler typeToDownload = RepositoryHandlerFactory.getInstance().getRepositoryHandler(repositoryEntry); + void doDownload(UserRequest ureq, RepositoryEntry re, boolean backwardsCompatible) { + RepositoryHandler typeToDownload = RepositoryHandlerFactory.getInstance().getRepositoryHandler(re); if (typeToDownload == null){ StringBuilder sb = new StringBuilder(translate("error.download")); sb.append(": No download handler for repository entry: "); - sb.append(repositoryEntry.getKey()); + sb.append(re.getKey()); throw new OLATRuntimeException(RepositoryDetailsController.class, sb.toString(), null); } - OLATResource ores = OLATResourceManager.getInstance().findResourceable(repositoryEntry.getOlatResource()); + OLATResource ores = OLATResourceManager.getInstance().findResourceable(re.getOlatResource()); if (ores == null) { showError("error.download"); return; @@ -741,7 +741,7 @@ public class RepositoryDetailsController extends BasicController implements Gene if(lockResult==null || (lockResult!=null && lockResult.isSuccess() && !isAlreadyLocked)) { MediaResource mr = typeToDownload.getAsMediaResource(ores, backwardsCompatible); if(mr!=null) { - RepositoryManager.getInstance().incrementDownloadCounter(repositoryEntry); + RepositoryManager.getInstance().incrementDownloadCounter(re); ureq.getDispatchResult().setResultingMediaResource(mr); } else { showError("error.export"); @@ -866,12 +866,12 @@ public class RepositoryDetailsController extends BasicController implements Gene // } else if (source == detailsToolC) { if (cmd.equals(ACTION_DOWNLOAD)) { // download - doDownload(ureq, false); + doDownload(ureq, repositoryEntry, false); return; } else if (cmd.equals(ACTION_DOWNLOAD_BACKWARD_COMPAT)) { - doDownload(ureq, true); + doDownload(ureq, repositoryEntry, true); } else if (cmd.equals(ACTION_LAUNCH)) { // launch resource - doLaunch(ureq); + doLaunch(ureq, repositoryEntry); return; } else if (cmd.equals(ACTION_EDIT)) { // start editor doEdit(ureq); diff --git a/src/main/java/org/olat/repository/controllers/RepositoryMainController.java b/src/main/java/org/olat/repository/controllers/RepositoryMainController.java index 658283d6c4b8a401f711875bdb4e24bba7bd271a..243e44d3a6a8d4cd52279a8ca5f6ca058c18cb43 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryMainController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryMainController.java @@ -70,6 +70,7 @@ import org.olat.fileresource.types.PodcastFileResource; import org.olat.fileresource.types.ScormCPFileResource; import org.olat.fileresource.types.SharedFolderFileResource; import org.olat.fileresource.types.WikiResource; +import org.olat.group.BusinessGroupService; import org.olat.ims.qti.fileresource.SurveyFileResource; import org.olat.ims.qti.fileresource.TestFileResource; import org.olat.portfolio.EPTemplateMapResource; @@ -146,6 +147,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen private RepositoryAddChooseStepsController chooseStepsController; private Controller creationWizardController; private final PortfolioModule portfolioModule; + private final BusinessGroupService businessGroupService; /** * The check for author rights is executed on construction time and then @@ -160,6 +162,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen if (log.isDebug()) { log.debug("Constructing ReposityMainController for user::" + ureq.getIdentity()); } + businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); portfolioModule = (PortfolioModule) CoreSpringFactory.getBean("portfolioModule"); // use i18n from RepositoryManager level @@ -540,8 +543,9 @@ public class RepositoryMainController extends MainLayoutBasicController implemen if (event.equals(Event.CHANGED_EVENT)) { getWindowControl().pop(); removeAsListenerAndDispose(creationWizardController); - detailsController.setEntry(chooseStepsController.getCourseRepositoryEntry(), urequest, false); - detailsController.doLaunch(urequest); + RepositoryEntry re = chooseStepsController.getCourseRepositoryEntry(); + detailsController.setEntry(re, urequest, false); + detailsController.doLaunch(urequest, re); } else if (event.equals(Event.CANCELLED_EVENT)) { // delete entry when the wizard was cancelled detailsController.deleteRepositoryEntry(urequest, getWindowControl(), (RepositoryEntry) chooseStepsController.getCourseRepositoryEntry()); @@ -603,17 +607,19 @@ public class RepositoryMainController extends MainLayoutBasicController implemen if (event.getCommand().equals(RepositoryTableModel.TABLE_ACTION_SELECT_ENTRY)) { // entry has been selected to be launched in the // searchController - ToolController toolC = detailsController.setEntry(selectedEntry, urequest, false); + if (selectedEntry.getCanLaunch()) { - if(!detailsController.doLaunch(urequest)) { + if(!detailsController.doLaunch(urequest, selectedEntry)) { //cannot launch -> open details + ToolController toolC = detailsController.setEntry(selectedEntry, urequest, false); Component toolComp = (toolC == null ? null : toolC.getInitialComponent()); columnsLayoutCtr.setCol2(toolComp); mainPanel.setContent(detailsController.getInitialComponent()); } } else if (selectedEntry.getCanDownload()) { - detailsController.doDownload(urequest, false); + detailsController.doDownload(urequest, selectedEntry, false); } else { // offer details view + ToolController toolC = detailsController.setEntry(selectedEntry, urequest, false); Component toolComp = (toolC == null ? null : toolC.getInitialComponent()); columnsLayoutCtr.setCol2(toolComp); mainPanel.setContent(detailsController.getInitialComponent()); @@ -629,25 +635,19 @@ public class RepositoryMainController extends MainLayoutBasicController implemen } } else if (source == detailsController) { // back from details //fxdiff FXOLAT-128: back/resume function - if (event.equals(Event.DONE_EVENT) || event.equals(RepositoryDetailsController.LAUNCHED_EVENT)) { + if (event.equals(Event.DONE_EVENT)) { if (backtocatalog) { backtocatalog = false; ToolController toolC = catalogCntrllrOld.createCatalogToolController(); Component toolComp = (toolC == null ? null : toolC.getInitialComponent()); columnsLayoutCtr.setCol2(toolComp); mainPanel.setContent(catalogCntrllrOld.getInitialComponent()); - //fxdiff BAKS-7 Resume function - if(!event.equals(RepositoryDetailsController.LAUNCHED_EVENT)) { - catalogCntrllrOld.updateHistory(urequest); - } + catalogCntrllrOld.updateHistory(urequest); } else { Component toolComp = (mainToolC == null ? null : mainToolC.getInitialComponent()); columnsLayoutCtr.setCol2(toolComp); mainPanel.setContent(main); - //fxdiff BAKS-7 Resume function - if(!event.equals(RepositoryDetailsController.LAUNCHED_EVENT)) { - addToHistory(urequest, searchWindowControl); - } + addToHistory(urequest, searchWindowControl); } } else if (event instanceof EntryChangedEvent) { Component toolComp = (mainToolC == null ? null : mainToolC.getInitialComponent()); diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java index 5fd8a64d088fc25ab3ceed921550db2d7e8c9bfb..6d878821719751b6f1bfb2f4778cee9fc8689ab0 100644 --- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java +++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java @@ -760,4 +760,75 @@ public class BaseSecurityManagerTest extends OlatTestCase { Assert.assertTrue(policies_3.contains(policy_3_3)); Assert.assertFalse(policies_3.contains(policy_1_3)); } + + @Test + public void isIdentityPermittedOnResourceable_checkType() { + //create an identity, a security group, a resource and give the identity some + //permissions on the resource + SecurityGroup secGroup = securityManager.createAndPersistSecurityGroup(); + OLATResource resource = JunitTestHelper.createRandomResource(); + Identity id = JunitTestHelper.createAndPersistIdentityAsUser("test-ipor-1-" + UUID.randomUUID().toString()); + securityManager.addIdentityToSecurityGroup(id, secGroup); + securityManager.createAndPersistPolicy(secGroup, "test.ipor-1_1", resource); + securityManager.createAndPersistPolicy(secGroup, "test.ipor-1_2", resource); + dbInstance.commitAndCloseSession(); + + //check + boolean hasIpor_1_1 = securityManager.isIdentityPermittedOnResourceable(id, "test.ipor-1_1", resource); + Assert.assertTrue(hasIpor_1_1); + boolean hasIpor_1_2 = securityManager.isIdentityPermittedOnResourceable(id, "test.ipor-1_2", resource); + Assert.assertTrue(hasIpor_1_2); + boolean hasIpor_1_3 = securityManager.isIdentityPermittedOnResourceable(id, "test.ipor-1_3", resource); + Assert.assertFalse(hasIpor_1_3); + + //check type + boolean hasIpor_1_1_ct = securityManager.isIdentityPermittedOnResourceable(id, "test.ipor-1_1", resource, true); + Assert.assertTrue(hasIpor_1_1_ct); + boolean hasIpor_1_2_ct = securityManager.isIdentityPermittedOnResourceable(id, "test.ipor-1_2", resource, true); + Assert.assertTrue(hasIpor_1_2_ct); + boolean hasIpor_1_3_ct = securityManager.isIdentityPermittedOnResourceable(id, "test.ipor-1_3", resource, true); + Assert.assertFalse(hasIpor_1_3_ct); + } + + @Test + public void isIdentityPermittedOnResourceable_noCheckType() { + //create an identity, a security group, a resource and give the identity some + //permissions on the resource + SecurityGroup secGroup = securityManager.createAndPersistSecurityGroup(); + OLATResource resource = JunitTestHelper.createRandomResource(); + Identity id = JunitTestHelper.createAndPersistIdentityAsUser("test-ipornc-1-" + UUID.randomUUID().toString()); + securityManager.addIdentityToSecurityGroup(id, secGroup); + securityManager.createAndPersistPolicy(secGroup, "test.ipornc-1_1", resource); + securityManager.createAndPersistPolicy(secGroup, "test.ipornc-1_2", resource); + dbInstance.commitAndCloseSession(); + + //check + boolean hasIpor_1_1 = securityManager.isIdentityPermittedOnResourceable(id, "test.ipornc-1_1", resource, false); + Assert.assertTrue(hasIpor_1_1); + boolean hasIpor_1_2 = securityManager.isIdentityPermittedOnResourceable(id, "test.ipornc-1_2", resource, false); + Assert.assertTrue(hasIpor_1_2); + boolean hasIpor_1_3 = securityManager.isIdentityPermittedOnResourceable(id, "test.ipornc-1_3", resource, false); + Assert.assertFalse(hasIpor_1_3); + } + + @Test + public void getIdentityPermissionsOnResourceable() { + //create an identity, a security group, a resource and give the identity some + //permissions on the resource + SecurityGroup secGroup = securityManager.createAndPersistSecurityGroup(); + OLATResource resource = JunitTestHelper.createRandomResource(); + Identity id = JunitTestHelper.createAndPersistIdentityAsUser("test-gpor-1-" + UUID.randomUUID().toString()); + securityManager.addIdentityToSecurityGroup(id, secGroup); + securityManager.createAndPersistPolicy(secGroup, "test.gpor-1_1", resource); + securityManager.createAndPersistPolicy(secGroup, "test.gpor-1_2", resource); + dbInstance.commitAndCloseSession(); + + //check + List<String> permissions = securityManager.getIdentityPermissionOnresourceable(id, resource); + Assert.assertNotNull(permissions); + Assert.assertTrue(permissions.size() >= 2); + Assert.assertTrue(permissions.contains("test.gpor-1_1")); + Assert.assertTrue(permissions.contains("test.gpor-1_2")); + Assert.assertFalse(permissions.contains("test.gpor-1_3")); + } } diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityTest.java index a40b8aee7b765e0138d7199eb4f5321703fba50e..7ee5f0a4faa0206584b8367869e4018e9a62d323 100644 --- a/src/test/java/org/olat/basesecurity/BaseSecurityTest.java +++ b/src/test/java/org/olat/basesecurity/BaseSecurityTest.java @@ -27,29 +27,26 @@ package org.olat.basesecurity; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Calendar; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; -import org.hibernate.PropertyValueException; +import junit.framework.Assert; + import org.junit.After; import org.junit.Test; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.id.Identity; -import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.id.User; import org.olat.core.id.UserConstants; -import org.olat.core.logging.DBRuntimeException; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.Encoder; -import org.olat.core.util.resource.OresHelper; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.olat.user.UserManager; @@ -62,16 +59,20 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class BaseSecurityTest extends OlatTestCase { + private static final OLog log = Tracing.createLoggerFor(BaseSecurityTest.class); + @Autowired private BaseSecurity baseSecurityManager; - @Test public void testGetIdentitiesByPowerSearch() { + @Test + public void testGetIdentitiesByPowerSearch() { System.out.println("start testGetIdentitiesByPowerSearch"); try { Identity ident = getOrCreateIdentity("anIdentity"); Identity ident2 = getOrCreateTestIdentity("extremegroovy"); + Assert.assertNotNull(ident2); Identity deletedIdent = getOrCreateTestIdentity("delete"); deletedIdent = baseSecurityManager.saveIdentityStatus(deletedIdent, Identity.STATUS_DELETED); @@ -202,11 +203,9 @@ public class BaseSecurityTest extends OlatTestCase { // basic query to find all system users without restrictions List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null); assertTrue(results.size()>0); - int numberOfAllUsers = results.size(); results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED); assertTrue(results.size() >0); - int numberOfDeletedUsers = results.size(); results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, null, null, null, null, null, null, null); assertTrue(results.size() >0); @@ -240,7 +239,7 @@ public class BaseSecurityTest extends OlatTestCase { // policy search test DBFactory.getInstance().closeSession(); - List policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins); + List<Policy> policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins); PermissionOnResourceable[] adminPermissions = convertPoliciesListToPermissionOnResourceArray(policies); policies = baseSecurityManager.getPoliciesOfSecurityGroup(anonymous); PermissionOnResourceable[] anonymousPermissions = convertPoliciesListToPermissionOnResourceArray(policies); @@ -484,22 +483,22 @@ public class BaseSecurityTest extends OlatTestCase { User onePropUser = UserManager.getInstance().createUser("onepropuser", "onepropuser", "onepropuser@lustig.com"); onePropUser.setProperty(UserConstants.FIRSTNAME, "one"); Identity onePropeIdentity = baseSecurityManager.createAndPersistIdentityAndUser("onePropUser", onePropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), "onepropuser", Encoder.encrypt("ppp")); + Assert.assertNotNull(onePropeIdentity); User twoPropUser = UserManager.getInstance().createUser("twopropuser", "twopropuser", "twopropuser@lustig.com"); twoPropUser.setProperty(UserConstants.FIRSTNAME, "two"); twoPropUser.setProperty(UserConstants.LASTNAME, "prop"); - Identity twoPropeIdentity = baseSecurityManager.createAndPersistIdentityAndUser("twopropuser", twoPropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), "twopropuser", Encoder.encrypt("ppp")); + Assert.assertNotNull(twoPropeIdentity); // commit DBFactory.getInstance().closeSession(); HashMap<String, String> userProperties; - List results; - + // find first userProperties = new HashMap<String, String>(); userProperties.put(UserConstants.FIRSTNAME, "one"); - results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null); + List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null); assertTrue(results.size() == 1); // no intersection - all properties optional @@ -577,16 +576,16 @@ public class BaseSecurityTest extends OlatTestCase { multiPropUser.setProperty(UserConstants.INSTITUTIONALUSERIDENTIFIER, "multiinst"); multiPropUser.setProperty(UserConstants.CITY, "züri"); Identity onePropeIdentity = baseSecurityManager.createAndPersistIdentityAndUser("multiPropUser", multiPropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), "multipropuser", Encoder.encrypt("ppp")); - + Assert.assertNotNull(onePropeIdentity); + // commit DBFactory.getInstance().closeSession(); HashMap<String, String> userProperties; - List results; - + userProperties = new HashMap<String, String>(); userProperties.put(UserConstants.FIRSTNAME, "multi"); - results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null); + List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null); sysoutResults(results); assertTrue(results.size() == 1); @@ -758,10 +757,10 @@ public class BaseSecurityTest extends OlatTestCase { } } - private PermissionOnResourceable[] convertPoliciesListToPermissionOnResourceArray(List policies) { + private PermissionOnResourceable[] convertPoliciesListToPermissionOnResourceArray(List<Policy> policies) { PermissionOnResourceable[] array = new PermissionOnResourceable[policies.size()]; for (int i = 0; i < policies.size() ; i++) { - Policy policy = (Policy) policies.get(i); + Policy policy = policies.get(i); PermissionOnResourceable por = new PermissionOnResourceable(policy.getPermission(), policy.getOlatResource()); array[i] = por; } @@ -772,28 +771,25 @@ public class BaseSecurityTest extends OlatTestCase { /* * Only for debugging to see identities result list. */ - private void sysoutResults(List results) { - System.out.println("TEST results.size()=" + results.size()); - for (Iterator iterator = results.iterator(); iterator.hasNext();) { - Identity identity = (Identity) iterator.next(); - System.out.println("TEST ident=" + identity); + private void sysoutResults(List<Identity> results) { + log.info("TEST results.size()=" + results.size()); + for (Identity identity:results) { + log.debug("TEST ident=" + identity); } } // check Helper Methoden //////////////////////// - private void checkIdentitiesHasPermissions(List results, PermissionOnResourceable[] adminPermissions) { - for (Iterator iterator = results.iterator(); iterator.hasNext();) { - Identity resultIdentity = (Identity) iterator.next(); + private void checkIdentitiesHasPermissions(List<Identity> results, PermissionOnResourceable[] adminPermissions) { + for (Identity resultIdentity: results) { for (int i = 0; i < adminPermissions.length; i++) { assertTrue( baseSecurityManager.isIdentityPermittedOnResourceable(resultIdentity, adminPermissions[i].getPermission(), adminPermissions[i].getOlatResourceable() ) ); } } } - private void checkIdentitiesHasAuthProvider(List results, String[] authProviders) { - for (Iterator iterator = results.iterator(); iterator.hasNext();) { - Identity resultIdentity = (Identity) iterator.next(); + private void checkIdentitiesHasAuthProvider(List<Identity> results, String[] authProviders) { + for (Identity resultIdentity : results) { boolean foundIdentityWithAuth = false; for (int i = 0; i < authProviders.length; i++) { Authentication authentication = baseSecurityManager.findAuthentication(resultIdentity, authProviders[i]); @@ -805,9 +801,8 @@ public class BaseSecurityTest extends OlatTestCase { } } - private void checkIdentitiesAreInGroups(List results, SecurityGroup[] groups1) { - for (Iterator iterator = results.iterator(); iterator.hasNext();) { - Identity resultIdentity = (Identity) iterator.next(); + private void checkIdentitiesAreInGroups(List<Identity> results, SecurityGroup[] groups1) { + for (Identity resultIdentity:results) { boolean foundIdentityInSecGroup = false; for (int i = 0; i < groups1.length; i++) { if (baseSecurityManager.isIdentityInSecurityGroup(resultIdentity, groups1[i]) ) { @@ -819,14 +814,11 @@ public class BaseSecurityTest extends OlatTestCase { } private void checkIdentitiesHasRoles(List<Identity> results, boolean checkIsAuthor) { - for (Iterator iterator = results.iterator(); iterator.hasNext();) { - Identity resultIdentity = (Identity) iterator.next(); + for (Identity resultIdentity: results) { Roles roles = baseSecurityManager.getRoles(resultIdentity); if (checkIsAuthor) { assertTrue("Identity has not roles author, identity=" + resultIdentity, roles.isAuthor()); } } } - - } \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/vfs/version/VersionManagerTest.java b/src/test/java/org/olat/core/util/vfs/version/VersionManagerTest.java index af8b716334b1afd23aa8b617b03e88886f05c849..c5b474c79a2fb39425854e979a4a67d9e130ddbe 100644 --- a/src/test/java/org/olat/core/util/vfs/version/VersionManagerTest.java +++ b/src/test/java/org/olat/core/util/vfs/version/VersionManagerTest.java @@ -35,6 +35,7 @@ import java.util.UUID; import junit.framework.Assert; import org.apache.commons.io.IOUtils; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.olat.core.CoreSpringFactory; @@ -67,6 +68,8 @@ public class VersionManagerTest extends OlatTestCase { @Autowired private VersionsFileManager versionManager; + @Autowired + private SimpleVersionConfig versioningConfigurator; @Before public void setUp() throws Exception { @@ -82,6 +85,12 @@ public class VersionManagerTest extends OlatTestCase { setuped = true; } + @After + public void resetMaxVersions() { + versioningConfigurator.setMaxNumberOfVersionsProperty(new Long(10)); + versioningConfigurator.getMaxNumberOfVersionsProperty(); + } + @Test public void testVersionManager() throws IOException { //create a file @@ -136,6 +145,72 @@ public class VersionManagerTest extends OlatTestCase { assertEquals("Version 3", versions.getComment()); } + @Test + public void testOverflow_lowLevel() throws IOException { + versioningConfigurator.setMaxNumberOfVersionsProperty(new Long(3)); + + //create a file + OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/test_" + UUID.randomUUID(), null); + String filename = getRandomName(); + VFSLeaf file = rootTest.createChildLeaf(filename); + OutputStream out = file.getOutputStream(false); + InputStream in = VersionManagerTest.class.getResourceAsStream("test.txt"); + int byteCopied = IOUtils.copy(in, out); + IOUtils.closeQuietly(in); + assertFalse(byteCopied == 0); + assertTrue(file instanceof Versionable); + + //save a first version + for(int i=0; i<5; i++) { + Versionable versionedFile = (Versionable)file; + InputStream inv = new ByteArrayInputStream(("Hello version " + i).getBytes()); + versionedFile.getVersions().addVersion(id2, "Version " + (1 +i), inv); + IOUtils.closeQuietly(inv); + } + + VFSItem retrievedFile = rootTest.resolve(filename); + Versions versions = VersionsFileManager.getInstance().createVersionsFor((VFSLeaf)retrievedFile); + List<VFSRevision> revisions = versions.getRevisions(); + assertNotNull(revisions); + assertEquals(3, revisions.size()); + assertEquals("3", revisions.get(0).getRevisionNr()); + assertEquals("4", revisions.get(1).getRevisionNr()); + assertEquals("5", revisions.get(2).getRevisionNr()); + + assertEquals("Version 5", versions.getComment()); + assertEquals(id2.getName(), revisions.get(2).getAuthor()); + } + + @Test + public void testOverflow_lowLevel_deactivated() throws IOException { + versioningConfigurator.setMaxNumberOfVersionsProperty(new Long(0)); + + //create a file + OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/test_" + UUID.randomUUID(), null); + String filename = getRandomName(); + VFSLeaf file = rootTest.createChildLeaf(filename); + OutputStream out = file.getOutputStream(false); + InputStream in = VersionManagerTest.class.getResourceAsStream("test.txt"); + int byteCopied = IOUtils.copy(in, out); + IOUtils.closeQuietly(in); + assertFalse(byteCopied == 0); + assertTrue(file instanceof Versionable); + + //save a first version + for(int i=0; i<5; i++) { + Versionable versionedFile = (Versionable)file; + InputStream inv = new ByteArrayInputStream(("Hello version " + i).getBytes()); + versionedFile.getVersions().addVersion(id2, "Version " + (1 +i), inv); + IOUtils.closeQuietly(inv); + } + + VFSItem retrievedFile = rootTest.resolve(filename); + Versions versions = VersionsFileManager.getInstance().createVersionsFor((VFSLeaf)retrievedFile); + List<VFSRevision> revisions = versions.getRevisions(); + assertNotNull(revisions); + assertTrue(revisions.isEmpty()); + } + @Test public void testVersionChecksum() throws IOException { OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/ver-" + UUID.randomUUID(), null);