diff --git a/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java b/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java index e12c2f0602ac116281434414afb40edac898e69a..0cbd0a337e07ff63a81b46125b42d64121c57747 100644 --- a/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java +++ b/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java @@ -45,6 +45,7 @@ import org.olat.core.util.Util; import org.olat.core.util.ValidationStatus; import org.olat.core.util.WebappHelper; import org.olat.core.util.ZipUtil; +import org.olat.core.util.nodes.INode; import org.olat.core.util.xml.XStreamHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; @@ -99,7 +100,11 @@ public class ChecklistCourseNode extends AbstractAccessableCourseNode { public static final String PROPERTY_CHECKLIST_KEY = CONF_CHECKLIST; public ChecklistCourseNode() { - super(TYPE); + this(null); + } + + public ChecklistCourseNode(INode parent) { + super(TYPE, parent); initDefaultConfig(); } diff --git a/src/main/java/de/bps/course/nodes/DENCourseNode.java b/src/main/java/de/bps/course/nodes/DENCourseNode.java index 34b76de6bf8e4324c342c695c48aa555331fa72a..fd3fc3d2c6fa09fc8b5400bcbde3a6473e2879e4 100644 --- a/src/main/java/de/bps/course/nodes/DENCourseNode.java +++ b/src/main/java/de/bps/course/nodes/DENCourseNode.java @@ -32,6 +32,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Roles; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -67,7 +68,11 @@ public class DENCourseNode extends AbstractAccessableCourseNode { public static final String CONF_COURSE_NODE_ID = "den_course_node_id"; public DENCourseNode() { - super(TYPE); + this(null); + } + + public DENCourseNode(INode parent) { + super(TYPE, parent); initDefaultConfig(); } diff --git a/src/main/java/de/bps/course/nodes/LLCourseNode.java b/src/main/java/de/bps/course/nodes/LLCourseNode.java index 8a7b3fd7627bad7d46477980f217fa539be6f09a..56e84b96b4f1a1803363e33a5f6ab9949123df6c 100644 --- a/src/main/java/de/bps/course/nodes/LLCourseNode.java +++ b/src/main/java/de/bps/course/nodes/LLCourseNode.java @@ -29,6 +29,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.helpers.Settings; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -66,7 +67,11 @@ public class LLCourseNode extends AbstractAccessableCourseNode { public static final String CONF_LINKLIST = "ll_link_list"; public LLCourseNode() { - super(TYPE); + this(null); + } + + public LLCourseNode(INode parent) { + super(TYPE, parent); initDefaultConfig(); } @@ -81,7 +86,7 @@ public class LLCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if(config.getConfigurationVersion() < 2) { List<LLModel> links = (List<LLModel>)config.get(CONF_LINKLIST); @@ -103,7 +108,6 @@ public class LLCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment userCourseEnv) { - updateModuleConfigDefaults(false); LLEditController childTabCntrllr = new LLEditController(getModuleConfiguration(), ureq, wControl, course); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId()); // needed for DENEditController.isConfigValid() @@ -120,7 +124,6 @@ public class LLCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller controller = new LLRunController(ureq, wControl, getModuleConfiguration(), this, userCourseEnv, true); controller = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_ll_icon"); return new NodeRunConstructionResult(controller); @@ -129,7 +132,6 @@ public class LLCourseNode extends AbstractAccessableCourseNode { @Override public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { - updateModuleConfigDefaults(false); // Use normal view as peekview Controller controller = new LLRunController(ureq, wControl, getModuleConfiguration(), this, userCourseEnv, false); return controller; diff --git a/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java b/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java index 3455c0abe64e8e8deef9f1dfc13ea95a74968aa0..0df7021fb030015f9292e3520f41b7784da85a3f 100644 --- a/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java +++ b/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -60,8 +61,8 @@ public class ChecklistCourseNodeConfiguration extends AbstractCourseNodeConfigur @Override - public CourseNode getInstance() { - return new ChecklistCourseNode(); + public CourseNode getInstance(INode parent) { + return new ChecklistCourseNode(parent); } @Override diff --git a/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java b/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java index ff8bfe803ed450af96aca1e1e90b3ed96bcff3aa..e35e0530c0a85c878bf9849118daed4967aedd07 100644 --- a/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java +++ b/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -51,8 +52,8 @@ public class DENCourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new DENCourseNode(); + public CourseNode getInstance(INode parent) { + return new DENCourseNode(parent); } @Override diff --git a/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java b/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java index 5be4c9b27a63c06000f2dfd897c712d52518158e..0e9364352b4f1d05088d83a6b13dd1606d6616f1 100644 --- a/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java +++ b/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -65,8 +66,8 @@ public class LLCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new LLCourseNode(); + public CourseNode getInstance(INode parent) { + return new LLCourseNode(parent); } @Override diff --git a/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java b/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java index 3d996ed119b01849e223068779af8eec6b54c260..94bcbab2cf462237493a558633ff0136ec8f23bd 100644 --- a/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java +++ b/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java @@ -122,16 +122,18 @@ public class CourseExtensionHelper { * @return created course node */ public static final CourseNode createNode(ICourse course, final String shortTitle, final String longTitle, final String type) { + // edit session + course = CourseFactory.openCourseEditSession(course.getResourceableId()); + final CourseEditorTreeModel cetm = course.getEditorTreeModel(); + final CourseNode rootNode = cetm.getCourseNode(course.getRunStructure().getRootNode().getIdent()); + // create a node with default data CourseNodeConfiguration nodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type); - CourseNode node = nodeConfig.getInstance(); + CourseNode node = nodeConfig.getInstance(cetm.getRootNode()); node.setShortTitle(shortTitle); node.setLongTitle(longTitle); // append node to course - course = CourseFactory.openCourseEditSession(course.getResourceableId()); - final CourseEditorTreeModel cetm = course.getEditorTreeModel(); - final CourseNode rootNode = cetm.getCourseNode(course.getRunStructure().getRootNode().getIdent()); course.getEditorTreeModel().addCourseNode(node, rootNode); CourseFactory.saveCourseEditorTreeModel(course.getResourceableId()); CourseFactory.closeCourseEditSession(course.getResourceableId(), true); diff --git a/src/main/java/org/olat/course/archiver/ArchiverMainController.java b/src/main/java/org/olat/course/archiver/ArchiverMainController.java index a8e38f9b5f4eb401d28db98cd8f96414db7dfdd8..e5893443b5324566ecd7187f56b8bd72efac4ca9 100644 --- a/src/main/java/org/olat/course/archiver/ArchiverMainController.java +++ b/src/main/java/org/olat/course/archiver/ArchiverMainController.java @@ -319,7 +319,7 @@ public class ArchiverMainController extends MainLayoutBasicController { contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new TACourseNode()); main.setContent(contentCtr.getInitialComponent()); } else if (menuCommand.equals(CMD_GROUPTASKS)) { - contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new GTACourseNode(), new GTACourseNode(GTACourseNode.TYPE_INDIVIDUAL)); + contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new GTACourseNode(), new GTACourseNode(GTACourseNode.TYPE_INDIVIDUAL, null)); main.setContent(contentCtr.getInitialComponent()); } else if (menuCommand.equals(CMD_PROJECTBROKER)) { contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new ProjectBrokerCourseNode()); diff --git a/src/main/java/org/olat/course/editor/ChooseNodeController.java b/src/main/java/org/olat/course/editor/ChooseNodeController.java index 25ea9cc17d1391a11bc7bf6327446dabe88c97c8..5660952a4e82c0b928e88d58c5cb226964d36f16 100644 --- a/src/main/java/org/olat/course/editor/ChooseNodeController.java +++ b/src/main/java/org/olat/course/editor/ChooseNodeController.java @@ -139,28 +139,29 @@ public class ChooseNodeController extends BasicController { private void doCreateNode(String type) { ICourse course = CourseFactory.getCourseEditSession(courseOres.getResourceableId()); + CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel(); + CourseEditorTreeNode selectedNode = null; + int pos = 0; + if(editorTreeModel.getRootNode().equals(currentNode)) { + //root, add as last child + pos = currentNode.getChildCount(); + selectedNode = currentNode; + } else { + selectedNode = (CourseEditorTreeNode)currentNode.getParent(); + pos = currentNode.getPosition() + 1; + } + // user chose a position to insert a new node CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type); - createdNode = newNodeConfig.getInstance(); + createdNode = newNodeConfig.getInstance(selectedNode); // Set some default values String title = newNodeConfig.getLinkText(getLocale()); createdNode.setShortTitle(title); createdNode.setNoAccessExplanation(translate("form.noAccessExplanation.default")); - // Insert it now - CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel(); - if(editorTreeModel.getRootNode().equals(currentNode)) { - //root, add as last child - int pos = currentNode.getChildCount(); - CourseNode selectedNode = currentNode.getCourseNode(); - editorTreeModel.insertCourseNodeAt(createdNode, selectedNode, pos); - } else { - CourseEditorTreeNode parentNode = (CourseEditorTreeNode)currentNode.getParent(); - CourseNode selectedNode = parentNode.getCourseNode(); - int pos = currentNode.getPosition(); - editorTreeModel.insertCourseNodeAt(createdNode, selectedNode, pos + 1); - } + // Add node + editorTreeModel.insertCourseNodeAt(createdNode, selectedNode.getCourseNode(), pos); CourseFactory.saveCourseEditorTreeModel(course.getResourceableId()); } diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java index dee46399207c00d001c2a79606489e80c769ed9c..d6b7f26175d6a26c1bae40ed55b4fa193fde5f6e 100644 --- a/src/main/java/org/olat/course/editor/EditorMainController.java +++ b/src/main/java/org/olat/course/editor/EditorMainController.java @@ -436,16 +436,18 @@ public class EditorMainController extends MainLayoutBasicController implements G */ private void doCreateAlternateBuildingBlock(UserRequest ureq, ICourse course, CourseNode chosenNode, String selectAlternative) { if(!StringHelper.containsNonWhitespace(selectAlternative)) return; + + //get the parrent node + CourseEditorTreeNode cetn = (CourseEditorTreeNode)cetm.getNodeById(chosenNode.getIdent()); + CourseEditorTreeNode parentNode = (CourseEditorTreeNode)cetn.getParent(); + int position = cetn.getPosition() + 1; //create the alternative node CourseNodeConfiguration newConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(selectAlternative); - CourseNode newNode = newConfig.getInstance(); + CourseNode newNode = newConfig.getInstance(parentNode); //copy configurations chosenNode.copyConfigurationTo(newNode, course); //insert the node - CourseEditorTreeNode cetn = (CourseEditorTreeNode)cetm.getNodeById(chosenNode.getIdent()); - CourseEditorTreeNode parentNode = (CourseEditorTreeNode)cetn.getParent(); - int position = cetn.getPosition() + 1; CourseEditorTreeNode newCetn = course.getEditorTreeModel().insertCourseNodeAt(newNode, parentNode.getCourseNode(), position); doInsert(ureq, newNode); @@ -521,6 +523,8 @@ public class EditorMainController extends MainLayoutBasicController implements G String type = chosenNode.getType(); CourseNodeConfiguration cnConfig = CourseNodeFactory.getInstance().getCourseNodeConfigurationEvenForDisabledBB(type); if (cnConfig.isEnabled()) { + CourseEditorTreeNode parent = (CourseEditorTreeNode) cetm.getNodeById(chosenNode.getIdent()); + chosenNode.updateModuleConfigDefaults(false, parent); nodeEditCntrllr = chosenNode.createEditController(ureq, getWindowControl(), stackPanel, course, euce); listenTo(nodeEditCntrllr); nodeEditCntrllr.addTabs(tabbedNodeConfig); diff --git a/src/main/java/org/olat/course/editor/MultiSPController.java b/src/main/java/org/olat/course/editor/MultiSPController.java index d53da1dd07c0edd2b2bbc9c213b7c5fed93afc80..ba4e7bf7133efd171799dd654c7a4033dd8e195b 100644 --- a/src/main/java/org/olat/course/editor/MultiSPController.java +++ b/src/main/java/org/olat/course/editor/MultiSPController.java @@ -211,14 +211,14 @@ public class MultiSPController extends FormBasicController { CourseNode newNode = null; if(item instanceof VFSLeaf) { //create node - newNode = createCourseNode(item, "sp"); + newNode = createCourseNode(parentNode, item, "sp"); ModuleConfiguration moduleConfig = newNode.getModuleConfiguration(); String path = VFSManager.getRelativeItemPath(item, rootContainer, null); moduleConfig.set(SPEditController.CONFIG_KEY_FILE, path); moduleConfig.setBooleanEntry(SPEditController.CONFIG_KEY_ALLOW_RELATIVE_LINKS, true); } else if (item instanceof VFSContainer) { //add structure - newNode = createCourseNode(item, "st"); + newNode = createCourseNode(parentNode, item, "st"); } int pos = -1; @@ -244,9 +244,9 @@ public class MultiSPController extends FormBasicController { } } - private CourseNode createCourseNode(VFSItem item, String type) { + private CourseNode createCourseNode(CourseNode parent, VFSItem item, String type) { CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type); - CourseNode newNode = newNodeConfig.getInstance(); + CourseNode newNode = newNodeConfig.getInstance(parent); String name = item.getName(); if (name.length() > NodeConfigFormController.SHORT_TITLE_MAX_LENGTH) { String shortName = name.substring(0, NodeConfigFormController.SHORT_TITLE_MAX_LENGTH - 1); diff --git a/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java b/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java index f4b8f7c3df3c976bc5df8c97ab42cd06fd468585..decc65f976eccd1449aeb7b82fe10a171474d6bd 100644 --- a/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java +++ b/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java @@ -306,7 +306,8 @@ public class MergedCourseElementDataContainer extends MergeSource { private VFSContainer getBCContainer(ICourse course, BCCourseNode bcNode, NodeEvaluation nodeEval, UserCourseEnvironment userCourseEnv, boolean isOlatAdmin) { - bcNode.updateModuleConfigDefaults(false); + CourseNode parent = bcNode.getParent() instanceof CourseNode? (CourseNode)bcNode.getParent(): null; + bcNode.updateModuleConfigDefaults(false, parent); // add folder not to merge source. Use name and node id to have unique name VFSContainer rootFolder = null; String subpath = bcNode.getModuleConfiguration().getStringValue(BCCourseNode.CONFIG_SUBPATH); diff --git a/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java index 30324b6f5bf2d2116432052822be00433b73a7a4..aeeea5cb092c68139ced1cb2867c32f61ef90c1a 100644 --- a/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java +++ b/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java @@ -37,6 +37,8 @@ public interface LearningPathConfigs { public static final AssessmentObligation OBLIGATION_DEFAULT = AssessmentObligation.mandatory; public static final FullyAssessedTrigger TRIGGER_DEFAULT = FullyAssessedTrigger.confirmed; + public Boolean hasSequentialChildren(); + public Integer getDuration(); public void setDuration(Integer duration); diff --git a/src/main/java/org/olat/course/learningpath/LearningPathService.java b/src/main/java/org/olat/course/learningpath/LearningPathService.java index ecddf214ee61fda9a80a10241c5888d074375350..7d6490763e8627c5a4a74d2fffdf4c4bc1d5c74a 100644 --- a/src/main/java/org/olat/course/learningpath/LearningPathService.java +++ b/src/main/java/org/olat/course/learningpath/LearningPathService.java @@ -37,6 +37,8 @@ public interface LearningPathService { public LearningPathConfigs getConfigs(CourseNode courseNode); public LearningPathEditConfigs getEditConfigs(CourseNode courseNode); + + public SequenceConfig getSequenceConfig(CourseNode courseNode); public List<CourseNode> getUnsupportedCourseNodes(ICourse course); diff --git a/src/main/java/org/olat/course/learningpath/SequenceConfig.java b/src/main/java/org/olat/course/learningpath/SequenceConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..8c477723de3e3364bd2032978df95439184b6e4c --- /dev/null +++ b/src/main/java/org/olat/course/learningpath/SequenceConfig.java @@ -0,0 +1,34 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.learningpath; + +/** + * + * Initial date: 6 Feb 2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public interface SequenceConfig { + + public boolean isInSequence(); + + public boolean hasSequentialChildren(); + +} diff --git a/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java b/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java index 3d62afc966b50964c48bb805a713240613102168..f9a5445497e58685f76b37ac7679e95036562103 100644 --- a/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java +++ b/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java @@ -19,6 +19,9 @@ */ package org.olat.course.learningpath.manager; +import org.olat.core.CoreSpringFactory; +import org.olat.course.learningpath.LearningPathService; +import org.olat.course.learningpath.SequenceConfig; import org.olat.course.learningpath.evaluation.AccessEvaluator; import org.olat.course.learningpath.evaluation.LinearAccessEvaluator; import org.olat.course.learningpath.ui.LearningPathTreeNode; @@ -28,6 +31,7 @@ import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeNode; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.assessment.model.AssessmentEntryStatus; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -39,14 +43,19 @@ public class LearningPathCourseTreeModelBuilder extends CourseTreeModelBuilder { private static final AccessEvaluator accessEvaluator = new LinearAccessEvaluator(); + @Autowired + private LearningPathService learningPathService; + public LearningPathCourseTreeModelBuilder(UserCourseEnvironment userCourseEnv) { super(userCourseEnv); + CoreSpringFactory.autowireObject(this); } @Override protected CourseTreeNode createCourseTreeNode(CourseNode courseNode, int treeLevel) { AssessmentEvaluation assessmentEvaluation = userCourseEnv.getScoreAccounting().evalCourseNode(courseNode); - LearningPathTreeNode learningPathTreeNode = new LearningPathTreeNode(courseNode, treeLevel, assessmentEvaluation); + SequenceConfig sequenceConfig = learningPathService.getSequenceConfig(courseNode); + LearningPathTreeNode learningPathTreeNode = new LearningPathTreeNode(courseNode, treeLevel, sequenceConfig, assessmentEvaluation); learningPathTreeNode.setVisible(true); boolean accessible = accessEvaluator.isAccessible(learningPathTreeNode, userCourseEnv); diff --git a/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java b/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java index fa2f7d70c957152c0d880dcee53f86b79c6c199c..ad06aba317fbe30da073124b214b72a68a16f558 100644 --- a/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java +++ b/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java @@ -22,12 +22,15 @@ package org.olat.course.learningpath.manager; import java.util.List; import org.olat.core.id.Identity; +import org.olat.core.util.nodes.INode; import org.olat.core.util.tree.TreeVisitor; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.learningpath.LearningPathConfigs; import org.olat.course.learningpath.LearningPathEditConfigs; import org.olat.course.learningpath.LearningPathService; +import org.olat.course.learningpath.SequenceConfig; +import org.olat.course.learningpath.model.SequenceConfigImpl; import org.olat.course.nodes.CollectingVisitor; import org.olat.course.nodes.CourseNode; import org.olat.course.tree.CourseEditorTreeModel; @@ -60,6 +63,38 @@ public class LearningPathServiceImpl implements LearningPathService { return registry.getLearningPathNodeHandler(courseNode).getEditConfigs(); } + @Override + public SequenceConfig getSequenceConfig(CourseNode courseNode) { + LearningPathConfigs lpConfig = registry.getLearningPathNodeHandler(courseNode).getConfigs(courseNode); + Boolean hasSequentialChildren = lpConfig.hasSequentialChildren(); + Boolean inheritedSequencialChildren = getInheritedSequencialChildren(courseNode); + + boolean sequentialChildren = hasSequentialChildren != null + ? hasSequentialChildren.booleanValue() // Node defines config itself + : Boolean.TRUE.equals(inheritedSequencialChildren); // use the inherited config + boolean inSequence = inheritedSequencialChildren != null + ? inheritedSequencialChildren.booleanValue() + : sequentialChildren; // root has no inherited config, take the config from the root itself + + return new SequenceConfigImpl( inSequence, sequentialChildren); + } + + private Boolean getInheritedSequencialChildren(CourseNode courseNode) { + INode parentNode = courseNode.getParent(); + if (parentNode instanceof CourseNode) { + CourseNode parent = (CourseNode)parentNode; + LearningPathConfigs parentConfig = registry.getLearningPathNodeHandler(parent).getConfigs(parent); + + Boolean hasSequentialChildren = parentConfig.hasSequentialChildren(); + if (hasSequentialChildren != null) { + return hasSequentialChildren; + } + + return getInheritedSequencialChildren(parent); + } + return null; + } + @Override public List<CourseNode> getUnsupportedCourseNodes(ICourse course) { CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel(); diff --git a/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java index 7de30970c74ffc0162a0e9900d67d66ec361babd..23340478d3aac6c9d34999c014463260c9a7be1d 100644 --- a/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java +++ b/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java @@ -58,6 +58,11 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs { this.doneOnFullyAssessed = doneOnFullyAssessed; } + @Override + public Boolean hasSequentialChildren() { + return null; + } + @Override public Integer getDuration() { String duration = moduleConfiguration.getStringValue(CONFIG_KEY_DURATION); diff --git a/src/main/java/org/olat/course/learningpath/model/SequenceConfigImpl.java b/src/main/java/org/olat/course/learningpath/model/SequenceConfigImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..93c2dc4a7fe49a57803f989aa55ea27dbd2ebc4e --- /dev/null +++ b/src/main/java/org/olat/course/learningpath/model/SequenceConfigImpl.java @@ -0,0 +1,50 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.learningpath.model; + +import org.olat.course.learningpath.SequenceConfig; + +/** + * + * Initial date: 6 Feb 2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public class SequenceConfigImpl implements SequenceConfig { + + private final boolean inSequence; + private final boolean sequentialChildren; + + public SequenceConfigImpl(boolean inSequence, boolean sequentialChildren) { + this.inSequence = inSequence; + this.sequentialChildren = sequentialChildren; + } + + @Override + public boolean isInSequence() { + return inSequence; + } + + @Override + public boolean hasSequentialChildren() { + return sequentialChildren; + } + +} diff --git a/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java index 3c46f199efa2dd690629958b0d4dfc32876b514c..c8e8e5013522d24534680b86e5f5bca2c1885533 100644 --- a/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java +++ b/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java @@ -34,6 +34,11 @@ import org.olat.modules.assessment.model.AssessmentObligation; */ public class UnsupportedLearningPathConfigs implements LearningPathConfigs { + @Override + public Boolean hasSequentialChildren() { + return null; + } + @Override public Integer getDuration() { return null; diff --git a/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java b/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java index 3f79deff82dd205e11cc6d1618564da77cf02427..823b0db94b9b8b098c54522a02e5bee657bb57c8 100644 --- a/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java +++ b/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java @@ -21,6 +21,7 @@ package org.olat.course.learningpath.ui; import java.util.Date; +import org.olat.course.learningpath.SequenceConfig; import org.olat.course.nodes.CourseNode; import org.olat.course.run.scoring.AssessmentEvaluation; import org.olat.course.run.userview.CourseTreeNode; @@ -38,13 +39,20 @@ public class LearningPathTreeNode extends CourseTreeNode { private static final long serialVersionUID = -9033714563825036957L; + private final SequenceConfig sequenceConfig; private final AssessmentEvaluation assessmentEvaluation; - public LearningPathTreeNode(CourseNode courseNode, int treeLevel, AssessmentEvaluation assessmentEvaluation) { + public LearningPathTreeNode(CourseNode courseNode, int treeLevel, SequenceConfig sequenceConfig, + AssessmentEvaluation assessmentEvaluation) { super(courseNode, treeLevel); + this.sequenceConfig = sequenceConfig; this.assessmentEvaluation = assessmentEvaluation; } - + + public SequenceConfig getSequenceConfig() { + return sequenceConfig; + } + public Date getStartDate() { return assessmentEvaluation != null? assessmentEvaluation.getStartDate(): null; } diff --git a/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java b/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java index b9f0b330fd25cfae06bf717622959dde14de3cc8..bdae7e27d4ed2281e9f9eaca5dd460a0214616c6 100644 --- a/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java +++ b/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.List; import org.olat.core.id.IdentityEnvironment; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.Condition; import org.olat.course.condition.additionalconditions.AdditionalCondition; @@ -59,9 +60,10 @@ public abstract class AbstractAccessableCourseNode extends GenericCourseNode { * Constructor, only used by implementing course nodes * * @param type The course node type + * @param parent to init the module configuration */ - protected AbstractAccessableCourseNode(String type) { - super(type); + protected AbstractAccessableCourseNode(String type, INode parent) { + super(type, parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java b/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java index 88e040a6cee86cbfd0419e01f2eba45d760b2818..d542d5650fe77ea6d61106463b05397b2a7d8584 100644 --- a/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java +++ b/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java @@ -40,6 +40,7 @@ import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.ValidationStatus; +import org.olat.core.util.nodes.INode; import org.olat.course.CourseModule; import org.olat.course.ICourse; import org.olat.course.condition.Condition; @@ -91,9 +92,8 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod protected Condition preConditionReader, preConditionPoster, preConditionModerator; - public AbstractFeedCourseNode(String type) { - super(type); - updateModuleConfigDefaults(true); + public AbstractFeedCourseNode(String type, INode parent) { + super(type, parent); } protected abstract String getTranslatorPackage(); @@ -111,8 +111,6 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); - String translatorPackage = getTranslatorPackage(); FeedUIFactory uiFactory = getFeedUIFactory(ureq.getLocale()); String resourceablTypeName = getResourceablTypeName(); @@ -131,8 +129,6 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - RepositoryEntry entry = getReferencedRepositoryEntry(); FeedSecurityCallback callback = getFeedSecurityCallback(ureq, entry, userCourseEnv, nodeSecCallback); SubscriptionContext subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), @@ -204,7 +200,7 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); int version = config.getConfigurationVersion(); diff --git a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java index 97ddb99ffc8c5cea1efa6565335af5c1de5daada..771f1dec5d3348fde16bf6cf085c4015dcdf5f8f 100644 --- a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java +++ b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java @@ -71,7 +71,11 @@ public class AdobeConnectCourseNode extends AbstractAccessableCourseNode { private transient CourseGroupManager groupMgr; public AdobeConnectCourseNode() { - super(TYPE); + this(null); + } + + public AdobeConnectCourseNode(CourseNode parent) { + super(TYPE, parent); } private void updateModuleConfigDefaults(RepositoryEntry courseEntry, boolean isNewNode) { diff --git a/src/main/java/org/olat/course/nodes/BCCourseNode.java b/src/main/java/org/olat/course/nodes/BCCourseNode.java index 40763e7c65f1c9d99c6773f687eccacfb9848de4..2cf38dcdc345bd41fffb64f8baeba965fb7b649e 100644 --- a/src/main/java/org/olat/course/nodes/BCCourseNode.java +++ b/src/main/java/org/olat/course/nodes/BCCourseNode.java @@ -46,6 +46,7 @@ import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.NamedContainerImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; @@ -94,13 +95,15 @@ public class BCCourseNode extends AbstractAccessableCourseNode { private Condition preConditionUploaders, preConditionDownloaders; public BCCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public BCCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); BCCourseNodeEditController childTabCntrllr = new BCCourseNodeEditController(ureq, wControl, stackPanel, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -116,7 +119,6 @@ public class BCCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); BCCourseNodeRunController bcCtrl = new BCCourseNodeRunController(ureq, wControl, userCourseEnv, this, nodeSecCallback.getNodeEvaluation()); if (StringHelper.containsNonWhitespace(nodecmd)) { bcCtrl.activatePath(ureq, nodecmd); @@ -129,8 +131,6 @@ public class BCCourseNode extends AbstractAccessableCourseNode { public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { if (nodeSecCallback.isAccessible()) { - updateModuleConfigDefaults(false); - // Create a folder peekview controller that shows the latest two entries VFSContainer rootFolder = null; if(getModuleConfiguration().getBooleanSafe(CONFIG_AUTO_FOLDER)) { @@ -316,7 +316,8 @@ public class BCCourseNode extends AbstractAccessableCourseNode { @Override public StatusDescription isConfigValid() { - updateModuleConfigDefaults(false); + CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null; + updateModuleConfigDefaults(false, parent); StatusDescription sd = StatusDescription.NOERROR; if(!getModuleConfiguration().getBooleanSafe(CONFIG_AUTO_FOLDER)){ @@ -427,7 +428,7 @@ public class BCCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); int version = config.getConfigurationVersion(); diff --git a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java index 025b95a4f0be31b0880b7043b9edcdf3a01d0d78..40ed539453018fa811ff2b3466258442b3d4e649 100644 --- a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java +++ b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java @@ -39,6 +39,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Roles; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.editor.ConditionAccessEditConfig; import org.olat.course.editor.CourseEditorEnv; @@ -88,13 +89,15 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode { private static final String NLS_ERROR_HOSTMISSING_LONG = "error.hostmissing.long"; public BasicLTICourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public BasicLTICourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); LTIEditController childTabCntrllr = new LTIEditController(getModuleConfiguration(), ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -108,8 +111,6 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - Controller runCtrl; if(userCourseEnv.isCourseReadOnly()) { Translator trans = Util.createPackageTranslator(BasicLTICourseNode.class, ureq.getLocale()); @@ -146,6 +147,8 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode { @Override public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { + CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null; + updateModuleConfigDefaults(false, parent); return createNodeRunConstructionResult(ureq, wControl, userCourseEnv, nodeSecCallback, null).getRunController(); } @@ -197,13 +200,12 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks diff --git a/src/main/java/org/olat/course/nodes/BlogCourseNode.java b/src/main/java/org/olat/course/nodes/BlogCourseNode.java index 55b86ce0906de5f26113db71d178d0e2e5e474c1..b3805951cf92b3f3e77b41536dece2f802429683 100644 --- a/src/main/java/org/olat/course/nodes/BlogCourseNode.java +++ b/src/main/java/org/olat/course/nodes/BlogCourseNode.java @@ -22,6 +22,7 @@ package org.olat.course.nodes; import java.util.Locale; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.feed.blog.BlogCourseNodeConfiguration; import org.olat.fileresource.types.BlogFileResource; import org.olat.modules.webFeed.manager.FeedManager; @@ -45,8 +46,8 @@ public class BlogCourseNode extends AbstractFeedCourseNode { public static final String TYPE = FeedManager.KIND_BLOG; - public BlogCourseNode() { - super(TYPE); + public BlogCourseNode(INode parent) { + super(TYPE, parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/COCourseNode.java b/src/main/java/org/olat/course/nodes/COCourseNode.java index 55569090b610f7c150a039e1d91880094afd4d33..34d637b986874da93222785b45d2d17541504136 100755 --- a/src/main/java/org/olat/course/nodes/COCourseNode.java +++ b/src/main/java/org/olat/course/nodes/COCourseNode.java @@ -40,6 +40,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Roles; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -72,14 +73,16 @@ public class COCourseNode extends AbstractAccessableCourseNode { private static final String TYPE = "co"; - public COCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); - } + public COCourseNode() { + this(null); + } + + public COCourseNode(INode parent) { + super(TYPE, parent); + } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); COEditController childTabCntrllr = new COEditController(getModuleConfiguration(), ureq, wControl, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -93,7 +96,6 @@ public class COCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller controller; // Do not allow guests to send anonymous emails Roles roles = ureq.getUserSession().getRoles(); @@ -220,7 +222,8 @@ public class COCourseNode extends AbstractAccessableCourseNode { @Override public StatusDescription isConfigValid() { - updateModuleConfigDefaults(false); + CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null; + updateModuleConfigDefaults(false, parent); if (oneClickStatusCache != null) { return oneClickStatusCache[0]; } /** @@ -360,7 +363,7 @@ public class COCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration mc = getModuleConfiguration(); int version = mc.getConfigurationVersion(); diff --git a/src/main/java/org/olat/course/nodes/CPCourseNode.java b/src/main/java/org/olat/course/nodes/CPCourseNode.java index 9997a809ef562756ec16af93fe55ef224056afcb..55abf30ca7bca2dd1af0f429f88adf8dcc9baa04 100644 --- a/src/main/java/org/olat/course/nodes/CPCourseNode.java +++ b/src/main/java/org/olat/course/nodes/CPCourseNode.java @@ -42,6 +42,7 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; @@ -77,13 +78,15 @@ public class CPCourseNode extends AbstractAccessableCourseNode { private static final String TYPE = "cp"; public CPCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public CPCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); CPEditController childTabCntrllr = new CPEditController(ureq, wControl, stackPanel, this); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -97,7 +100,6 @@ public class CPCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); OLATResourceable ores = OresHelper.createOLATResourceableInstance(ICourse.class, userCourseEnv.getCourseEnvironment().getCourseResourceableId()); CPRunController cprunC = new CPRunController(getModuleConfiguration(), ureq, wControl, this, nodecmd, ores, false); return cprunC.createNodeRunConstructionResult(ureq, null); @@ -105,7 +107,6 @@ public class CPCourseNode extends AbstractAccessableCourseNode { @Override public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { - updateModuleConfigDefaults(false); OLATResourceable ores = OresHelper.createOLATResourceableInstance(ICourse.class, userCourseEnv.getCourseEnvironment().getCourseResourceableId()); return new CPRunController(getModuleConfiguration(), ureq, wControl, this, null, ores, true); } @@ -161,13 +162,12 @@ public class CPCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { int CURRENTVERSION = 7; ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { diff --git a/src/main/java/org/olat/course/nodes/CalCourseNode.java b/src/main/java/org/olat/course/nodes/CalCourseNode.java index a7f117c070f4b0bac1cea252f0fa0f1b86098f6c..e1b3b42064f6e1e95ee73aad3d44d6cec69dd911 100644 --- a/src/main/java/org/olat/course/nodes/CalCourseNode.java +++ b/src/main/java/org/olat/course/nodes/CalCourseNode.java @@ -29,6 +29,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.Condition; import org.olat.course.condition.interpreter.ConditionExpression; @@ -63,16 +64,16 @@ public class CalCourseNode extends AbstractAccessableCourseNode { public static final String EDIT_CONDITION_ID = "editarticle"; private Condition preConditionEdit; - /** - * Default constructor for course node of type calendar - */ public CalCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public CalCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks @@ -103,29 +104,17 @@ public class CalCourseNode extends AbstractAccessableCourseNode { postExportCondition(preConditionEdit, envMapper, backwardsCompatible); } - /** - * @see org.olat.course.nodes.CourseNode#createEditController(org.olat.core.gui.UserRequest, - * org.olat.core.gui.control.WindowControl, org.olat.course.ICourse) - */ @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); CalEditController childTabCntrllr = new CalEditController(getModuleConfiguration(), ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); } - /** - * @see org.olat.course.nodes.CourseNode#createNodeRunConstructionResult(org.olat.core.gui.UserRequest, - * org.olat.core.gui.control.WindowControl, - * org.olat.course.run.userview.UserCourseEnvironment, - * org.olat.course.run.userview.NodeEvaluation) - */ @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); CalRunController calCtlr = new CalRunController(wControl, ureq, this, userCourseEnv, nodeSecCallback.getNodeEvaluation()); Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, calCtlr, this, "o_cal_icon"); return new NodeRunConstructionResult(wrapperCtrl); diff --git a/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java b/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java index 1b4f06f6305f6e3250b18689b971aea7269d3018..f3cb0fa08608f3526441dad1758cb77c9db3de56 100644 --- a/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java +++ b/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java @@ -30,6 +30,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -63,13 +64,16 @@ public class Card2BrainCourseNode extends AbstractAccessableCourseNode { public static final String CONFIG_PRIVATE_SECRET = "privateSecret"; public Card2BrainCourseNode() { - super(TYPE); + this(null); + } + + public Card2BrainCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); Card2BrainEditController childTabCntrllr = new Card2BrainEditController(ureq, wControl, getModuleConfiguration()); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -83,9 +87,6 @@ public class Card2BrainCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - - updateModuleConfigDefaults(false); - Controller runCtrl; if(userCourseEnv.isCourseReadOnly()) { Translator trans = Util.createPackageTranslator(Card2BrainCourseNode.class, ureq.getLocale()); diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java index 93606362dc8e4e64d41013fd4aae2015fd60c77b..626cb4f40e94825aba27c3788e391cd0951003bc 100644 --- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java +++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java @@ -49,6 +49,7 @@ import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; @@ -111,13 +112,15 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode { public static final String FOLDER_NAME = "checklistfiles"; public CheckListCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public CheckListCourseNode(CourseNode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); CheckListEditController childTabCntrllr = new CheckListEditController(this, ureq, wControl, course); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -131,8 +134,6 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - Controller ctrl; OLATResourceable ores = OresHelper.createOLATResourceableInstance("CourseModule", userCourseEnv.getCourseEnvironment().getCourseResourceableId()); Roles roles = ureq.getUserSession().getRoles(); @@ -627,13 +628,12 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { config.setConfigurationVersion(1); diff --git a/src/main/java/org/olat/course/nodes/CourseNode.java b/src/main/java/org/olat/course/nodes/CourseNode.java index dcd7c8879795eac0f9b9093a11853ed59420a1cb..0fd359770b8b6e56ae179f0eff936cedbc33504c 100644 --- a/src/main/java/org/olat/course/nodes/CourseNode.java +++ b/src/main/java/org/olat/course/nodes/CourseNode.java @@ -409,14 +409,16 @@ public interface CourseNode extends INode, ShortName { * @return */ public List<StatusDescription> publishUpdatesExplanations(CourseEditorEnv cev); - + /** * Update the module configuration to have all mandatory configuration flags - * set to usefull default values + * set to usefull default values. * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain - * previous behaviour + * previous behavior. + * @param parent Can be used to inherit default values. + * May be null if root node. Is of type CourseNode or CourseEditorTreeNode. * * This is the workflow: * On every click on a entry of the navigation tree, this method will be called @@ -429,7 +431,7 @@ public interface CourseNode extends INode, ShortName { * otherwise the editortree.xml and runstructure.xml of old courses would no longer be compatible. * */ - public void updateModuleConfigDefaults(boolean isNewNode); + public void updateModuleConfigDefaults(boolean isNewNode, INode parent); /** * Calculate the access and the visibility in the conventional node access type. diff --git a/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java index c6546a077d17920bfca0eb93f0b60d18bf7527d1..e1054e29db5ccad29f2f7fc90eb1689497789481 100644 --- a/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Locale; import org.olat.core.configuration.ConfigOnOff; +import org.olat.core.util.nodes.INode; /** * * Interface for course nodes @@ -39,7 +40,7 @@ public interface CourseNodeConfiguration extends ConfigOnOff{ public String getGroup(); - public CourseNode getInstance(); + public CourseNode getInstance(INode parent); public String getLinkText(Locale locale); diff --git a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java index 39ad1c135db9fe44d3bd37a43cfa5e211de2e1bf..ba3ccae6998b3eb4f3b7ab387151aa243775437a 100644 --- a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java +++ b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java @@ -41,6 +41,7 @@ import org.olat.core.configuration.PreWarm; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.WindowControl; import org.olat.core.logging.Tracing; +import org.olat.core.util.nodes.INode; import org.olat.course.CorruptedCourseException; import org.olat.repository.RepositoryEntry; import org.olat.repository.handlers.EditionSupport; @@ -216,7 +217,7 @@ public class CourseNodeFactory implements PreWarm { } @Override - public CourseNode getInstance() { + public CourseNode getInstance(INode parent) { return null; } diff --git a/src/main/java/org/olat/course/nodes/DialogCourseNode.java b/src/main/java/org/olat/course/nodes/DialogCourseNode.java index bc473f40397cd70233eccb534ab7a8d049a8b77f..dfe2f94e38b5df2b6ca1245a9362900aec8bf1d2 100644 --- a/src/main/java/org/olat/course/nodes/DialogCourseNode.java +++ b/src/main/java/org/olat/course/nodes/DialogCourseNode.java @@ -42,6 +42,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.util.Formatter; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; @@ -95,13 +96,15 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { private Condition preConditionReader, preConditionPoster, preConditionModerator; public DialogCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public DialogCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); DialogCourseNodeEditController childTabCntrllr = new DialogCourseNodeEditController(ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -117,7 +120,6 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); DialogSecurityCallback secCallback = SecurityCallbackFactory.create(this, userCourseEnv, nodeSecCallback.getNodeEvaluation()); DialogCourseNodeRunController ctrl = new DialogCourseNodeRunController(ureq, wControl, this, userCourseEnv, secCallback); Controller wrappedCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, ctrl, this, "o_dialog_icon"); @@ -156,13 +158,12 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); int version = config.getConfigurationVersion(); diff --git a/src/main/java/org/olat/course/nodes/ENCourseNode.java b/src/main/java/org/olat/course/nodes/ENCourseNode.java index 87bc2f52c11a98010e626c30d0a6c3a70a6f415d..8ec4dcbde38aa66141dde7021cb8ef50db4505e5 100644 --- a/src/main/java/org/olat/course/nodes/ENCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ENCourseNode.java @@ -48,6 +48,7 @@ import org.olat.core.id.Roles; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.filter.FilterFactory; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -130,12 +131,16 @@ public class ENCourseNode extends AbstractAccessableCourseNode { private static final int CURRENT_CONFIG_VERSION = 3; public ENCourseNode() { - super(TYPE); - initDefaultConfig(); + this(null); + } + + public ENCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { + //TODO uh migrateConfig(); ENEditController childTabCntrllr = new ENEditController(getModuleConfiguration(), ureq, wControl, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); diff --git a/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java b/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java index d43cf38862e08215cebb8315b0fc9252c1cb45f6..f759ef79f08fba4a365fbc969932f27141673e03 100644 --- a/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java +++ b/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java @@ -29,6 +29,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -61,14 +62,16 @@ public class EdubaseCourseNode extends AbstractAccessableCourseNode { public static final String CONFIG_BOOK_SECTIONS = "bookSections"; public EdubaseCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public EdubaseCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); EdubaseEditController childTabCntrllr = new EdubaseEditController(ureq, wControl, this); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -82,7 +85,6 @@ public class EdubaseCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller runCtrl; if(userCourseEnv.isCourseReadOnly()) { Translator trans = Util.createPackageTranslator(EdubaseCourseNode.class, ureq.getLocale()); @@ -130,7 +132,7 @@ public class EdubaseCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { config.setBooleanEntry(CONFIG_DESCRIPTION_ENABLED, Boolean.TRUE.booleanValue()); diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java index 1c136ea5a513d5be9878d8a0294b0e0939081a95..9c6c7beb9350e41967654d0eabfa7d5e3b809d4e 100644 --- a/src/main/java/org/olat/course/nodes/FOCourseNode.java +++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java @@ -52,6 +52,7 @@ import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.SyncerCallback; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseModule; import org.olat.course.ICourse; @@ -115,14 +116,16 @@ public class FOCourseNode extends AbstractAccessableCourseNode { private Condition preConditionReader, preConditionPoster, preConditionModerator; public FOCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public FOCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); FOCourseNodeEditController childTabCntrllr = new FOCourseNodeEditController(ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel() .getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); @@ -137,7 +140,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Roles roles = ureq.getUserSession().getRoles(); Forum theForum = loadOrCreateForum(userCourseEnv.getCourseEnvironment()); boolean isAdministrator = userCourseEnv.isAdmin(); @@ -211,7 +213,8 @@ public class FOCourseNode extends AbstractAccessableCourseNode { * @return the loaded forum */ public Forum loadOrCreateForum(final CourseEnvironment courseEnv) { - updateModuleConfigDefaults(false); + CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null; + updateModuleConfigDefaults(false, parent); Forum forum = null; List<Property> forumKeyProps = courseEnv.getCoursePropertyManager().findCourseNodeProperties(this, null, null, @@ -491,13 +494,12 @@ public class FOCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags set * to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading from * previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); int version = config.getConfigurationVersion(); diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java index 67e81815151597927fe324573e17ec431531322e..b0e9acc67dfa1d7fd2e7f51536450224bc9d5583 100644 --- a/src/main/java/org/olat/course/nodes/GTACourseNode.java +++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java @@ -55,6 +55,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; import org.olat.core.util.io.ShieldOutputStream; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.filters.VFSSystemItemFilter; @@ -162,13 +163,11 @@ public class GTACourseNode extends AbstractAccessableCourseNode { public static final String TYPE_INDIVIDUAL = "ita"; public GTACourseNode() { - super(TYPE_GROUP); - updateModuleConfigDefaults(true); + this(TYPE_GROUP, null); } - public GTACourseNode(String type) { - super(type); - updateModuleConfigDefaults(true); + public GTACourseNode(String type, INode parent) { + super(type, parent); } @Override @@ -182,7 +181,7 @@ public class GTACourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { if(isNewNode) { //setup default configuration ModuleConfiguration config = getModuleConfiguration(); @@ -798,7 +797,6 @@ public class GTACourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - Controller controller; Roles roles = ureq.getUserSession().getRoles(); if (roles.isGuestOnly()) { diff --git a/src/main/java/org/olat/course/nodes/GenericCourseNode.java b/src/main/java/org/olat/course/nodes/GenericCourseNode.java index bb35ec268b66298d21c455680c1b7f61c2217e2c..61d25423889b9770d1bffeee450c2778129e2c75 100644 --- a/src/main/java/org/olat/course/nodes/GenericCourseNode.java +++ b/src/main/java/org/olat/course/nodes/GenericCourseNode.java @@ -45,6 +45,7 @@ import org.olat.core.util.CodeHelper; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.nodes.GenericNode; +import org.olat.core.util.nodes.INode; import org.olat.core.util.xml.XStreamHelper; import org.olat.course.ICourse; import org.olat.course.condition.Condition; @@ -85,14 +86,13 @@ public abstract class GenericCourseNode extends GenericNode implements CourseNod * Generic course node constructor * * @param type The course node type - * - * ATTENTION: - * all course nodes must call updateModuleConfigDefaults(true) here + * @param parent to init the module config */ - public GenericCourseNode(String type) { + public GenericCourseNode(String type, INode parent) { super(); this.type = type; - moduleConfiguration = new ModuleConfiguration(); + this.moduleConfiguration = new ModuleConfiguration(); + this.updateModuleConfigDefaults(true, parent); } /** @@ -633,7 +633,7 @@ public abstract class GenericCourseNode extends GenericNode implements CourseNod } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { // } diff --git a/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java b/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java index 44726d1513bb7dbde2bf40a0ed1136bf1ed932ab..d81c8241b41d70b219aa5694a30047a0246701ea 100644 --- a/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java +++ b/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java @@ -33,6 +33,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Roles; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -68,11 +69,15 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode { private transient CourseGroupManager groupMgr; public GoToMeetingCourseNode() { - super(TYPE); + this(null); + } + + public GoToMeetingCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { // no update to default config necessary } @@ -85,7 +90,6 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment userCourseEnv) { - updateModuleConfigDefaults(false); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId()); // create edit controller GoToMeetingEditController childTabCntrllr = new GoToMeetingEditController(ureq, wControl); @@ -104,8 +108,6 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - Controller controller; Roles roles = ureq.getUserSession().getRoles(); if (roles.isGuestOnly()) { diff --git a/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java b/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java index a01d7a10b915a6dcc4ffb27378791c43e293124d..b005c23bcfed4a83fcf92a4384b0fa37da711d6b 100644 --- a/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java @@ -47,6 +47,7 @@ import org.olat.core.id.Identity; import org.olat.core.id.Organisation; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentManager; import org.olat.course.editor.ConditionAccessEditConfig; @@ -105,8 +106,11 @@ public class IQSELFCourseNode extends AbstractAccessableCourseNode implements Se public static final String TYPE = "iqself"; public IQSELFCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public IQSELFCourseNode(INode parent) { + super(TYPE, parent); } @Override @@ -305,13 +309,12 @@ public class IQSELFCourseNode extends AbstractAccessableCourseNode implements Se /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // add default module configuration diff --git a/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java b/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java index d00262f67e071650e814d297b60a9b378b4f6737..ff62aa20607e8c3dec94b2ccfd410386616ce6a9 100644 --- a/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java @@ -48,6 +48,7 @@ import org.olat.core.id.Roles; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentManager; @@ -105,8 +106,11 @@ public class IQSURVCourseNode extends AbstractAccessableCourseNode implements QT private static final String PACKAGE_IQ = Util.getPackageName(IQRunController.class); public IQSURVCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public IQSURVCourseNode(INode parent) { + super(TYPE, parent); } @Override @@ -324,13 +328,12 @@ public class IQSURVCourseNode extends AbstractAccessableCourseNode implements QT /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // add default module configuration diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java index 509f7a5eac90e0bc82f9deb841380fdeff853fca..f9d1270ac8cce2d41d156a22c366409aba4e94da 100644 --- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java @@ -51,6 +51,7 @@ import org.olat.core.id.Roles; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.ICourse; import org.olat.course.archiver.ScoreAccountingHelper; @@ -136,13 +137,15 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT private static final int CURRENT_CONFIG_VERSION = 2; public IQTESTCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public IQTESTCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); TabbableController childTabCntrllr = new IQEditController(ureq, wControl, stackPanel, course, this, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -156,8 +159,6 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - Controller controller; // Do not allow guests to start tests Roles roles = ureq.getUserSession().getRoles(); @@ -565,13 +566,12 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // add default module configuration diff --git a/src/main/java/org/olat/course/nodes/InfoCourseNode.java b/src/main/java/org/olat/course/nodes/InfoCourseNode.java index cae371c5a1a3668919b70c08880d060cc5a65678..395be586f44ed4f1d61039dfa87661d407f3195d 100644 --- a/src/main/java/org/olat/course/nodes/InfoCourseNode.java +++ b/src/main/java/org/olat/course/nodes/InfoCourseNode.java @@ -35,6 +35,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.CourseModule; import org.olat.course.ICourse; import org.olat.course.condition.Condition; @@ -73,12 +74,15 @@ public class InfoCourseNode extends AbstractAccessableCourseNode { private Condition preConditionAdmin; public InfoCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public InfoCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks @@ -148,7 +152,6 @@ public class InfoCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - InfoRunController infoCtrl = new InfoRunController(ureq, wControl, userCourseEnv, nodeSecCallback.getNodeEvaluation(), this); Controller titledCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, infoCtrl, this, "o_infomsg_icon"); return new NodeRunConstructionResult(titledCtrl); diff --git a/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java b/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java index 3708873adb6066415c75ddfeea04bd887aa515c3..5bcb7e91c45f2584c277e5ab0b25303d8e0c5a0e 100644 --- a/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java +++ b/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java @@ -30,6 +30,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -68,14 +69,16 @@ public class LiveStreamCourseNode extends AbstractAccessableCourseNode { public static final String CONFIG_PLAYER_PROFILE = "playerProfile"; public LiveStreamCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public LiveStreamCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); LiveStreamEditController editCtrl = new LiveStreamEditController(ureq, wControl, getModuleConfiguration()); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, editCtrl); @@ -89,8 +92,6 @@ public class LiveStreamCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - Controller runCtrl; if (userCourseEnv.isCourseReadOnly()) { Translator trans = Util.createPackageTranslator(Card2BrainCourseNode.class, ureq.getLocale()); @@ -130,7 +131,7 @@ public class LiveStreamCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { LiveStreamModule liveStreamModule = CoreSpringFactory.getImpl(LiveStreamModule.class); diff --git a/src/main/java/org/olat/course/nodes/MSCourseNode.java b/src/main/java/org/olat/course/nodes/MSCourseNode.java index 36a0a1fcb72798589bccf391222b2f5d2f5b832c..88db6c8443caf97b34b85984a136a81982bec8e2 100644 --- a/src/main/java/org/olat/course/nodes/MSCourseNode.java +++ b/src/main/java/org/olat/course/nodes/MSCourseNode.java @@ -49,6 +49,7 @@ import org.olat.core.id.Organisation; import org.olat.core.id.Roles; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.assessment.CourseAssessmentService; import org.olat.course.editor.ConditionAccessEditConfig; @@ -131,8 +132,11 @@ public class MSCourseNode extends AbstractAccessableCourseNode { public static final String CONFIG_DEFAULT_EVAL_FORM_SCALE = "1.0"; public MSCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public MSCourseNode(INode parent) { + super(TYPE, parent); } /** @@ -153,7 +157,7 @@ public class MSCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { initDefaultConfig(config); @@ -178,7 +182,6 @@ public class MSCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); MSCourseNodeEditController childTabCntrllr = new MSCourseNodeEditController(ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); diff --git a/src/main/java/org/olat/course/nodes/MembersCourseNode.java b/src/main/java/org/olat/course/nodes/MembersCourseNode.java index a1445e464ccb1d931076edc5329a192558b2bfd7..b6e2b5dc9336897894c893912c557fd5d0366010 100644 --- a/src/main/java/org/olat/course/nodes/MembersCourseNode.java +++ b/src/main/java/org/olat/course/nodes/MembersCourseNode.java @@ -30,6 +30,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Roles; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.editor.CourseEditorEnv; import org.olat.course.editor.NodeEditController; @@ -92,8 +93,11 @@ public class MembersCourseNode extends AbstractAccessableCourseNode { public MembersCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public MembersCourseNode(INode parent) { + super(TYPE, parent); } @Override @@ -122,7 +126,6 @@ public class MembersCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); MembersCourseNodeEditController childTabCntrllr = new MembersCourseNodeEditController(ureq, wControl, euce, this.getModuleConfiguration()); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -131,8 +134,6 @@ public class MembersCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - Controller controller; Roles roles = ureq.getUserSession().getRoles(); if (roles.isGuestOnly()) { @@ -149,12 +150,11 @@ public class MembersCourseNode extends AbstractAccessableCourseNode { @Override public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { - updateModuleConfigDefaults(false); return new MembersPeekViewController(ureq, wControl, userCourseEnv, getModuleConfiguration()); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); int version = config.getConfigurationVersion(); if(isNewNode){ diff --git a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java index 959c239ed17b09dd1dfc634376682df491f1fc0e..d4e81d20dd5b0539e825256224008939b13e0229 100644 --- a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java +++ b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java @@ -31,6 +31,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; @@ -69,11 +70,15 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode { private transient CourseGroupManager groupMgr; public OpenMeetingsCourseNode() { - super(TYPE); + this(null); + } + + public OpenMeetingsCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { // no update to default config necessary } @@ -86,7 +91,6 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment userCourseEnv) { - updateModuleConfigDefaults(false); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId()); // create edit controller OpenMeetingsEditController childTabCntrllr = new OpenMeetingsEditController(ureq, wControl, this, course); @@ -105,8 +109,6 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - // check if user is moderator of the virtual classroom boolean admin = userCourseEnv.isAdmin(); boolean moderator = admin || userCourseEnv.isCoach(); diff --git a/src/main/java/org/olat/course/nodes/PFCourseNode.java b/src/main/java/org/olat/course/nodes/PFCourseNode.java index 27e97004412e7ac99f4f9441f5b68f9137d4d4c6..8cd50eb1201104b78b46e757e7e9191633a6315d 100644 --- a/src/main/java/org/olat/course/nodes/PFCourseNode.java +++ b/src/main/java/org/olat/course/nodes/PFCourseNode.java @@ -40,6 +40,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.util.FileUtils; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.course.CourseModule; @@ -78,12 +79,15 @@ public class PFCourseNode extends AbstractAccessableCourseNode { public static final long serialVersionUID = 1L; public PFCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public PFCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { if (isNewNode) { // default is to enable both boxes without restrictions updateModuleConfig(true,true,true, false, 0, false, null, null); diff --git a/src/main/java/org/olat/course/nodes/PodcastCourseNode.java b/src/main/java/org/olat/course/nodes/PodcastCourseNode.java index f8ac350b7b307122cdfa26958871f7227944fd27..8e6887dc4cf6e919b3365b74c74c25f83ffbc1e2 100644 --- a/src/main/java/org/olat/course/nodes/PodcastCourseNode.java +++ b/src/main/java/org/olat/course/nodes/PodcastCourseNode.java @@ -22,6 +22,7 @@ package org.olat.course.nodes; import java.util.Locale; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.feed.podcast.PodcastCourseNodeConfiguration; import org.olat.fileresource.types.PodcastFileResource; import org.olat.modules.webFeed.manager.FeedManager; @@ -45,8 +46,8 @@ public class PodcastCourseNode extends AbstractFeedCourseNode { public static final String TYPE = FeedManager.KIND_PODCAST; - public PodcastCourseNode() { - super(TYPE); + public PodcastCourseNode(INode parent) { + super(TYPE, parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java index ab394044b081dc29ddffeffb9fe2204139916200..4070b56f15930e5bb9328f0d40ac78227d22350b 100644 --- a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java +++ b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java @@ -42,6 +42,7 @@ import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ValidationStatus; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.Condition; import org.olat.course.condition.interpreter.ConditionInterpreter; @@ -93,12 +94,15 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode { private Condition preConditionEdit; public PortfolioCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public PortfolioCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { MSCourseNode.initDefaultConfig(config); @@ -133,7 +137,6 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode { public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { PortfolioCourseNodeEditController childTabCntrllr = new PortfolioCourseNodeEditController(ureq, wControl, stackPanel, course, this, getModuleConfiguration(), euce); - updateModuleConfigDefaults(false); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); } @@ -146,7 +149,6 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller controller; Roles roles = ureq.getUserSession().getRoles(); if (roles.isGuestOnly()) { diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java index ed5e7021a578d5a60597886288153a7f9ae2173f..d8ea39eb0fca56e47be8b4eb72b45f872db7de96 100644 --- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java @@ -68,6 +68,7 @@ import org.olat.core.util.FileUtils; import org.olat.core.util.Formatter; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; @@ -169,13 +170,15 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { private Condition conditionProjectBroker; public ProjectBrokerCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public ProjectBrokerCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); ProjectBrokerCourseEditorController childTabCntrllr = ProjectBrokerControllerFactory.createCourseEditController(ureq, wControl, course, euce, this ); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); NodeEditController editController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -186,7 +189,6 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller controller; // Do not allow guests to access tasks Roles roles = ureq.getUserSession().getRoles(); @@ -662,7 +664,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks diff --git a/src/main/java/org/olat/course/nodes/SPCourseNode.java b/src/main/java/org/olat/course/nodes/SPCourseNode.java index ad600fa0b26cb9424f67ef5d96d97f79d7ce9b40..c66d035f46f0fa899d52d851c66c3a2daeadc9f9 100644 --- a/src/main/java/org/olat/course/nodes/SPCourseNode.java +++ b/src/main/java/org/olat/course/nodes/SPCourseNode.java @@ -35,6 +35,7 @@ import org.olat.core.gui.control.generic.iframe.DeliveryOptions; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.id.OLATResourceable; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSContainer; import org.olat.course.CourseModule; @@ -64,17 +65,16 @@ public class SPCourseNode extends AbstractAccessableCourseNode { private static final long serialVersionUID = -4565145351110778757L; public static final String TYPE = "sp"; - /** - * Default constructor for course node of type single page - */ public SPCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public SPCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); SPEditController childTabCntrllr = new SPEditController(getModuleConfiguration(), ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); NodeEditController nodeEditController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -91,8 +91,6 @@ public class SPCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); - VFSContainer container = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); SPRunController runController = new SPRunController(wControl, ureq, userCourseEnv, this, container); return new NodeRunConstructionResult(runController); @@ -174,13 +172,12 @@ public class SPCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks diff --git a/src/main/java/org/olat/course/nodes/STCourseNode.java b/src/main/java/org/olat/course/nodes/STCourseNode.java index 8bab1a76b64efda5367a5cecbc050faa7a71ea04..3ef10356ce2532eef69c4c645f1a83b928822370 100644 --- a/src/main/java/org/olat/course/nodes/STCourseNode.java +++ b/src/main/java/org/olat/course/nodes/STCourseNode.java @@ -49,6 +49,7 @@ import org.olat.core.logging.AssertException; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseFactory; import org.olat.course.CourseModule; @@ -74,6 +75,7 @@ import org.olat.course.run.scoring.ScoreCalculator; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.CourseNodeSecurityCallback; import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.course.tree.CourseEditorTreeNode; import org.olat.course.tree.CourseInternalLinkTreeModel; import org.olat.modules.ModuleConfiguration; import org.olat.repository.RepositoryEntry; @@ -112,15 +114,17 @@ public class STCourseNode extends AbstractAccessableCourseNode { transient private Condition scoreExpression; transient private Condition passedExpression; transient private Condition failedExpression; - + public STCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public STCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); STCourseNodeEditController childTabCntrllr = new STCourseNodeEditController(ureq, wControl, this, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); NodeEditController nodeEditController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -137,7 +141,6 @@ public class STCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller cont; String displayType = getModuleConfiguration().getStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE); @@ -344,13 +347,12 @@ public class STCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks @@ -401,11 +403,34 @@ public class STCourseNode extends AbstractAccessableCourseNode { } } if (config.getConfigurationVersion() < 5) { - config.setStringValue(CONFIG_LP_SEQUENCE_KEY, CONFIG_LP_SEQUENCE_DEFAULT); + STCourseNode stParent = getFirstSTParent(parent); + String sequence = stParent != null + ? stParent.getModuleConfiguration().getStringValue(CONFIG_LP_SEQUENCE_KEY, CONFIG_LP_SEQUENCE_DEFAULT) + : CONFIG_LP_SEQUENCE_DEFAULT; + config.setStringValue(CONFIG_LP_SEQUENCE_KEY, sequence); } config.setConfigurationVersion(CURRENT_VERSION); } + + private STCourseNode getFirstSTParent(INode node) { + if (node != null) { + CourseNode courseNode = null; + if (node instanceof CourseEditorTreeNode) { + CourseEditorTreeNode cetn = (CourseEditorTreeNode)node; + courseNode = cetn.getCourseNode(); + } + if (node instanceof CourseNode) { + courseNode = (CourseNode)node; + } + if (courseNode instanceof STCourseNode) { + return (STCourseNode)courseNode; + } + INode parentNode = node.getParent(); + return getFirstSTParent(parentNode); + } + return null; + } @Override public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCrourse) { diff --git a/src/main/java/org/olat/course/nodes/ScormCourseNode.java b/src/main/java/org/olat/course/nodes/ScormCourseNode.java index 8fee5b84cd85c5a391522af36c04e0290ab3e1d6..ae97f85dd537b437a9023942aef5fb4a1dbbcf87 100644 --- a/src/main/java/org/olat/course/nodes/ScormCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ScormCourseNode.java @@ -51,6 +51,7 @@ import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.editor.ConditionAccessEditConfig; import org.olat.course.editor.CourseEditorEnv; @@ -96,13 +97,15 @@ public class ScormCourseNode extends AbstractAccessableCourseNode { private final static String CONFIG_HEIGHT_AUTO = "auto"; public ScormCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public ScormCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); ScormEditController childTabCntrllr = new ScormEditController(this, ureq, wControl, course); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -116,7 +119,6 @@ public class ScormCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); ScormRunController cprunC = new ScormRunController(getModuleConfiguration(), ureq, userCourseEnv, wControl, this, false); Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, cprunC, this, "o_scorm_icon"); // no inline-in-olat-menu integration possible: no display configuration option @@ -125,7 +127,6 @@ public class ScormCourseNode extends AbstractAccessableCourseNode { @Override public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) { - updateModuleConfigDefaults(false); ScormRunController cprunC = new ScormRunController(getModuleConfiguration(), ureq, userCourseEnv, wControl, this, true); return new NodeRunConstructionResult(cprunC).getRunController(); } @@ -225,13 +226,12 @@ public class ScormCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks diff --git a/src/main/java/org/olat/course/nodes/SurveyCourseNode.java b/src/main/java/org/olat/course/nodes/SurveyCourseNode.java index e1aa6d4fd3101665a6ba85dc87beafcd65886cf3..7c4831555f2765992ad3d6b86534d2215603f3e7 100644 --- a/src/main/java/org/olat/course/nodes/SurveyCourseNode.java +++ b/src/main/java/org/olat/course/nodes/SurveyCourseNode.java @@ -39,6 +39,7 @@ import org.olat.core.id.Organisation; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -101,8 +102,11 @@ public class SurveyCourseNode extends AbstractAccessableCourseNode { public static final String CONFIG_KEY_REPORT_FOR_GUEST = "report.for.guest"; public SurveyCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public SurveyCourseNode(INode parent) { + super(TYPE, parent); } @Override @@ -141,7 +145,6 @@ public class SurveyCourseNode extends AbstractAccessableCourseNode { @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); RepositoryEntry courseEntry = euce.getCourseEditorEnv().getCourseGroupManager().getCourseEntry(); TabbableController childTabCtrl = new SurveyEditController(ureq, wControl, this, courseEntry); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); @@ -200,7 +203,7 @@ public class SurveyCourseNode extends AbstractAccessableCourseNode { } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { config.setBooleanEntry(CONFIG_KEY_EXECUTION_BY_OWNER, false); diff --git a/src/main/java/org/olat/course/nodes/TACourseNode.java b/src/main/java/org/olat/course/nodes/TACourseNode.java index 84e5d25006fc4993ee45cd14a358cf7fa145087f..2e6f0a9944f687652b08aa86573fafa43488b113 100644 --- a/src/main/java/org/olat/course/nodes/TACourseNode.java +++ b/src/main/java/org/olat/course/nodes/TACourseNode.java @@ -62,6 +62,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; import org.olat.core.util.io.ShieldOutputStream; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.NamedContainerImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; @@ -172,13 +173,15 @@ public class TACourseNode extends GenericCourseNode { private static final Logger log = Tracing.createLoggerFor(TACourseNode.class); public TACourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public TACourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); TACourseNodeEditController childTabCntrllr = new TACourseNodeEditController(ureq, wControl, course, this, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -187,7 +190,6 @@ public class TACourseNode extends GenericCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller controller; // Do not allow guests to access tasks Roles roles = ureq.getUserSession().getRoles(); @@ -715,7 +717,7 @@ public class TACourseNode extends GenericCourseNode { * Init config parameter with default values for a new course node. */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks diff --git a/src/main/java/org/olat/course/nodes/TUCourseNode.java b/src/main/java/org/olat/course/nodes/TUCourseNode.java index cb80d26765e5388741daa1d021299a677d52c3a8..b1974b49438e1d508fc0c2878a4bd10b28be569e 100644 --- a/src/main/java/org/olat/course/nodes/TUCourseNode.java +++ b/src/main/java/org/olat/course/nodes/TUCourseNode.java @@ -33,6 +33,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.editor.ConditionAccessEditConfig; import org.olat.course.editor.CourseEditorEnv; @@ -61,13 +62,15 @@ public class TUCourseNode extends AbstractAccessableCourseNode { private static final String NLS_ERROR_HOSTMISSING_LONG = "error.hostmissing.long"; public TUCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public TUCourseNode(CourseNode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); TUEditController childTabCntrllr = new TUEditController(getModuleConfiguration(), ureq, wControl, stackPanel, this, course); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -81,7 +84,6 @@ public class TUCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); return new NodeRunConstructionResult(new TURunController(wControl, getModuleConfiguration(), ureq, this, userCourseEnv.getCourseEnvironment())); } @@ -138,13 +140,12 @@ public class TUCourseNode extends AbstractAccessableCourseNode { /** * Update the module configuration to have all mandatory configuration flags * set to usefull default values - * * @param isNewNode true: an initial configuration is set; false: upgrading * from previous node configuration version, set default to maintain * previous behaviour */ @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks diff --git a/src/main/java/org/olat/course/nodes/VideoCourseNode.java b/src/main/java/org/olat/course/nodes/VideoCourseNode.java index 51c8e9e3fddcc5127107da6c08c7bf181190fe5c..c1c9e7edaa9eba37c906b9187e70d03682767476 100644 --- a/src/main/java/org/olat/course/nodes/VideoCourseNode.java +++ b/src/main/java/org/olat/course/nodes/VideoCourseNode.java @@ -32,6 +32,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.id.Identity; import org.olat.core.id.Organisation; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.ICourse; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.ConditionAccessEditConfig; @@ -62,13 +63,15 @@ public class VideoCourseNode extends AbstractAccessableCourseNode { public static final String TYPE = "video"; public VideoCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + + public VideoCourseNode(INode parent) { + super(TYPE, parent); } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) { - updateModuleConfigDefaults(false); VideoEditController childTabCntrllr = new VideoEditController(this, ureq, wControl, course, euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); @@ -94,7 +97,6 @@ public class VideoCourseNode extends AbstractAccessableCourseNode { UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); VideoRunController cprunC = new VideoRunController(getModuleConfiguration(), wControl, ureq, userCourseEnv, this); return cprunC.createNodeRunConstructionResult(ureq); } diff --git a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java index 165ebbb500873e51668984294a3e08b8e02f63b8..95d037d2cf24c7dc4ec4b99abab8535544a1b39b 100644 --- a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java @@ -32,6 +32,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseModule; import org.olat.course.ICourse; @@ -68,18 +69,21 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode { public static final String CONF_VC_CONFIGURATION = "vc_configuration"; public ViteroCourseNode() { - super(TYPE); + this(null); + } + + public ViteroCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { // no update to default config necessary } @Override public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment userCourseEnv) { - updateModuleConfigDefaults(false); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId()); // create edit controller ViteroEditController childTabCntrllr = new ViteroEditController(ureq, wControl, this, course, userCourseEnv); @@ -98,7 +102,6 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode { @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) { - updateModuleConfigDefaults(false); Controller runCtr; Roles roles = ureq.getUserSession().getRoles(); if (roles.isGuestOnly()) { diff --git a/src/main/java/org/olat/course/nodes/WikiCourseNode.java b/src/main/java/org/olat/course/nodes/WikiCourseNode.java index d96436a8b7c4c45d697ccc35bdd31838fc62c9b0..faf51a6fdd5067fb167417e4115b8e8d290adae8 100644 --- a/src/main/java/org/olat/course/nodes/WikiCourseNode.java +++ b/src/main/java/org/olat/course/nodes/WikiCourseNode.java @@ -50,6 +50,7 @@ import org.olat.core.logging.Tracing; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.VFSContainer; import org.olat.course.ICourse; import org.olat.course.condition.Condition; @@ -89,16 +90,15 @@ public class WikiCourseNode extends AbstractAccessableCourseNode { public static final String TYPE = "wiki"; private Condition preConditionEdit; - /** - * Default constructor for course node of type single page - */ public WikiCourseNode() { - super(TYPE); - updateModuleConfigDefaults(true); + this(null); + } + public WikiCourseNode(INode parent) { + super(TYPE, parent); } @Override - public void updateModuleConfigDefaults(boolean isNewNode) { + public void updateModuleConfigDefaults(boolean isNewNode, INode parent) { ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks @@ -124,7 +124,6 @@ public class WikiCourseNode extends AbstractAccessableCourseNode { WikiEditController childTabCntrllr = new WikiEditController(getModuleConfiguration(), ureq, wControl, this, course,euce); CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId()); return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr); - } @Override diff --git a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java index dde60a2a1b10f35fe3e42417d6a22d8c4449bf24..145a8dc5fe2a8c1830838ce84989ed2452ede05c 100644 --- a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.AdobeConnectCourseNode; import org.olat.course.nodes.CourseNode; @@ -70,7 +71,7 @@ public class AdobeConnectCourseNodeConfiguration extends AbstractCourseNodeConfi } @Override - public CourseNode getInstance() { + public CourseNode getInstance(INode parent) { return new AdobeConnectCourseNode(); } diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java index 07f46e3eccabdb589bfeaeec3b837c9c42f9416f..b8acb01f4137b26d5dc320eb3a5eb8e3daa64ca7 100644 --- a/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.BasicLTICourseNode; import org.olat.course.nodes.CourseNode; @@ -48,8 +49,8 @@ public class LTICourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new BasicLTICourseNode(); + public CourseNode getInstance(INode parent) { + return new BasicLTICourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java index 8838e808f26eff5c71bd86a2cfdf1745d3bb3e10..6e9f33a0152f1b97e38f66ffec123a099e15892c 100644 --- a/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.BCCourseNode; import org.olat.course.nodes.CourseNode; @@ -43,8 +44,8 @@ public class BCCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new BCCourseNode(); + public CourseNode getInstance(INode parent) { + return new BCCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java index 23f56a92a823b216dc5f6fc082e237cd81a0e832..7525a8d1bf6bd3ce6deb5f5b2efd4bc04a26e1cd 100644 --- a/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java @@ -26,6 +26,7 @@ import org.olat.commons.calendar.CalendarModule; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CalCourseNode; import org.olat.course.nodes.CourseNode; @@ -47,8 +48,8 @@ public class CalCourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new CalCourseNode(); + public CourseNode getInstance(INode parent) { + return new CalCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java index 53bf48cd3f93fc2ae6e0cce3aeb167dae3cdf044..bca34ec96c88d85ac3dd884ed7ee30f307a4e635 100644 --- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.Card2BrainCourseNode; import org.olat.course.nodes.CourseNode; @@ -50,8 +51,8 @@ public class Card2BrainCourseNodeConfiguration extends AbstractCourseNodeConfigu } @Override - public CourseNode getInstance() { - return new Card2BrainCourseNode(); + public CourseNode getInstance(INode parent) { + return new Card2BrainCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java index 11b2644ced1a99940b4f4535f26598ccf2936d36..5db31b17575328be1bd40c301c11fba2f7b4934e 100644 --- a/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CheckListCourseNode; import org.olat.course.nodes.CourseNode; @@ -42,8 +43,8 @@ public class CheckListCourseNodeConfiguration extends AbstractCourseNodeConfigur } @Override - public CourseNode getInstance() { - return new CheckListCourseNode(); + public CourseNode getInstance(INode parent) { + return new CheckListCourseNode(null); } @Override diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java index 18fd397628beaa3a6baabc6e14be879c7dc6a3d9..528b1fa9c93b2a20995c9ca87ea15cae133257d6 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java @@ -84,15 +84,15 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback { CourseEnvironment courseEnv = course.getCourseEnvironment(); CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class); - CourseNode structureNode = createCourseNode(data.getStructureShortTitle(), data.getStructureTitle(), data.getStructureObjectives(), "st"); - CourseEditorTreeNode parentNode = (CourseEditorTreeNode)course.getEditorTreeModel().getRootNode(); - course.getEditorTreeModel().addCourseNode(structureNode, parentNode.getCourseNode()); + CourseNode rootNode = ((CourseEditorTreeNode)course.getEditorTreeModel().getRootNode()).getCourseNode(); + CourseNode structureNode = createCourseNode(rootNode, data.getStructureShortTitle(), data.getStructureTitle(), data.getStructureObjectives(), "st"); + course.getEditorTreeModel().addCourseNode(structureNode, rootNode); List<CheckListNode> nodes = data.getNodes(); List<String> nodesIdent = new ArrayList<>(); for(CheckListNode node:nodes) { String title = node.getTitle(); - CheckListCourseNode checkNode = (CheckListCourseNode)createCourseNode(title, title, null, "checklist"); + CheckListCourseNode checkNode = (CheckListCourseNode)createCourseNode(structureNode, title, title, null, "checklist"); nodesIdent.add(checkNode.getIdent()); ModuleConfiguration config = checkNode.getModuleConfiguration(); @@ -173,9 +173,9 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback { stNode.setScoreCalculator(sc); } - private CourseNode createCourseNode(String shortTitle, String title, String objectives, String type) { + private CourseNode createCourseNode(CourseNode parent, String shortTitle, String title, String objectives, String type) { CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type); - CourseNode newNode = newNodeConfig.getInstance(); + CourseNode newNode = newNodeConfig.getInstance(parent); newNode.setShortTitle(shortTitle); newNode.setLongTitle(title); newNode.setLearningObjectives(objectives); diff --git a/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java index 67b1d363e0fa96d8d84e566d26e47ecb00127ed9..0a1dfd290edc46b440c077fae6c324655eed5328 100755 --- a/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.COCourseNode; import org.olat.course.nodes.CourseNode; @@ -42,8 +43,8 @@ public class COCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new COCourseNode(); + public CourseNode getInstance(INode parent) { + return new COCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java index db4d9b02aa9dbf33861647ace96b528a6647af9d..ea5a53479bab510b96d6805f36c22016a3437f94 100644 --- a/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CPCourseNode; import org.olat.course.nodes.CourseNode; @@ -43,8 +44,8 @@ public class CPCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new CPCourseNode(); + public CourseNode getInstance(INode parent) { + return new CPCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java index 905865c4d75458d7aa1ede34698607c0f9c4aeea..17cecfdc0f1561eda1268b8310337a1f1c2e9c8b 100644 --- a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -56,8 +57,8 @@ public class DialogCourseNodeConfiguration extends AbstractCourseNodeConfigurati } @Override - public CourseNode getInstance() { - return new DialogCourseNode(); + public CourseNode getInstance(INode parent) { + return new DialogCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java index ec9141e5c3872c74be5ee41ebb6e258d2cd96726..a5b1d9400c916ec5efd3f79b83209ad03666f69a 100644 --- a/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -50,8 +51,8 @@ public class EdubaseCourseNodeConfiguration extends AbstractCourseNodeConfigurat } @Override - public CourseNode getInstance() { - return new EdubaseCourseNode(); + public CourseNode getInstance(INode parent) { + return new EdubaseCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java index 35ea437633654f45498ec4b1aead9673b387999b..8253a9dd7d5b129ef4c5606b52c6bb6f05152f4a 100644 --- a/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -45,8 +46,8 @@ public class ENCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new ENCourseNode(); + public CourseNode getInstance(INode parent) { + return new ENCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/en/ENWebService.java b/src/main/java/org/olat/course/nodes/en/ENWebService.java index d8e8c5f2476a10ff9a641d8172c59cf4660a93a4..6e3aaceea87da6e34c441f3cce002fa552551fd7 100644 --- a/src/main/java/org/olat/course/nodes/en/ENWebService.java +++ b/src/main/java/org/olat/course/nodes/en/ENWebService.java @@ -218,7 +218,7 @@ public class ENWebService extends AbstractCourseNodeWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - CourseNode node = getParentNode(course, nodeId); + CourseNode node = getParentNode(course, nodeId).getCourseNode(); ModuleConfiguration config = node.getModuleConfiguration(); String groupNames = (String)config.get(ENCourseNode.CONFIG_GROUPNAME); @SuppressWarnings("unchecked") diff --git a/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java index e1bb814f8342646924d89b28edb59f23fea8d157..9a19a066560bc3b27fdc9272574f9af0e6eeb417 100644 --- a/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.BlogCourseNode; import org.olat.course.nodes.CourseNode; @@ -61,8 +62,8 @@ public class BlogCourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new BlogCourseNode(); + public CourseNode getInstance(INode parent) { + return new BlogCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java index 465e847606f3e3c7645e6073af4bc0f495de14f8..e1fa03e29f004a304c1836b6d625d26ef451eb4c 100644 --- a/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -61,8 +62,8 @@ public class PodcastCourseNodeConfiguration extends AbstractCourseNodeConfigurat } @Override - public CourseNode getInstance() { - return new PodcastCourseNode(); + public CourseNode getInstance(INode parent) { + return new PodcastCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java index b1e9ad390340cf8d82f40734445c1be801c2f1a3..6e16cb2024ca86e1c112bf420309d4c46c433a6f 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -47,8 +48,8 @@ public class FOCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new FOCourseNode(); + public CourseNode getInstance(INode parent) { + return new FOCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java index 7078a27172fb52645e6c41f70bd57aff9773c30f..796ab6ff448d9b4632067fbef0c9bef83666e022 100644 --- a/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -55,10 +56,11 @@ public class GoToMeetingCourseNodeConfiguration extends AbstractCourseNodeConfig } @Override - public CourseNode getInstance() { - return new GoToMeetingCourseNode(); + public CourseNode getInstance(INode parent) { + return new GoToMeetingCourseNode(parent); } + @Override public String getLinkText(Locale locale) { Translator fallback = Util.createPackageTranslator(CourseNodeConfiguration.class, locale); Translator translator = Util.createPackageTranslator(this.getClass(), locale, fallback); diff --git a/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java index c2db876c3673043511dacc17e17dd7db490a7b5a..63e360d1c9ef5cbc910663b39fb31c2f6b8cfaa1 100644 --- a/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -45,8 +46,8 @@ public class GTACourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new GTACourseNode(getAlias()); + public CourseNode getInstance(INode parent) { + return new GTACourseNode(getAlias(), parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java index 7be09a5dd9ebb5d0b58e158c0d29db45c77db30f..85634fce2cdb59c1197a5b768e119a8f089c0a34 100644 --- a/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -56,8 +57,8 @@ public class InfoCourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new InfoCourseNode(); + public CourseNode getInstance(INode parent) { + return new InfoCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java index ad980374339bd0c01a1d2695b47d435a1d2bc71a..b0cb44f5468964cb2f87e27f83f294fb99fec576 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -45,8 +46,8 @@ public class IQSELFCourseNodeConfiguration extends AbstractCourseNodeConfigurati } @Override - public CourseNode getInstance() { - return new IQSELFCourseNode(); + public CourseNode getInstance(INode parent) { + return new IQSELFCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java index 4b8f1c53a8cde64228f4771ea6761dde60036e1b..de0bdb3fa06522491701fc9847ac78552b09c683 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java @@ -30,6 +30,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -46,8 +47,8 @@ public class IQSURVCourseNodeConfiguration extends AbstractCourseNodeConfigurati } @Override - public CourseNode getInstance() { - return new IQSURVCourseNode(); + public CourseNode getInstance(INode parent) { + return new IQSURVCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java index 321416d372a0895caf8f338d2fa9900d155ad7a9..9bd89ae3701aad09f461f3684846a7c806091a8b 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -41,16 +42,13 @@ import org.olat.course.nodes.IQTESTCourseNode; */ public class IQTESTCourseNodeConfiguration extends AbstractCourseNodeConfiguration { - /** - * [spring] - */ private IQTESTCourseNodeConfiguration() { super(); } @Override - public CourseNode getInstance() { - return new IQTESTCourseNode(); + public CourseNode getInstance(INode parent) { + return new IQTESTCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java index 32b5fc30f0138ed9304cf54c1b67d53d37babcad..676d1e5e1520ff11c88b11669a99fa12f7621eab 100644 --- a/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeGroup; @@ -49,8 +50,8 @@ public class LiveStreamCourseNodeConfiguration extends AbstractCourseNodeConfigu } @Override - public CourseNode getInstance() { - return new LiveStreamCourseNode(); + public CourseNode getInstance(INode parent) { + return new LiveStreamCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java index ac3cb5d8fe99552d0e1f11c0e5ccf25abe15baa2..231c57a468d05514028352bfb64c3137c0e5ef59 100644 --- a/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -57,8 +58,8 @@ public class MembersCourseNodeConfiguration extends AbstractCourseNodeConfigurat } @Override - public CourseNode getInstance() { - return new MembersCourseNode(); + public CourseNode getInstance(INode parent) { + return new MembersCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java b/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java index aed0963e2b664c54e42dc677c76607340bf9520b..de15398c7d41a9dd8f269dfaf32c99cf990e2554 100644 --- a/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java +++ b/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java @@ -62,7 +62,8 @@ public class MSAssessmentHandler implements AssessmentHandler { @Override public AssessmentConfig getAssessmentConfig(CourseNode courseNode) { - courseNode.updateModuleConfigDefaults(false); + CourseNode parent = courseNode.getParent() instanceof CourseNode? (CourseNode)courseNode.getParent(): null; + courseNode.updateModuleConfigDefaults(false, parent); return new MSAssessmentConfig(courseNode.getModuleConfiguration()); } diff --git a/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java index ca78aa8f17c2abca8012c412b2726d3f5a1dc338..17e3098dae5a3c5c41060f0e0b1e29f969907afa 100644 --- a/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -42,8 +43,8 @@ public class MSCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new MSCourseNode(); + public CourseNode getInstance(INode parent) { + return new MSCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java index c5120dc82f76a979647ca06a3a076232ef314a68..7bfc7bd51ff069069be6350ac9db08e73a4becb0 100644 --- a/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -58,10 +59,11 @@ public class OpenMeetingsCourseNodeConfiguration extends AbstractCourseNodeConfi } @Override - public CourseNode getInstance() { - return new OpenMeetingsCourseNode(); + public CourseNode getInstance(INode parent) { + return new OpenMeetingsCourseNode(parent); } + @Override public String getLinkText(Locale locale) { Translator fallback = Util.createPackageTranslator(CourseNodeConfiguration.class, locale); Translator translator = Util.createPackageTranslator(this.getClass(), locale, fallback); diff --git a/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java index 5511d9a6f26f8386a1eb5c56f3761894e5dd6af2..ac0f56745a778587e365ca44a373029c6a58fc31 100644 --- a/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -50,8 +51,8 @@ public class PFCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new PFCourseNode(); + public CourseNode getInstance(INode parent) { + return new PFCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java index a7bde225e3d34d6614fc3ad76f99ad107275dea9..9862341fed29de4004269cb13c9a7844a2e7bb11 100644 --- a/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java @@ -25,6 +25,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -67,8 +68,8 @@ public class PortfolioCourseNodeConfiguration extends AbstractCourseNodeConfigur } @Override - public CourseNode getInstance() { - return new PortfolioCourseNode(); + public CourseNode getInstance(INode parent) { + return new PortfolioCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java index 11858dc05912694c964a65e84121515a824ef640..7e0686beb452a6359c4ade44468957880f2297cd 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -41,8 +42,8 @@ import org.olat.course.nodes.ProjectBrokerCourseNode; public class ProjectBrokerNodeConfiguration extends AbstractCourseNodeConfiguration { @Override - public CourseNode getInstance() { - return new ProjectBrokerCourseNode(); + public CourseNode getInstance(INode parent) { + return new ProjectBrokerCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java index fc7fbf39e11a71cc5d076e9b20a2f4941b388eb6..8361d180fb1834070028adf47df1dba99aedcb80 100644 --- a/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -45,8 +46,8 @@ public class ScormCourseNodeConfiguration extends AbstractCourseNodeConfiguratio } @Override - public CourseNode getInstance() { - return new ScormCourseNode(); + public CourseNode getInstance(INode parent) { + return new ScormCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java index dad54d929a3ebe73ed0e2433bfee5b9cc8011e2d..3e56a7fbc4af5ccfa3cc37847add6524bf04dcf3 100644 --- a/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -42,8 +43,8 @@ public class SPCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new SPCourseNode(); + public CourseNode getInstance(INode parent) { + return new SPCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java index cc429584f9051afbcc7b060484aea56e4363a11b..34faf23bed8620502db2340246b8f36fa91e0272 100644 --- a/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java @@ -30,6 +30,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -45,8 +46,8 @@ public class STCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new STCourseNode(); + public CourseNode getInstance(INode parent) { + return new STCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java index ada0fd7d4ebbae3af0dca16db115c8fa9f544b86..eda6c76a0f16209a4323583e6a76d67598410d82 100644 --- a/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java +++ b/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java @@ -144,6 +144,8 @@ public class STCourseNodeRunController extends BasicController { // use the first children as they appear in the list if (i < STCourseNodeConfiguration.MAX_PEEKVIEW_CHILD_NODES) { if(accessible) { + CourseNode parent = child.getParent() instanceof CourseNode? (CourseNode)child.getParent(): null; + child.updateModuleConfigDefaults(false, parent); childPeekViewController = child.createPeekViewRunController(ureq, wControl, userCourseEnv, childCourseTreeNode); } } else { @@ -154,6 +156,8 @@ public class STCourseNodeRunController extends BasicController { // Only add configured children if (peekviewChildNodes.contains(child.getIdent())) { if(accessible) { + CourseNode parent = child.getParent() instanceof CourseNode? (CourseNode)child.getParent(): null; + child.updateModuleConfigDefaults(false, parent); childPeekViewController = child.createPeekViewRunController(ureq, wControl, userCourseEnv, childCourseTreeNode); } } else { diff --git a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java index 484f344fd29812b4620182b7574d4d07948655c1..70d519965f625adcb2ae2cbe858525db31675b10 100644 --- a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java +++ b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java @@ -23,6 +23,8 @@ import java.util.Date; import org.olat.course.learningpath.FullyAssessedTrigger; import org.olat.course.learningpath.LearningPathConfigs; +import org.olat.course.nodes.STCourseNode; +import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentObligation; @@ -34,6 +36,18 @@ import org.olat.modules.assessment.model.AssessmentObligation; */ public class STLearningPathConfigs implements LearningPathConfigs { + private final ModuleConfiguration moduleConfigs; + + public STLearningPathConfigs(ModuleConfiguration moduleConfigs) { + this.moduleConfigs = moduleConfigs; + } + + @Override + public Boolean hasSequentialChildren() { + String sequenceConfig = moduleConfigs.getStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY); + return STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL.equals(sequenceConfig); + } + @Override public Integer getDuration() { return null; diff --git a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java index 7a2408693811874988f92e0591f8a307f258205c..14bbdd37b4de1ec9649f3d7034a6f1bcd7de05db 100644 --- a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java +++ b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java @@ -39,8 +39,6 @@ import org.springframework.stereotype.Service; @Service public class STLearningPathNodeHandler implements LearningPathNodeHandler { - private static final STLearningPathConfigs LEARNING_PATH_CONFIGS = new STLearningPathConfigs(); - @Override public String acceptCourseNodeType() { return STCourseNode.TYPE; @@ -53,7 +51,7 @@ public class STLearningPathNodeHandler implements LearningPathNodeHandler { @Override public LearningPathConfigs getConfigs(CourseNode courseNode) { - return LEARNING_PATH_CONFIGS; + return new STLearningPathConfigs(courseNode.getModuleConfiguration()); } @Override diff --git a/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java index bd73ab15dc3f3685f729c3c35a34598023ae262a..f49b6f528090e1acdebecd1b888e09980239e84d 100644 --- a/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeGroup; @@ -48,8 +49,8 @@ public class SurveyCourseNodeConfiguration extends AbstractCourseNodeConfigurati } @Override - public CourseNode getInstance() { - return new SurveyCourseNode(); + public CourseNode getInstance(INode parent) { + return new SurveyCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java index 83d1d605381c21722f436980d1c135e1f3a11fdb..7139b7b301a27fdb92fa7397bdc80686226676fb 100644 --- a/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -45,8 +46,8 @@ public class TACourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { - return new TACourseNode(); + public CourseNode getInstance(INode parent) { + return new TACourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java index 4b46e221666d913b940c0de720a82a00ae3973bf..2bb232bba0198893e114a1ff06815d44bbf48212 100644 --- a/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java @@ -29,6 +29,7 @@ import java.util.Locale; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -47,7 +48,7 @@ public class TUCourseNodeConfiguration extends AbstractCourseNodeConfiguration { } @Override - public CourseNode getInstance() { + public CourseNode getInstance(INode parent) { return new TUCourseNode(); } diff --git a/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java index 1fc5dee30424f7986c09d58ab3f322c617f4b0a3..d5e15d9c31eaa4c563742236c00fc10244d26916 100644 --- a/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -44,8 +45,8 @@ public class VideoCourseNodeConfiguration extends AbstractCourseNodeConfigurati } @Override - public CourseNode getInstance() { - return new VideoCourseNode(); + public CourseNode getInstance(INode parent) { + return new VideoCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java index b6242699184ac8f5d5a8e265e2512bd7499738dd..68d65ec6767c1908515b878e0f4578ac6ad3499a 100644 --- a/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -58,8 +59,8 @@ public class ViteroCourseNodeConfiguration extends AbstractCourseNodeConfigurati } @Override - public CourseNode getInstance() { - return new ViteroCourseNode(); + public CourseNode getInstance(INode parent) { + return new ViteroCourseNode(parent); } @Override diff --git a/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java index 8202112d56b75c651f901864fe4f1b8ad829a782..6e544f465976074096bca0a4071979a1326a3dea 100644 --- a/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java +++ b/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java @@ -30,6 +30,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; import org.olat.course.nodes.AbstractCourseNodeConfiguration; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; @@ -50,8 +51,8 @@ public class WikiCourseNodeConfiguration extends AbstractCourseNodeConfiguration } @Override - public CourseNode getInstance() { - return new WikiCourseNode(); + public CourseNode getInstance(INode parent) { + return new WikiCourseNode(parent); } @Override 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 2c611d47b84a99a4991bac841da48558faecdcba..376a2307c823b8fb25f8b861faaef6076ba456b6 100644 --- a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java +++ b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java @@ -210,6 +210,8 @@ public class NavigationHandler implements Disposable { final OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseNode.class, Long.parseLong(internCourseNode.getIdent())); ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(ores); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, wControl); + CourseNode parent = internCourseNode.getParent() instanceof CourseNode? (CourseNode)internCourseNode.getParent(): null; + internCourseNode.updateModuleConfigDefaults(false, parent); nrcr = internCourseNode.createNodeRunConstructionResult(ureq, bwControl, userCourseEnv, internNode, nodecmd); // remember as instance variable for next click subtreemodelListener = nrcr.getSubTreeListener(); @@ -402,6 +404,8 @@ public class NavigationHandler implements Disposable { } } + CourseNode parent = courseNode.getParent() instanceof CourseNode? (CourseNode)courseNode.getParent(): null; + courseNode.updateModuleConfigDefaults(false, parent); ncr = courseNode.createNodeRunConstructionResult(ureq, bwControl, userCourseEnv, newCalledTreeNode, nodecmd); // remember as instance variable for next click diff --git a/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java b/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java index 37410557a14e8d2fdff5143a49c698685537622a..e64b094b32d7fafdd9e31a539b11e5f290e1a251 100644 --- a/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java +++ b/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java @@ -19,6 +19,9 @@ */ package org.olat.login.oauth.spi; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + import org.apache.logging.log4j.Logger; import org.json.JSONException; import org.json.JSONObject; @@ -60,40 +63,48 @@ public class JSONWebToken { } public static JSONWebToken parse(OAuth2AccessToken token) throws JSONException { + return parse(token.getAccessToken()); + } + + public static JSONWebToken parse(String accessToken) throws JSONException { try { - String accessToken= token.getAccessToken(); - int firstIndex = accessToken.indexOf('.'); int secondIndex = accessToken.indexOf('.', firstIndex + 1); - String header = StringHelper.decodeBase64(accessToken.substring(0, firstIndex)); - String payload = StringHelper.decodeBase64(accessToken.substring(firstIndex, secondIndex)); + String payload = decodeBase64(accessToken.substring(firstIndex + 1, secondIndex)); JSONObject jsonPayload = new JSONObject(payload); return new JSONWebToken(header, payload, jsonPayload); } catch (JSONException e) { - log.error("Cannot parse token: {}", token.getAccessToken()); + log.error("Cannot parse token: {}", accessToken); throw e; } catch (Exception e) { - log.error("Cannot parse token: {}", token.getAccessToken()); + log.error("Cannot parse token: {}", accessToken); throw new JSONException(e); } } - public static JSONWebToken parse(String accessToken) throws JSONException { + /** + * The method try 2 different way to decode the content and check + * that we can parse the JSON content. + * + * @param content The content to decode + * @return The decoded string + * @throws Exception + */ + private static final String decodeBase64(String content) throws Exception { try { - int firstIndex = accessToken.indexOf('.'); - int secondIndex = accessToken.indexOf('.', firstIndex + 1); - - String header = StringHelper.decodeBase64(accessToken.substring(0, firstIndex)); - String payload = StringHelper.decodeBase64(accessToken.substring(firstIndex, secondIndex)); - JSONObject jsonPayload = new JSONObject(payload); - return new JSONWebToken(header, payload, jsonPayload); + String decodedContent = StringHelper.decodeBase64(content); + new JSONObject(decodedContent); + return decodedContent; } catch (JSONException e) { - log.error("Cannot parse token: {}", accessToken); - throw e; - } catch (Exception e) { - log.error("Cannot parse token: {}", accessToken); - throw new JSONException(e); + try { + byte[] contentBytes = Base64.getUrlDecoder().decode(content); + String decodedContent = new String(contentBytes, StandardCharsets.UTF_8); + new JSONObject(decodedContent); + return decodedContent; + } catch (Exception e1) { + throw e; + } } } } diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java index 10aa1a5aed1ad0b2dd3a9f5244917346a4dc50dd..67bd43eb7c84b6b5b46347547e07ec81f1782a94 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java @@ -61,6 +61,7 @@ import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.FOCourseNode; import org.olat.course.properties.CoursePropertyManager; import org.olat.course.run.userview.CourseTreeVisitor; +import org.olat.course.tree.CourseEditorTreeNode; import org.olat.modules.ModuleConfiguration; import org.olat.modules.fo.Forum; import org.olat.modules.fo.Message; @@ -464,13 +465,13 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { return Response.serverError().status(Status.NOT_FOUND).build(); } - CourseNode courseNode = getParentNode(course, nodeId); - if(courseNode == null) { + CourseEditorTreeNode parentNode = getParentNode(course, nodeId); + if(parentNode == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); - Property forumKeyProp = cpm.findCourseNodeProperty(courseNode, null, null, FOCourseNode.CONFIG_FORUM_KEY); + Property forumKeyProp = cpm.findCourseNodeProperty(parentNode.getCourseNode(), null, null, FOCourseNode.CONFIG_FORUM_KEY); Forum forum = null; if(forumKeyProp!=null) { // Forum does already exist, load forum with key from properties diff --git a/src/main/java/org/olat/modules/forms/EvaluationFormManager.java b/src/main/java/org/olat/modules/forms/EvaluationFormManager.java index b29bac8fd691e11c94ac4084b52f0f300f9cc72f..7040f63670449bcce9347318935438aa2f8c7330 100644 --- a/src/main/java/org/olat/modules/forms/EvaluationFormManager.java +++ b/src/main/java/org/olat/modules/forms/EvaluationFormManager.java @@ -34,6 +34,8 @@ import org.olat.modules.forms.model.jpa.EvaluationFormResponses; import org.olat.modules.forms.model.xml.AbstractElement; import org.olat.modules.forms.model.xml.Form; import org.olat.modules.forms.model.xml.Rubric; +import org.olat.modules.forms.ui.model.CountRatioResult; +import org.olat.modules.forms.ui.model.CountResult; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRef; @@ -235,5 +237,7 @@ public interface EvaluationFormManager { public RubricStatistic getRubricStatistic(Rubric rubric, SlidersStatistic slidersStatistic); public RubricRating getRubricRating(Rubric rubric, Double value); + + public List<CountRatioResult> calculateRatio(List<CountResult> countResults); } diff --git a/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java b/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java index 9c7dbfeef06770e82ec51927d57b980a77b7e3a9..3b37dc2ab2ba1f124d983fd33f469786d3867f66 100644 --- a/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java +++ b/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java @@ -76,6 +76,8 @@ import org.olat.modules.forms.model.xml.Form; import org.olat.modules.forms.model.xml.FormXStream; import org.olat.modules.forms.model.xml.Rubric; import org.olat.modules.forms.model.xml.Slider; +import org.olat.modules.forms.ui.model.CountRatioResult; +import org.olat.modules.forms.ui.model.CountResult; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRef; import org.springframework.beans.factory.annotation.Autowired; @@ -580,4 +582,19 @@ public class EvaluationFormManagerImpl implements EvaluationFormManager { public RubricRating getRubricRating(Rubric rubric, Double value) { return RubricRatingEvaluator.rate(rubric, value); } + + @Override + public List<CountRatioResult> calculateRatio(List<CountResult> countResults) { + if (countResults == null || countResults.isEmpty()) return new ArrayList<>(0); + + long sum = countResults.stream().mapToLong(CountResult::getCount).sum(); + if (sum == 0) return new ArrayList<>(0); + + List<CountRatioResult> ratios = new ArrayList<>(countResults.size()); + for (CountResult countResult : countResults) { + double ratio = (double)countResult.getCount() / sum; + ratios.add(new CountRatioResult(countResult, ratio)); + } + return ratios; + } } diff --git a/src/main/java/org/olat/modules/forms/ui/CountDataModel.java b/src/main/java/org/olat/modules/forms/ui/CountDataModel.java index a81a9c8de0ab0a46232fc33a23f3955b01313f8a..1069ac244079dc6df1b3aaa59cf772647a846dca 100644 --- a/src/main/java/org/olat/modules/forms/ui/CountDataModel.java +++ b/src/main/java/org/olat/modules/forms/ui/CountDataModel.java @@ -27,7 +27,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSorta import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; -import org.olat.modules.forms.ui.model.CountResult; +import org.olat.modules.forms.ui.model.CountRatioResult; /** * @@ -35,8 +35,8 @@ import org.olat.modules.forms.ui.model.CountResult; * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com * */ -public class CountDataModel extends DefaultFlexiTableDataModel<CountResult> -implements SortableFlexiTableDataModel<CountResult> { +public class CountDataModel extends DefaultFlexiTableDataModel<CountRatioResult> +implements SortableFlexiTableDataModel<CountRatioResult> { public CountDataModel(FlexiTableColumnModel columnsModel) { super(columnsModel); @@ -44,33 +44,35 @@ implements SortableFlexiTableDataModel<CountResult> { @Override public void sort(SortKey orderBy) { - List<CountResult> rows = new SortableFlexiTableModelDelegate<>(orderBy, this, null).sort(); + List<CountRatioResult> rows = new SortableFlexiTableModelDelegate<>(orderBy, this, null).sort(); super.setObjects(rows); } @Override public Object getValueAt(int row, int col) { - CountResult countResult = getObject(row); + CountRatioResult countResult = getObject(row); return getValueAt(countResult, col); } @Override - public Object getValueAt(CountResult row, int col) { + public Object getValueAt(CountRatioResult row, int col) { switch(CountReportCols.values()[col]) { case name: return row.getName(); case count: return row.getCount(); + case percent: return row.getRatio(); default: return null; } } @Override - public DefaultFlexiTableDataModel<CountResult> createCopyWithEmptyList() { + public DefaultFlexiTableDataModel<CountRatioResult> createCopyWithEmptyList() { return new CountDataModel(getTableColumnModel()); } public enum CountReportCols implements FlexiSortableColumnDef { name("report.count.name.title"), - count("report.count.count.title"); + count("report.count.count.title"), + percent("report.count.percent.title"); private final String i18nKey; diff --git a/src/main/java/org/olat/modules/forms/ui/CountTableController.java b/src/main/java/org/olat/modules/forms/ui/CountTableController.java index 7b2a4db62f6fd42664c9c00a02bc0493d88a9de3..41f1689a49e43dfdf7188c29f73d9497ccfecb23 100644 --- a/src/main/java/org/olat/modules/forms/ui/CountTableController.java +++ b/src/main/java/org/olat/modules/forms/ui/CountTableController.java @@ -19,18 +19,25 @@ */ package org.olat.modules.forms.ui; +import java.util.List; + import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.CodeHelper; +import org.olat.modules.forms.EvaluationFormManager; import org.olat.modules.forms.ui.CountDataModel.CountReportCols; +import org.olat.modules.forms.ui.component.PercentCellRenderer; import org.olat.modules.forms.ui.model.CountDataSource; +import org.olat.modules.forms.ui.model.CountRatioResult; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -41,6 +48,9 @@ import org.olat.modules.forms.ui.model.CountDataSource; public class CountTableController extends FormBasicController { private final CountDataSource dataSource; + + @Autowired + private EvaluationFormManager evaluationFormManager; public CountTableController(UserRequest ureq, WindowControl wControl, CountDataSource dataSource) { super(ureq, wControl, LAYOUT_HORIZONTAL); @@ -52,10 +62,19 @@ public class CountTableController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.name)); - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.count)); + DefaultFlexiColumnModel countModel = new DefaultFlexiColumnModel(CountReportCols.count); + countModel.setAlignment(FlexiColumnModel.ALIGNMENT_RIGHT); + countModel.setHeaderAlignment(FlexiColumnModel.ALIGNMENT_RIGHT); + columnsModel.addFlexiColumnModel(countModel); + DefaultFlexiColumnModel percentModel = new DefaultFlexiColumnModel(CountReportCols.percent, new PercentCellRenderer()); + percentModel.setAlignment(FlexiColumnModel.ALIGNMENT_RIGHT); + percentModel.setHeaderAlignment(FlexiColumnModel.ALIGNMENT_RIGHT); + columnsModel.addFlexiColumnModel(percentModel); CountDataModel dataModel = new CountDataModel(columnsModel); - dataModel.setObjects(dataSource.getResponses()); + + List<CountRatioResult> calculateRatio = evaluationFormManager.calculateRatio(dataSource.getResponses()); + dataModel.setObjects(calculateRatio); FlexiTableElement tableEl = uifactory.addTableElement(getWindowControl(), "counts" + CodeHelper.getRAMUniqueID(), dataModel, getTranslator(), formLayout); tableEl.setNumOfRowsEnabled(false); diff --git a/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java b/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java index 85c463f89ad35534060e5b48c1a43b0c616ff66a..eea6ea73cb13bb88acbef8ab42818c15db7969bf 100644 --- a/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java +++ b/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java @@ -76,18 +76,25 @@ public class EvaluationFormOverviewController extends BasicController { EvaluationFormStatistic statistic = evaluationFormManager.getSessionsStatistic(filter); long numOfDoneSessions = statistic.getNumOfDoneSessions(); - String numberSessions; if (figures != null && figures.getNumberOfParticipations() != null) { + double percent = figures.getNumberOfParticipations() > 0 + ? (double)numOfDoneSessions / figures.getNumberOfParticipations() * 100.0d + : 0.0; + long percentRounded = Math.round(percent); + String[] args = new String[] { String.valueOf(numOfDoneSessions), - String.valueOf(figures.getNumberOfParticipations()) + String.valueOf(figures.getNumberOfParticipations()), + String.valueOf(percentRounded) }; - numberSessions = translate("report.overview.figures.number.done.session.of", args); + String numberSessions = translate("report.overview.figures.number.done.session.of", args); + allFigures.add(new Figure(translate("report.overview.figures.number.done.session.percent"), + numberSessions)); } else { - numberSessions = String.valueOf(numOfDoneSessions); + String numberSessions = String.valueOf(numOfDoneSessions); + allFigures.add(new Figure(translate("report.overview.figures.number.done.session"), + numberSessions)); } - allFigures.add(new Figure(translate("report.overview.figures.number.done.session"), - numberSessions)); String submissionPeriod = EvaluationFormFormatter.period(statistic.getFirstSubmission(), statistic.getLastSubmission(), getLocale()); diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties index a2e7c705d9738e4f0d5a95d2950c6c397f9cae5f..4e6c527a475293fd7213398721937e7b60f61950 100644 --- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties @@ -67,6 +67,7 @@ no.response=Keine Antwort m\u00F6glich report.anonymous.user=Anonym report.count.count.title=Anzahl report.count.name.title=Wert +report.count.percent.title=% report.excel.legend=Legende report.excel.text=Text report.export=Export Excel @@ -75,7 +76,8 @@ report.overview.duration.count=Anzahl report.overview.duration.title=Bearbeitungsdauer report.overview.duration=Bearbeitungsdauer report.overview.figures.average.duration=Durchschnittliche Bearbeitungsdauer -report.overview.figures.number.done.session.of={0} von {1} +report.overview.figures.number.done.session.of={0} von {1} / {2}% +report.overview.figures.number.done.session.percent=$\:report.overview.figures.number.done.session / R\u00FCcklaufquote report.overview.figures.number.done.session=Anzahl Teilnehmer report.overview.figures.submission.period=Abgabezeitraum report.overview.figures.title=Kennzahlen diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties index ad67fe4624ccfe05510937b81d9f306cb3ff6a8a..277410b7e300a30c6cafaeba7ea73b3f90e57a81 100644 --- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties @@ -66,6 +66,7 @@ no.response=No answer report.anonymous.user=Anonymous report.count.count.title=Count report.count.name.title=Value +report.count.percent.title=% report.excel.legend=Legend report.excel.text=Text report.export=Export Excel @@ -74,7 +75,8 @@ report.overview.duration.count=Count report.overview.duration.title=Duration report.overview.duration=Duration report.overview.figures.average.duration=Average duration -report.overview.figures.number.done.session.of={0} of {1} +report.overview.figures.number.done.session.of={0} of {1} / {2}% +report.overview.figures.number.done.session.percent=$\:report.overview.figures.number.done.session / Return rate report.overview.figures.number.done.session=Number of participants report.overview.figures.submission.period=Submission period report.overview.figures.title=Figures diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties index 7e252e809ddbafeddc5ebd12adde6b444a501365..006807445bb8d29ba9035b643df8aa9cbb8be942 100644 --- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties @@ -75,7 +75,7 @@ report.overview.duration.count=Nombre report.overview.duration.title=Dur\u00E9e report.overview.figures.average.duration=Dur\u00E9e moyenne report.overview.figures.number.done.session=Nombre de participants -report.overview.figures.number.done.session.of={0} sur {1} +report.overview.figures.number.done.session.of={0} sur {1} / {2}% report.overview.figures.submission.period=P\u00E9riode de soumission report.overview.figures.title=Indicateurs report.overview.total.title=Total rubriques diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties index 33a686e554426ce5079881ffaae2c79c18c99e41..d14261aa1f995442d9cb52bb37d6ed31179b21a6 100644 --- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties @@ -76,7 +76,7 @@ report.overview.duration.count=Contagem report.overview.duration.title=Dura\u00E7\u00E3o report.overview.figures.average.duration=Dura\u00E7\u00E3o m\u00E9dia report.overview.figures.number.done.session=N\u00FAmero de participantes -report.overview.figures.number.done.session.of={0} de {1} +report.overview.figures.number.done.session.of={0} de {1} / {2}% report.overview.figures.submission.period=Per\u00EDodo de Submiss\u00E3o report.overview.figures.title=N\u00FAmeros-chave report.overview.total.title=Rubricas totais diff --git a/src/main/java/org/olat/modules/forms/ui/component/PercentCellRenderer.java b/src/main/java/org/olat/modules/forms/ui/component/PercentCellRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..e0f11c7dc873454d0823754660e9189651d1323d --- /dev/null +++ b/src/main/java/org/olat/modules/forms/ui/component/PercentCellRenderer.java @@ -0,0 +1,46 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.forms.ui.component; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; +import org.olat.core.gui.translator.Translator; + +/** + * + * Initial date: 05.02.2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public class PercentCellRenderer implements FlexiCellRenderer { + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source, + URLBuilder ubu, Translator translator) { + if(cellValue instanceof Double) { + double percent = ((Double)cellValue).doubleValue() * 100.0d; + long rounded = Math.round(percent); + target.append(rounded).append("%"); + } + } +} diff --git a/src/main/java/org/olat/modules/forms/ui/model/CountRatioResult.java b/src/main/java/org/olat/modules/forms/ui/model/CountRatioResult.java new file mode 100644 index 0000000000000000000000000000000000000000..861ccbd7ebb5f19b8d70f4d63998f102f9724ab3 --- /dev/null +++ b/src/main/java/org/olat/modules/forms/ui/model/CountRatioResult.java @@ -0,0 +1,41 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.forms.ui.model; + +/** + * + * Initial date: 5 Feb 2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public class CountRatioResult extends CountResult { + + private final Double ratio; + + public CountRatioResult(CountResult countResult, Double ratio) { + super(countResult.getName(), countResult.getCount()); + this.ratio = ratio; + } + + public Double getRatio() { + return ratio; + } + +} diff --git a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java index f1a438cb50b4a96dd9d9ad99bb101134736f7c08..6c514a358a84f590e963297a1eb870d36619df56 100644 --- a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java @@ -105,7 +105,7 @@ public abstract class AbstractCourseNodeWebService { if(nodeId != null) { node = updateCourseNode(nodeId, shortTitle, longTitle, objectives, visibilityExpertRules, accessExpertRules, config, editSession); } else { - CourseNode parentNode = getParentNode(course, parentNodeId); + CourseEditorTreeNode parentNode = getParentNode(course, parentNodeId); if(parentNode == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -131,7 +131,7 @@ public abstract class AbstractCourseNodeWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - CourseNode courseNode = getParentNode(course, nodeId); + CourseNode courseNode = getParentNode(course, nodeId).getCourseNode(); if(courseNode == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -159,10 +159,10 @@ public abstract class AbstractCourseNodeWebService { private CourseNodeVO createCourseNode(String type, String shortTitle, String longTitle, String learningObjectives, String visibilityExpertRules, String accessExpertRules, CustomConfigDelegate delegateConfig, - CourseEditSession editSession, CourseNode parentNode, Integer position) { + CourseEditSession editSession, CourseEditorTreeNode parentNode, Integer position) { CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type); - CourseNode insertedNode = newNodeConfig.getInstance(); + CourseNode insertedNode = newNodeConfig.getInstance(parentNode); insertedNode.setShortTitle(shortTitle); insertedNode.setLongTitle(longTitle); insertedNode.setLearningObjectives(learningObjectives); @@ -185,9 +185,9 @@ public abstract class AbstractCourseNodeWebService { } if (position == null || position.intValue() < 0) { - course.getEditorTreeModel().addCourseNode(insertedNode, parentNode); + course.getEditorTreeModel().addCourseNode(insertedNode, parentNode.getCourseNode()); } else { - course.getEditorTreeModel().insertCourseNodeAt(insertedNode, parentNode, position); + course.getEditorTreeModel().insertCourseNodeAt(insertedNode, parentNode.getCourseNode(), position); } CourseEditorTreeNode editorNode = course.getEditorTreeModel().getCourseEditorNodeContaining(insertedNode); @@ -243,12 +243,15 @@ public abstract class AbstractCourseNodeWebService { return cond; } - protected CourseNode getParentNode(ICourse course, String parentNodeId) { + protected CourseEditorTreeNode getParentNode(ICourse course, String parentNodeId) { if (parentNodeId == null) { - return course.getRunStructure().getRootNode(); - } else { - return course.getEditorTreeModel().getCourseNode(parentNodeId); + return (CourseEditorTreeNode)course.getEditorTreeModel().getRootNode(); + } + TreeNode treeNode = course.getEditorTreeModel().getNodeById(parentNodeId); + if (treeNode instanceof CourseEditorTreeNode) { + return (CourseEditorTreeNode) treeNode; } + return null; } private void saveAndCloseCourse(CourseEditSession editSession) { diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java index b786c20163946c2fca37c1d8d62e873df8530241..a7ec4d5651cffe415fe8687976acd780aa505148 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java @@ -21,7 +21,6 @@ package org.olat.restapi.repository.course; import java.io.File; - import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; @@ -69,6 +68,7 @@ import org.olat.course.nodes.sp.SPEditController; import org.olat.course.nodes.st.STCourseNodeEditController; import org.olat.course.nodes.ta.TaskController; import org.olat.course.nodes.tu.TUConfigForm; +import org.olat.course.tree.CourseEditorTreeNode; import org.olat.ims.qti.process.AssessmentInstance; import org.olat.modules.ModuleConfiguration; import org.olat.repository.RepositoryEntry; @@ -156,12 +156,12 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - CourseNode courseNode = getParentNode(course, nodeId); - if(courseNode == null) { + CourseEditorTreeNode parentNode = getParentNode(course, nodeId); + if(parentNode == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } - CourseNodeVO vo = ObjectFactory.get(courseNode); + CourseNodeVO vo = ObjectFactory.get(parentNode.getCourseNode()); return Response.ok(vo).build(); } @@ -1577,13 +1577,13 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { public Response attachTaskFile(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId, @Context HttpServletRequest request) { ICourse course = CoursesWebService.loadCourse(courseId); - CourseNode node = getParentNode(course, nodeId); + CourseEditorTreeNode parentNode = getParentNode(course, nodeId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } - if(node == null) { + if(parentNode == null) { return Response.serverError().status(Status.NOT_FOUND).build(); - } else if(!(node instanceof TACourseNode)) { + } else if(!(parentNode.getCourseNode() instanceof TACourseNode)) { return Response.serverError().status(Status.NOT_ACCEPTABLE).build(); } if (!isAuthorEditor(course, request)) { @@ -1595,7 +1595,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { try { reader = new MultipartReader(request); String filename = reader.getValue("filename", "task"); - String taskFolderPath = TACourseNode.getTaskFolderPathRelToFolderRoot(course, node); + String taskFolderPath = TACourseNode.getTaskFolderPathRelToFolderRoot(course, parentNode.getCourseNode()); VFSContainer taskFolder = VFSManager.olatRootContainer(taskFolderPath, null); VFSLeaf singleFile = (VFSLeaf) taskFolder.resolve("/" + filename); if (singleFile == null) { @@ -1833,7 +1833,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { } TaskConfigVO config = new TaskConfigVO(); - CourseNode courseNode = getParentNode(course, nodeId); + CourseNode courseNode = getParentNode(course, nodeId).getCourseNode(); ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration(); //build configuration with fallback to default values Boolean isAssignmentEnabled = (Boolean)moduleConfig.get(TACourseNode.CONF_TASK_ENABLED); @@ -2029,7 +2029,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { } SurveyConfigVO config = new SurveyConfigVO(); - CourseNode courseNode = getParentNode(course, nodeId); + CourseNode courseNode = getParentNode(course, nodeId).getCourseNode(); ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration(); //build configuration with fallback to default values Boolean allowCancel = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_ENABLECANCEL); @@ -2214,7 +2214,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { TestConfigVO config = new TestConfigVO(); ICourse course = CoursesWebService.loadCourse(courseId); - CourseNode courseNode = getParentNode(course, nodeId); + CourseNode courseNode = getParentNode(course, nodeId).getCourseNode(); //build configuration with fallback to default values ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration(); Boolean allowCancel = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_ENABLECANCEL); @@ -2685,7 +2685,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { @Override public void configure(ICourse course, CourseNode newNode, ModuleConfiguration moduleConfig) { - newNode.updateModuleConfigDefaults(true); + newNode.updateModuleConfigDefaults(true, null); //fxdiff FXOLAT-122: course management if(text != null) { moduleConfig.set(TACourseNode.CONF_TASK_TEXT, text); diff --git a/src/test/java/org/olat/course/learningpath/LearningPathServiceTest.java b/src/test/java/org/olat/course/learningpath/LearningPathServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0b864152ddf983d07d70cf9bcd075977451e3d09 --- /dev/null +++ b/src/test/java/org/olat/course/learningpath/LearningPathServiceTest.java @@ -0,0 +1,111 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.learningpath; + +import org.assertj.core.api.SoftAssertions; +import org.junit.Test; +import org.olat.course.nodes.CourseNode; +import org.olat.course.nodes.CourseNodeFactory; +import org.olat.course.nodes.STCourseNode; +import org.olat.test.OlatTestCase; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 6 Feb 2020<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public class LearningPathServiceTest extends OlatTestCase { + + @Autowired + private LearningPathService sut; + + @Test + public void shouldGetSequenceConfig() { + CourseNode root = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(null); + root.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT); + + CourseNode sp_0_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(root); + root.addChild(sp_0_1); + + CourseNode st1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(root); + st1.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL); + root.addChild(st1); + CourseNode sp_1_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(st1); + st1.addChild(sp_1_1); + CourseNode sp_1_2 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(st1); + st1.addChild(sp_1_2); + CourseNode sp_1_2_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(sp_1_2); + sp_1_2.addChild(sp_1_2_1); + + CourseNode st2 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(root); + st2.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT); + root.addChild(st2); + CourseNode st2_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(st2); + st2_1.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT); + st2.addChild(st2_1); + CourseNode st2_1_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(st2_1); + st2_1_1.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL); + st2_1.addChild(st2_1_1); + CourseNode sp2_1_1_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(st2_1_1); + st2_1_1.addChild(sp2_1_1_1); + + SoftAssertions softly = new SoftAssertions(); + softly.assertThat(sut.getSequenceConfig(root).isInSequence()).as("root in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(root).hasSequentialChildren()).as("root children").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(sp_0_1).isInSequence()).as("sp1 in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(sp_0_1).hasSequentialChildren()).as("sp1 children").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st1).isInSequence()).as("st1 in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st1).hasSequentialChildren()).as("st1 children").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp_1_1).isInSequence()).as("sp_1_1 in").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp_1_1).hasSequentialChildren()).as("sp_1_1 children").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp_1_2).isInSequence()).as("sp_1_2 in").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp_1_2).hasSequentialChildren()).as("sp_1_2 children").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp_1_2_1).isInSequence()).as("sp_1_2_1 in").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp_1_2_1).hasSequentialChildren()).as("sp_1_2_1 children").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(st2).isInSequence()).as("st2 in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st2).hasSequentialChildren()).as("st2 children").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st2_1).isInSequence()).as("st2_1 in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st2_1).hasSequentialChildren()).as("st2_1 children").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st2_1_1).isInSequence()).as("st2_1_1 in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(st2_1_1).hasSequentialChildren()).as("st2_1_1 children").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp2_1_1_1).isInSequence()).as("sp2_1_1_1 in").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(sp2_1_1_1).hasSequentialChildren()).as("sp2_1_1_1 children").isEqualTo(true); + softly.assertAll(); + } + + @Test + public void shouldGetRooSequenceConfig() { + CourseNode rootWithout = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(null); + rootWithout.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT); + CourseNode rootSequential = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(null); + rootSequential.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL); + + SoftAssertions softly = new SoftAssertions(); + softly.assertThat(sut.getSequenceConfig(rootWithout).isInSequence()).as("root without in").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(rootWithout).hasSequentialChildren()).as("root without children").isEqualTo(false); + softly.assertThat(sut.getSequenceConfig(rootSequential).isInSequence()).as("root sequential in").isEqualTo(true); + softly.assertThat(sut.getSequenceConfig(rootSequential).hasSequentialChildren()).as("root sequential children").isEqualTo(true); + softly.assertAll(); + } + + +} diff --git a/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java b/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java index f42f6229462d0e346527f4017048ca5ede5f2065..5cd8d331570316eee5ace6c04c19a48eb18976e5 100644 --- a/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java +++ b/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java @@ -75,7 +75,7 @@ public class LinearAccessEvaluatorTest { private void assertAccessible(AssessmentEntryStatus status, boolean expected) { AssessmentEvaluation ae = createAssessmentEvaluation(status); - LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, ae); + LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, null, ae); UserCourseEnvironment userCourseEnv = mock(UserCourseEnvironment.class); when(userCourseEnv.isParticipant()).thenReturn(Boolean.TRUE); @@ -85,9 +85,9 @@ public class LinearAccessEvaluatorTest { } @Test - public void shouldAlwysBeAccessibleAsCoach() { + public void shouldAlwaysBeAccessibleAsCoach() { AssessmentEvaluation ae = createAssessmentEvaluation(AssessmentEntryStatus.notReady); - LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, ae); + LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, null, ae); UserCourseEnvironment userCourseEnv = mock(UserCourseEnvironment.class); when(userCourseEnv.isCoach()).thenReturn(Boolean.TRUE); @@ -97,9 +97,9 @@ public class LinearAccessEvaluatorTest { } @Test - public void shouldAlwysBeAccessibleAsAdmin() { + public void shouldAlwaysBeAccessibleAsAdmin() { AssessmentEvaluation ae = createAssessmentEvaluation(AssessmentEntryStatus.notReady); - LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, ae); + LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, null, ae); UserCourseEnvironment userCourseEnv = mock(UserCourseEnvironment.class); when(userCourseEnv.isAdmin()).thenReturn(Boolean.TRUE); diff --git a/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java b/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java index 5e00f9ad5bd2dce38bbc80728824b6bab7d5ee04..02dc7a6ea87d6cd0d302c27e83de97dfa122929d 100644 --- a/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java +++ b/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java @@ -27,6 +27,11 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; @@ -39,6 +44,8 @@ import org.olat.modules.forms.EvaluationFormSessionStatus; import org.olat.modules.forms.EvaluationFormSurvey; import org.olat.modules.forms.RubricRating; import org.olat.modules.forms.model.xml.Rubric; +import org.olat.modules.forms.ui.model.CountRatioResult; +import org.olat.modules.forms.ui.model.CountResult; import org.olat.repository.RepositoryEntry; /** @@ -284,6 +291,25 @@ public class EvaluationFormMangerImplTest { assertThat(rating).isEqualTo(expectedRating); } + + @Test + public void shouldCalculateRatioList() { + List<CountResult> countResults = new ArrayList<>(); + countResults.add(new CountResult("1", 5)); + countResults.add(new CountResult("2", 5)); + countResults.add(new CountResult("3", 10)); + countResults.add(new CountResult("4", 0)); + + List<CountRatioResult> ratios = sut.calculateRatio(countResults); + + Map<String, Double> percentMap = ratios.stream() + .collect(Collectors.toMap(CountRatioResult::getName, CountRatioResult::getRatio)); + assertThat(percentMap.get("1")).isEqualTo(0.25); + assertThat(percentMap.get("2")).isEqualTo(0.25); + assertThat(percentMap.get("3")).isEqualTo(0.5); + assertThat(percentMap.get("4")).isEqualTo(0); + } + } diff --git a/src/test/java/org/olat/restapi/CoursesFoldersTest.java b/src/test/java/org/olat/restapi/CoursesFoldersTest.java index f4de64c2727ec3904a20ac06a7ef12fd73e29ae0..b1704c6a6a7f7749e1c21834f44b55a0176c5b83 100644 --- a/src/test/java/org/olat/restapi/CoursesFoldersTest.java +++ b/src/test/java/org/olat/restapi/CoursesFoldersTest.java @@ -297,12 +297,13 @@ public class CoursesFoldersTest extends OlatRestTestCase { dbInstance.intermediateCommit(); //create a folder + CourseNode rootNode = course.getRunStructure().getRootNode(); CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("bc"); - CourseNode bcNode = newNodeConfig.getInstance(); + CourseNode bcNode = newNodeConfig.getInstance(rootNode); bcNode.setShortTitle("Folder"); bcNode.setLearningObjectives("Folder objectives"); bcNode.setNoAccessExplanation("You don't have access"); - course.getEditorTreeModel().addCourseNode(bcNode, course.getRunStructure().getRootNode()); + course.getEditorTreeModel().addCourseNode(bcNode, rootNode); CourseFactory.publishCourse(course, RepositoryEntryStatusEnum.published, true, false, admin, Locale.ENGLISH); return new CourseWithBC(course, bcNode); diff --git a/src/test/java/org/olat/restapi/CoursesForumsTest.java b/src/test/java/org/olat/restapi/CoursesForumsTest.java index dcbc8f038d493f1e8cf39faa417881111797c36b..2bedf9091e294348584796a6e078d49a4b0c6010 100644 --- a/src/test/java/org/olat/restapi/CoursesForumsTest.java +++ b/src/test/java/org/olat/restapi/CoursesForumsTest.java @@ -85,12 +85,13 @@ public class CoursesForumsTest extends OlatRestTestCase { dbInstance.intermediateCommit(); //create a folder + CourseNode rootNode = course1.getRunStructure().getRootNode(); CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("fo"); - forumNode = newNodeConfig.getInstance(); + forumNode = newNodeConfig.getInstance(rootNode); forumNode.setShortTitle("Forum"); forumNode.setLearningObjectives("forum objectives"); forumNode.setNoAccessExplanation("You don't have access"); - course1.getEditorTreeModel().addCourseNode(forumNode, course1.getRunStructure().getRootNode()); + course1.getEditorTreeModel().addCourseNode(forumNode, rootNode); CourseFactory.publishCourse(course1, RepositoryEntryStatusEnum.published, true, false, admin, Locale.ENGLISH); diff --git a/src/test/java/org/olat/restapi/NotificationsTest.java b/src/test/java/org/olat/restapi/NotificationsTest.java index 5de6e18248955b2007a9da0f5e659557583b1b1a..c8bbfb8c0135ee159c92707972c07708bfa1c949 100644 --- a/src/test/java/org/olat/restapi/NotificationsTest.java +++ b/src/test/java/org/olat/restapi/NotificationsTest.java @@ -50,6 +50,7 @@ import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.logging.log4j.Logger; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -65,7 +66,6 @@ import org.olat.core.commons.services.notifications.restapi.vo.PublisherVO; import org.olat.core.commons.services.notifications.restapi.vo.SubscriptionInfoVO; import org.olat.core.commons.services.notifications.restapi.vo.SubscriptionListItemVO; import org.olat.core.id.Identity; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSContainer; @@ -73,6 +73,7 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.nodes.BCCourseNode; +import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeConfiguration; import org.olat.course.nodes.CourseNodeFactory; import org.olat.course.nodes.FOCourseNode; @@ -370,13 +371,14 @@ public class NotificationsTest extends OlatRestTestCase { ICourse course = CourseFactory.loadCourse(courseEntry); dbInstance.intermediateCommit(); //create the forum + CourseNode rootNode = course.getRunStructure().getRootNode(); CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("fo"); - FOCourseNode forumNode = (FOCourseNode)newNodeConfig.getInstance(); + FOCourseNode forumNode = (FOCourseNode)newNodeConfig.getInstance(rootNode); forumNode.setShortTitle("Forum"); forumNode.setLearningObjectives("forum objectives"); forumNode.setNoAccessExplanation("You don't have access"); Forum courseForum = forumNode.loadOrCreateForum(course.getCourseEnvironment()); - course.getEditorTreeModel().addCourseNode(forumNode, course.getRunStructure().getRootNode()); + course.getEditorTreeModel().addCourseNode(forumNode, rootNode); CourseFactory.publishCourse(course, RepositoryEntryStatusEnum.published, true, false, id, Locale.ENGLISH); dbInstance.intermediateCommit(); @@ -420,14 +422,15 @@ public class NotificationsTest extends OlatRestTestCase { ICourse course = CourseFactory.loadCourse(courseEntry); dbInstance.intermediateCommit(); //create the folder + CourseNode rootNode = course.getRunStructure().getRootNode(); CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("bc"); - BCCourseNode folderNode = (BCCourseNode)newNodeConfig.getInstance(); + BCCourseNode folderNode = (BCCourseNode)newNodeConfig.getInstance(rootNode); folderNode.setShortTitle("Folder"); folderNode.setLearningObjectives("folder objectives"); folderNode.setNoAccessExplanation("You don't have access"); String relPath = BCCourseNode.getFoldernodePathRelToFolderBase(course.getCourseEnvironment(), folderNode); VFSContainer folder = BCCourseNode.getNodeFolderContainer(folderNode, course.getCourseEnvironment()); - course.getEditorTreeModel().addCourseNode(folderNode, course.getRunStructure().getRootNode()); + course.getEditorTreeModel().addCourseNode(folderNode, rootNode); CourseFactory.publishCourse(course, RepositoryEntryStatusEnum.published, true, false, id, Locale.ENGLISH); dbInstance.intermediateCommit(); diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index 919e61240ae3d877abd2339b0f0e909ad7f478ee..c0adbce870a9abe8b9e773e53679a3e1758d5cc8 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -173,6 +173,7 @@ import org.junit.runners.Suite; org.olat.course.condition.ConditionTest.class, org.olat.course.condition.KeyAndNameConverterTest.class, org.olat.course.highscore.HighScoreManagerTest.class, + org.olat.course.learningpath.LearningPathServiceTest.class, org.olat.course.nodes.dialog.manager.DialogElementsManagerTest.class, org.olat.course.nodes.en.EnrollmentManagerSerialTest.class, org.olat.course.nodes.en.EnrollmentManagerConcurrentTest.class,