Skip to content
Snippets Groups Projects
Commit 01fbdc6f authored by uhensler's avatar uhensler
Browse files

OO-4207: No condition syntax check in learning path courses

parent ae974b42
Branches
Tags
No related merge requests found
Showing with 88 additions and 98 deletions
......@@ -71,6 +71,11 @@ public class ConditionNodeAccessProvider implements NodeAccessProvider {
return true;
}
@Override
public boolean isConditionExpressionSupported() {
return true;
}
@Override
public boolean isScoreCalculatorSupported() {
return true;
......
......@@ -40,6 +40,7 @@ import org._3pq.jgrapht.alg.CycleDetector;
import org._3pq.jgrapht.edge.EdgeFactories;
import org._3pq.jgrapht.edge.EdgeFactories.DirectedEdgeFactory;
import org._3pq.jgrapht.graph.DefaultDirectedGraph;
import org.olat.core.CoreSpringFactory;
import org.olat.core.util.Util;
import org.olat.core.util.nodes.INode;
import org.olat.core.util.tree.TreeVisitor;
......@@ -51,6 +52,8 @@ import org.olat.course.condition.interpreter.ConditionErrorMessage;
import org.olat.course.condition.interpreter.ConditionExpression;
import org.olat.course.condition.interpreter.ConditionInterpreter;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodeaccess.NodeAccessService;
import org.olat.course.nodeaccess.NodeAccessType;
import org.olat.course.nodes.BCCourseNode;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.ENCourseNode;
......@@ -101,22 +104,23 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
*/
private ConditionInterpreter ci = null;
public CourseEditorEnvImpl(CourseEditorTreeModel cetm, CourseGroupManager cgm, Locale editorLocale) {
private final boolean conditionExporessionSupported;
public CourseEditorEnvImpl(CourseEditorTreeModel cetm, CourseGroupManager cgm, Locale editorLocale,
NodeAccessType nodeAccessType) {
this.cetm = cetm;
this.cgm = cgm;
this.editorLocale = editorLocale;
this.conditionExporessionSupported = CoreSpringFactory.getImpl(NodeAccessService.class)
.isConditionExpressionSupported(nodeAccessType);
}
/**
* @param ci
*/
@Override
public void setConditionInterpreter(ConditionInterpreter ci) {
this.ci = ci;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#isEnrollmentNode(java.lang.String)
*/
@Override
public boolean isEnrollmentNode(String nodeId) {
CourseEditorTreeNode cen = cetm.getCourseEditorNodeById(nodeId);
if (cen == null) return false;
......@@ -126,9 +130,7 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
return (cen.getCourseNode() instanceof ENCourseNode);
}
/**
* @see org.olat.course.editor.CourseEditorEnv#isAssessable(java.lang.String)
*/
@Override
public boolean isAssessable(String nodeId) {
CourseEditorTreeNode cen = cetm.getCourseEditorNodeById(nodeId);
if (cen == null) return false;
......@@ -138,19 +140,13 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
return AssessmentHelper.checkIfNodeIsAssessable(cen.getCourseNode());
}
/**
* @see org.olat.course.editor.CourseEditorEnv#existsNode(java.lang.String)
*/
@Override
public boolean existsNode(String nodeId) {
CourseEditorTreeNode cen = cetm.getCourseEditorNodeById(nodeId);
boolean retVal = cen != null && !cen.isDeleted();
return retVal;
}
// <OLATCE-91>
/**
* @see org.olat.course.editor.CourseEditorEnv#getNode(java.lang.String)
*/
@Override
public CourseNode getNode(String nodeId) {
CourseNode cen = cetm.getCourseNode(nodeId);
......@@ -158,16 +154,12 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
}
// </OLATCE-91>
/**
* @see org.olat.course.editor.CourseEditorEnv#existsGroup(java.lang.String)
*/
@Override
public boolean existsGroup(String groupNameOrKey) {
return cgm.existGroup(groupNameOrKey);
}
/**
* @see org.olat.course.editor.CourseEditorEnv#existsArea(java.lang.String)
*/
@Override
public boolean existsArea(String areaNameOrKey) {
return cgm.existArea(areaNameOrKey);
}
......@@ -190,31 +182,25 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
return invalidNames;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#getCurrentCourseNodeId()
*/
@Override
public String getCurrentCourseNodeId() {
return currentCourseNodeId;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#setCurrentCourseNodeId(java.lang.String)
*/
@Override
public void setCurrentCourseNodeId(String courseNodeId) {
this.currentCourseNodeId = courseNodeId;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#getEditorEnvLocale()
*/
@Override
public Locale getEditorEnvLocale() {
return editorLocale;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#validateConditionExpression(org.olat.course.condition.interpreter.ConditionExpression)
*/
@Override
public ConditionErrorMessage[] validateConditionExpression(ConditionExpression condExpr) {
if (!conditionExporessionSupported) return null;
// first set the active condition expression, which will be accessed from
// the conditions functions inserting soft references
currentConditionExpression = condExpr;
......@@ -241,27 +227,17 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
return cems;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#addSoftReference(java.lang.String,
* java.lang.String)
*/
@Override
public void addSoftReference(String category, String softReference, boolean cycleDetector) {
currentConditionExpression.addSoftReference(category, softReference, cycleDetector);
}
/**
* @see org.olat.course.editor.CourseEditorEnv#pushError(java.lang.Exception)
*/
@Override
public void pushError(Exception e) {
currentConditionExpression.pushError(e);
}
/**
* @see org.olat.course.editor.CourseEditorEnv#validateCourse()
*/
@Override
public void validateCourse() {
/*
......@@ -269,22 +245,22 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
* configuration errors.
*/
String currentNodeWas = currentCourseNodeId;
if (conditionExporessionSupported) {
// reset all
softRefs = new HashMap<>();
Visitor v = new CollectConditionExpressionsVisitor();
(new TreeVisitor(v, cetm.getRootNode(), true)).visitAll();
Visitor conditionVisitor = new CollectConditionExpressionsVisitor();
(new TreeVisitor(conditionVisitor, cetm.getRootNode(), true)).visitAll();
}
// refresh,create status descriptions of the course
statusDescs = new HashMap<>();
v = new CollectStatusDescriptionVisitor(this);
(new TreeVisitor(v, cetm.getRootNode(), true)).visitAll();
Visitor statusVisitor = new CollectStatusDescriptionVisitor(this);
(new TreeVisitor(statusVisitor, cetm.getRootNode(), true)).visitAll();
//
currentCourseNodeId = currentNodeWas;
}
/**
* @see org.olat.course.editor.CourseEditorEnv#getCourseStatus()
*/
@Override
public StatusDescription[] getCourseStatus() {
String[] a = statusDescs.keySet().toArray(new String[statusDescs.keySet().size()]);
Arrays.sort(a);
......@@ -363,9 +339,7 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
this.cev = cev;
}
/**
* @see org.olat.core.util.tree.Visitor#visit(org.olat.core.util.nodes.INode)
*/
@Override
public void visit(INode node) {
/**
* collect only status descriptions of not deleted nodes
......@@ -393,9 +367,8 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
}
class CollectConditionExpressionsVisitor implements Visitor {
/**
* @see org.olat.core.util.tree.Visitor#visit(org.olat.core.util.nodes.INode)
*/
@Override
public void visit(INode node) {
/**
* collect condition expressions only for not deleted nodes
......@@ -446,10 +419,6 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
}
/**
*
* @see org.olat.course.editor.CourseEditorEnv#listCycles()
*/
@Override
public Set<String> listCycles() {
/*
......@@ -513,17 +482,14 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
return cycleIds;
}
/**
*
* @return CourseGroupManager for this course environment
*/
@Override
public CourseGroupManager getCourseGroupManager() {
return cgm;
}
@Override
public String getRootNodeId() {
return cetm.getRootNode().getIdent();
}
}
......@@ -262,7 +262,7 @@ public class EditorMainController extends MainLayoutBasicController implements G
*/
cetm = course.getEditorTreeModel();
CourseEditorEnv cev = new CourseEditorEnvImpl(cetm, cgm, getLocale());
CourseEditorEnv cev = new CourseEditorEnvImpl(cetm, cgm, getLocale(), NodeAccessType.of(course));
euce = new EditorUserCourseEnvironmentImpl(cev, getWindowControl());
euce.getCourseEditorEnv().setCurrentCourseNodeId(null);
......
......@@ -62,6 +62,7 @@ import org.olat.course.ICourse;
import org.olat.course.Structure;
import org.olat.course.editor.PublishStepCatalog.CategoryLabel;
import org.olat.course.nodeaccess.NodeAccessService;
import org.olat.course.nodeaccess.NodeAccessType;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.CourseNodeConfiguration;
import org.olat.course.nodes.CourseNodeFactory;
......@@ -270,7 +271,8 @@ public class PublishProcess {
* virtual course editor for using the validation facilities of the editor
* environment.
*/
CourseEditorEnv tmpCEV = new CourseEditorEnvImpl(cloneCETM, course.getCourseEnvironment().getCourseGroupManager(), locale);
CourseEditorEnv tmpCEV = new CourseEditorEnvImpl(cloneCETM,
course.getCourseEnvironment().getCourseGroupManager(), locale, NodeAccessType.of(course));
// the resulting object is not needed, but constructor makes
// initializations within tmpCEV!! thus important step.
new EditorUserCourseEnvironmentImpl(tmpCEV, null);
......
......@@ -86,6 +86,11 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider {
return false;
}
@Override
public boolean isConditionExpressionSupported() {
return false;
}
@Override
public boolean isScoreCalculatorSupported() {
return false;
......
......@@ -43,6 +43,8 @@ public interface NodeAccessProvider extends NodeAccessProviderIdentifier {
public boolean isGuestSupported();
public boolean isConditionExpressionSupported();
public boolean isScoreCalculatorSupported();
public TabbableController createEditController(UserRequest ureq, WindowControl wControl, CourseNode courseNode,
......
......@@ -56,6 +56,8 @@ public interface NodeAccessService {
*/
public boolean isGuestSupported(NodeAccessType type);
public boolean isConditionExpressionSupported(NodeAccessType type);
public boolean isScoreCalculatorSupported(NodeAccessType type);
/**
......
......@@ -92,6 +92,11 @@ public class NodeAccessServiceImpl implements NodeAccessService, NodeVisitedList
return getNodeAccessProvider(type).isGuestSupported();
}
@Override
public boolean isConditionExpressionSupported(NodeAccessType type) {
return getNodeAccessProvider(type).isConditionExpressionSupported();
}
@Override
public boolean isScoreCalculatorSupported(NodeAccessType type) {
return getNodeAccessProvider(type).isScoreCalculatorSupported();
......
......@@ -533,6 +533,8 @@ public class STCourseNode extends AbstractAccessableCourseNode {
} else {
retVal = new ArrayList<>();
}
if (getModuleConfiguration().getBooleanSafe(STCourseNode.CONFIG_SCORE_CALCULATOR_SUPPORTED, true)) {
// init passedExpression and scoreExpression
getScoreCalculator();
......@@ -562,6 +564,7 @@ public class STCourseNode extends AbstractAccessableCourseNode {
ce.setExpressionString(failedExpression.getConditionExpression());
retVal.add(ce);
}
}
return retVal;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment