diff --git a/src/main/java/de/bps/course/nodes/CourseNodePasswordManager.java b/src/main/java/de/bps/course/nodes/CourseNodePasswordManager.java index 545f0f3b6d9ba3bcd6670a022a916b50238c11a9..4d28edabea7175e8e87e0a28af5b2fe1934c8dde 100644 --- a/src/main/java/de/bps/course/nodes/CourseNodePasswordManager.java +++ b/src/main/java/de/bps/course/nodes/CourseNodePasswordManager.java @@ -31,6 +31,8 @@ public interface CourseNodePasswordManager { * @return */ public AdditionalConditionAnswerContainer getAnswerContainer(Identity identity); + + public AdditionalConditionAnswerContainer removeAnswerContainerFromCache(Identity identity); /** * updates inputted password @@ -39,7 +41,7 @@ public interface CourseNodePasswordManager { * @param courseId * @param value */ - public void updatePwd(Identity identity, String nodeIdentifier, String courseId, String value); + public void updatePwd(Identity identity, String nodeIdentifier, Long courseId, String value); /** * deletes password for a repository entry diff --git a/src/main/java/de/bps/course/nodes/CourseNodePasswordManagerImpl.java b/src/main/java/de/bps/course/nodes/CourseNodePasswordManagerImpl.java index 7929678802ffde58cd112aab83f772a3e85e62f3..e9d32d402acdd804ea8d56612bc0ce52ef728bb6 100644 --- a/src/main/java/de/bps/course/nodes/CourseNodePasswordManagerImpl.java +++ b/src/main/java/de/bps/course/nodes/CourseNodePasswordManagerImpl.java @@ -27,6 +27,7 @@ import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.course.condition.additionalconditions.AdditionalConditionAnswerContainer; import org.olat.course.condition.additionalconditions.PasswordStore; +import org.olat.course.run.preview.PreviewIdentity; import org.olat.properties.Property; import org.olat.properties.PropertyManager; @@ -65,28 +66,38 @@ public class CourseNodePasswordManagerImpl implements CourseNodePasswordManager */ @Override public AdditionalConditionAnswerContainer getAnswerContainer(Identity identity) { - AdditionalConditionAnswerContainer acac = new AdditionalConditionAnswerContainer(); + AdditionalConditionAnswerContainer acac; if(identity == null) { - //do nothing + acac = new AdditionalConditionAnswerContainer(); } else if (cache.containsKey(identity.getKey())) { acac = cache.get(identity.getKey()); } else { PropertyManager pm = PropertyManager.getInstance(); List<Property> properties = pm.listProperties(identity, null, AdditionalConditionAnswerContainer.RESOURCE_NAME, null, null, AdditionalConditionAnswerContainer.RESOURCE_NAME); - if(properties == null) return null; - for (Object object : properties) { - Property property = (Property) object; - PasswordStore store = new PasswordStore(); - store.setPassword(property.getStringValue()); - store.setCourseId(property.getLongValue()); - store.setNodeIdent(property.getResourceTypeId()); - acac.insertAnswer(Long.toString(property.getResourceTypeId()), Long.toString(property.getLongValue()), store); + if(properties == null) { + acac = null; + } else { + acac = new AdditionalConditionAnswerContainer(); + for (Object object : properties) { + Property property = (Property) object; + PasswordStore store = new PasswordStore(); + store.setPassword(property.getStringValue()); + store.setCourseId(property.getLongValue()); + store.setNodeIdent(property.getResourceTypeId()); + acac.insertAnswer(Long.toString(property.getResourceTypeId()), property.getLongValue(), store); + } + cache.put(identity.getKey(), acac); } - cache.put(identity.getKey(), acac); } return acac; } + @Override + public AdditionalConditionAnswerContainer removeAnswerContainerFromCache(Identity identity) { + if(identity == null) return null; + return cache.remove(identity.getKey()); + } + /** * persist answer container to database * @@ -94,7 +105,10 @@ public class CourseNodePasswordManagerImpl implements CourseNodePasswordManager * @param answers */ private void persistAnswerContainer(Identity identity, AdditionalConditionAnswerContainer answers) { - if (!answers.isContainerEmpty()) { + if(identity instanceof PreviewIdentity) { + //preview identity are not persistable + cache.put(identity.getKey(), answers); + } else if (!answers.isContainerEmpty()) { boolean updateInDatabase = false; PropertyManager pm = PropertyManager.getInstance(); Map<String, Object> container = answers.getContainer(); @@ -137,7 +151,9 @@ public class CourseNodePasswordManagerImpl implements CourseNodePasswordManager updateInDatabase = true; } } - if (updateInDatabase) cache.put(identity.getKey(), answers); + if (updateInDatabase) { + cache.put(identity.getKey(), answers); + } } } @@ -145,7 +161,7 @@ public class CourseNodePasswordManagerImpl implements CourseNodePasswordManager * @see de.bps.course.nodes.CourseNodePasswordManager#updatePwd(org.olat.core.id.Identity, java.lang.String, java.lang.String, java.lang.String) */ @Override - public void updatePwd(Identity identity, String nodeIdentifier, String courseId, String value) { + public void updatePwd(Identity identity, String nodeIdentifier, Long courseId, String value) { AdditionalConditionAnswerContainer answers = getAnswerContainer(identity); if (answers == null) { @@ -183,8 +199,8 @@ public class CourseNodePasswordManagerImpl implements CourseNodePasswordManager private void removeAnswers(Long nodeId, Long courseId) { for (Long key : cache.keySet()) { AdditionalConditionAnswerContainer acac = cache.get(key); - if (acac.containsAnswer(Long.toString(nodeId), Long.toString(courseId))) { - acac.removeAnswer(Long.toString(nodeId), Long.toString(courseId)); + if (acac.containsAnswer(Long.toString(nodeId), courseId)) { + acac.removeAnswer(Long.toString(nodeId), courseId); } } } diff --git a/src/main/java/org/olat/course/condition/additionalconditions/AdditionalCondition.java b/src/main/java/org/olat/course/condition/additionalconditions/AdditionalCondition.java index 8081ccce4beec05f3ee52d5f98d016db9480d73f..1ff3815188206867ee894b07988cde647c578fd0 100644 --- a/src/main/java/org/olat/course/condition/additionalconditions/AdditionalCondition.java +++ b/src/main/java/org/olat/course/condition/additionalconditions/AdditionalCondition.java @@ -26,6 +26,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.course.condition.Condition; import org.olat.course.nodes.AbstractAccessableCourseNode; +import org.olat.course.run.userview.UserCourseEnvironment; public abstract class AdditionalCondition extends Condition implements Cloneable, Serializable { @@ -58,7 +59,7 @@ public abstract class AdditionalCondition extends Condition implements Cloneable * @param wControl * @return the controller, null if this condition could not be fulfilled by the user and no specific message i.e webservice not reachable should be shown */ - public abstract Controller getUserInputController(UserRequest ureq, WindowControl wControl); + public abstract Controller getUserInputController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv); public String getNodeIdentifier() { return node != null ? node.getIdent() : null; diff --git a/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionAnswerContainer.java b/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionAnswerContainer.java index ad7b0f915904f35834f8ddf1575c02fa5ca48545..fa7964b8e15277ded7f0ff86d4ae217ea676e602 100644 --- a/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionAnswerContainer.java +++ b/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionAnswerContainer.java @@ -32,17 +32,19 @@ public class AdditionalConditionAnswerContainer { private final Map<String, Object> container = new HashMap<String, Object>(); - public Object getAnswers(String nodeKey, String courseId){ + public Object getAnswers(String nodeKey, Long courseId){ return container.get(generateMapKey(nodeKey, courseId)); } - private String generateMapKey(String nodeKey, String courseId) { - return nodeKey+SEPARATOR+courseId; + private String generateMapKey(String nodeKey, Long courseId) { + return nodeKey + SEPARATOR + courseId; } - public void insertAnswer(String nodeKey, String courseId, Object answer){ + public void insertAnswer(String nodeKey, Long courseId, Object answer){ Object object = container.get(generateMapKey(nodeKey, courseId)); - if(!answer.equals(object)) container.put(generateMapKey(nodeKey, courseId), answer); + if(!answer.equals(object)) { + container.put(generateMapKey(nodeKey, courseId), answer); + } } public Map<String, Object> getContainer() { @@ -53,11 +55,11 @@ public class AdditionalConditionAnswerContainer { return container.isEmpty(); } - public void removeAnswer(String nodeKey, String courseId) { + public void removeAnswer(String nodeKey, Long courseId) { container.remove(generateMapKey(nodeKey, courseId)); } - public boolean containsAnswer(String nodeKey, String courseId) { + public boolean containsAnswer(String nodeKey, Long courseId) { return container.containsKey(generateMapKey(nodeKey, courseId)); } } diff --git a/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionManager.java b/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionManager.java index 0a4935d45aeeede2f62fb2e32854b83f7818f0d0..12191c0779a74805edcf2d471140dfe6f308c4da 100644 --- a/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionManager.java +++ b/src/main/java/org/olat/course/condition/additionalconditions/AdditionalConditionManager.java @@ -26,6 +26,7 @@ import org.olat.course.nodes.AbstractAccessableCourseNode; import org.olat.course.nodes.CourseNodeConfiguration; import org.olat.course.nodes.CourseNodeFactory; import org.olat.course.nodes.TitledWrapperHelper; +import org.olat.course.run.userview.UserCourseEnvironment; public class AdditionalConditionManager { @@ -61,13 +62,13 @@ public class AdditionalConditionManager { * @param wControl * @return null if either nothing is wrong or the user is unable to influence the condition in olat (and won't get a more detailed error-message) */ - public Controller nextUserInputController(UserRequest ureq, WindowControl wControl){ + public Controller nextUserInputController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv) { for(AdditionalCondition cond : node.getAdditionalConditions()){ cond.setNode(node); cond.setCourseId(courseId); boolean retVal = cond.evaluate(answers); if(!retVal) { - Controller ctrl = cond.getUserInputController(ureq, wControl); + Controller ctrl = cond.getUserInputController(ureq, wControl, userCourseEnv); CourseNodeConfiguration config = CourseNodeFactory.getInstance().getCourseNodeConfiguration(node.getType()); return TitledWrapperHelper.getWrapper(ureq, wControl, ctrl, node, config.getIconCSSClass()); } diff --git a/src/main/java/org/olat/course/condition/additionalconditions/PasswordCondition.java b/src/main/java/org/olat/course/condition/additionalconditions/PasswordCondition.java index 0e54b5d7293feb469be1bc2520a1b7197944e769..632208a1db486abeedbef51fea1797ba8604e745 100644 --- a/src/main/java/org/olat/course/condition/additionalconditions/PasswordCondition.java +++ b/src/main/java/org/olat/course/condition/additionalconditions/PasswordCondition.java @@ -23,6 +23,7 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.course.nodes.AbstractAccessableCourseNode; +import org.olat.course.run.userview.UserCourseEnvironment; /** * Only a placeholder to import courses from other vendors @@ -53,7 +54,7 @@ public class PasswordCondition extends AdditionalCondition { String userAnswer = null; if(userAnswerObj instanceof AdditionalConditionAnswerContainer) { AdditionalConditionAnswerContainer answersContainer = (AdditionalConditionAnswerContainer)userAnswerObj; - Object obj = answersContainer.getAnswers(node.getIdent(), courseId.toString()); + Object obj = answersContainer.getAnswers(node.getIdent(), courseId); if(obj instanceof PasswordStore){ userAnswer = ((PasswordStore)obj).getPassword(); } @@ -65,8 +66,8 @@ public class PasswordCondition extends AdditionalCondition { } @Override - public Controller getUserInputController(UserRequest ureq, WindowControl wControl){ - return new PasswordVerificationController(ureq, wControl, this); + public Controller getUserInputController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv){ + return new PasswordVerificationController(ureq, wControl, this, userCourseEnv); } @Override diff --git a/src/main/java/org/olat/course/condition/additionalconditions/PasswordVerificationController.java b/src/main/java/org/olat/course/condition/additionalconditions/PasswordVerificationController.java index 0ce78f44d06199bc02bea8cbfe740369abe58744..62dc43c1831163790cbe35b2999ee38734b498f2 100644 --- a/src/main/java/org/olat/course/condition/additionalconditions/PasswordVerificationController.java +++ b/src/main/java/org/olat/course/condition/additionalconditions/PasswordVerificationController.java @@ -29,6 +29,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; import org.olat.course.run.RunMainController; +import org.olat.course.run.userview.UserCourseEnvironment; import de.bps.course.nodes.CourseNodePasswordManager; import de.bps.course.nodes.CourseNodePasswordManagerImpl; @@ -39,13 +40,16 @@ import de.bps.course.nodes.CourseNodePasswordManagerImpl; * @author srosse, stephane.rosse@frentix.com */ public class PasswordVerificationController extends FormBasicController { - private final PasswordCondition condition; private TextElement pwElement; + + private final PasswordCondition condition; + private final UserCourseEnvironment userCourseEnv; - protected PasswordVerificationController(UserRequest ureq, WindowControl wControl, PasswordCondition condition) { + protected PasswordVerificationController(UserRequest ureq, WindowControl wControl, PasswordCondition condition, UserCourseEnvironment userCourseEnv) { super(ureq, wControl); this.condition = condition; + this.userCourseEnv = userCourseEnv; initForm(ureq); } @@ -84,7 +88,8 @@ public class PasswordVerificationController extends FormBasicController { valid = condition.evaluate(pwElement.getValue()); if (valid) { CourseNodePasswordManager cnpm = CourseNodePasswordManagerImpl.getInstance(); - cnpm.updatePwd(ureq.getIdentity(), condition.getNodeIdentifier(), condition.getCourseId().toString(), pwElement.getValue()); + //used the identity of the user course environment for the preview of courses + cnpm.updatePwd(userCourseEnv.getIdentityEnvironment().getIdentity(), condition.getNodeIdentifier(), condition.getCourseId(), pwElement.getValue()); } else { pwElement.setErrorKey("password.incorrect", new String[0]); } diff --git a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java index a8f2c60dbcb21d36461b37859c982b67de45233f..ed0b9333cafbd19b236da9ab684c44c7d6086098 100644 --- a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java +++ b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java @@ -47,6 +47,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.messages.MessageUIFactory; import org.olat.core.gui.control.generic.title.TitledWrapperController; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; @@ -360,7 +361,8 @@ public class NavigationHandler implements Disposable { if (courseNode instanceof AbstractAccessableCourseNode) { Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId(); CourseNodePasswordManager cnpm = CourseNodePasswordManagerImpl.getInstance(); - AdditionalConditionAnswerContainer answerContainer = cnpm.getAnswerContainer(ureq.getIdentity()); + Identity identity = userCourseEnv.getIdentityEnvironment().getIdentity(); + AdditionalConditionAnswerContainer answerContainer = cnpm.getAnswerContainer(identity); addMan = new AdditionalConditionManager( (AbstractAccessableCourseNode) courseNode, courseId, answerContainer); } @@ -373,7 +375,7 @@ public class NavigationHandler implements Disposable { //this is the case if only one of the additional conditions failed if (nodeEval.oldStyleConditionsOk()) { - controller = addMan.nextUserInputController(ureq, wControl); + controller = addMan.nextUserInputController(ureq, wControl, userCourseEnv); if (listeningController != null) { controller.addControllerListener(listeningController); } @@ -399,7 +401,6 @@ public class NavigationHandler implements Disposable { nclr = new NodeClickedRef(treeModel, true, newSelectedNodeId, null, courseNode, ncr, false); } else { // access ok - // fxdiff FXOLAT-262 if (STCourseNode.isDelegatingSTCourseNode(courseNode) && (courseNode.getChildCount() > 0)) { // the clicked node is a STCourse node and is set to "delegate", so // delegate to its first visible child; if no child is visible, just skip and do normal eval diff --git a/src/main/java/org/olat/course/run/preview/PreviewIdentity.java b/src/main/java/org/olat/course/run/preview/PreviewIdentity.java index 4b1a66366b2c9b0d9b6b5d1170295255ca2010bf..c0254efa1d88c5e666b82a22ab268cf0f08bf02a 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewIdentity.java +++ b/src/main/java/org/olat/course/run/preview/PreviewIdentity.java @@ -35,30 +35,36 @@ import org.olat.core.id.Persistable; import org.olat.core.id.Preferences; import org.olat.core.id.User; import org.olat.core.id.UserConstants; +import org.olat.core.util.CodeHelper; /** * Initial Date: 08.02.2005 * * @author Mike Stock */ -final class PreviewIdentity implements Identity, User { +public final class PreviewIdentity implements Identity, User { private static final long serialVersionUID = 6582855975941440446L; private final Map<String, String> data = new HashMap<String, String>(); + private final Long key; private Map<String, String> envAttrs; { data.put(UserConstants.FIRSTNAME, "Jane"); data.put(UserConstants.LASTNAME, "Doe"); data.put(UserConstants.EMAIL, "jane.doe@testmail.com"); } + + public PreviewIdentity() { + key = CodeHelper.getRAMUniqueID(); + } /** * @see org.olat.core.commons.persistence.Persistable#getKey() */ @Override public Long getKey() { - return 2l; + return key; } @Override diff --git a/src/main/java/org/olat/course/run/preview/PreviewRunController.java b/src/main/java/org/olat/course/run/preview/PreviewRunController.java index 5345cc8a66690df191bbd03118f6e6146047fe5d..bf357b392ff5e15ff486820c99fa7db3ba641d65 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewRunController.java +++ b/src/main/java/org/olat/course/run/preview/PreviewRunController.java @@ -49,15 +49,18 @@ import org.olat.core.id.IdentityEnvironment; import org.olat.course.condition.Condition; import org.olat.course.groupsandrights.CourseGroupManager; import org.olat.course.nodes.CourseNode; +import org.olat.course.run.RunMainController; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.navigation.NavigationHandler; import org.olat.course.run.navigation.NodeClickedRef; -import org.olat.course.run.userview.VisibleTreeFilter; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironmentImpl; +import org.olat.course.run.userview.VisibleTreeFilter; import org.olat.group.BusinessGroup; import org.olat.group.area.BGArea; +import de.bps.course.nodes.CourseNodePasswordManagerImpl; + /** * Description: <br> * @@ -67,8 +70,9 @@ public class PreviewRunController extends MainLayoutBasicController { private MenuTree luTree; private Panel content; - private NavigationHandler navHandler; - private UserCourseEnvironment uce; + private final NavigationHandler navHandler; + private final UserCourseEnvironment uce; + private CourseNode currentCourseNode; private Controller currentNodeController; // the currently open node private VelocityContainer detail; @@ -116,6 +120,7 @@ public class PreviewRunController extends MainLayoutBasicController { content = new Panel("building_block_content"); currentNodeController = nclr.getRunController(); + currentCourseNode = nclr.getCalledCourseNode(); currentNodeController.addControllerListener(this); content.setContent(currentNodeController.getInitialComponent()); detail.put("content", content); @@ -150,6 +155,7 @@ public class PreviewRunController extends MainLayoutBasicController { * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Component source, Event event) { if (source == luTree) { if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) { @@ -190,6 +196,7 @@ public class PreviewRunController extends MainLayoutBasicController { String visibilityExpr = (c.getConditionExpression() == null? translate("details.visibility.none") : c.getConditionExpression()); detail.contextPut("visibilityExpr", visibilityExpr); detail.contextPut("coursenode", cn); + currentCourseNode = cn; } Component nodeComp = currentNodeController.getInitialComponent(); @@ -204,6 +211,7 @@ public class PreviewRunController extends MainLayoutBasicController { * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Controller source, Event event) { if (source == currentNodeController) { if (event instanceof OlatCmdEvent) { @@ -215,6 +223,8 @@ public class PreviewRunController extends MainLayoutBasicController { updateTreeAndContent(ureq, identNode); oe.accept(); } + } else if (RunMainController.REBUILD.equals(event.getCommand())) { + updateTreeAndContent(ureq, currentCourseNode); } } } @@ -266,6 +276,7 @@ public class PreviewRunController extends MainLayoutBasicController { currentNodeController.dispose(); currentNodeController = null; } + CourseNodePasswordManagerImpl.getInstance().removeAnswerContainerFromCache(uce.getIdentityEnvironment().getIdentity()); navHandler.dispose(); } } \ No newline at end of file