Skip to content
Snippets Groups Projects
AbstractAccessableCourseNode.java 6.42 KiB
Newer Older
Alan Moran's avatar
Alan Moran committed
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
srosse's avatar
srosse committed
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
Alan Moran's avatar
Alan Moran committed

package org.olat.course.nodes;

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;
Alan Moran's avatar
Alan Moran committed
import org.olat.course.condition.Condition;
import org.olat.course.condition.additionalconditions.AdditionalCondition;
import org.olat.course.condition.additionalconditions.AdditionalConditionManager;
Alan Moran's avatar
Alan Moran committed
import org.olat.course.condition.interpreter.ConditionExpression;
import org.olat.course.condition.interpreter.ConditionInterpreter;
import org.olat.course.editor.ConditionAccessEditConfig;
import org.olat.course.export.CourseEnvironmentMapper;
Alan Moran's avatar
Alan Moran committed
import org.olat.course.run.userview.NodeEvaluation;

/**
 * Initial Date: May 28, 2004
 * 
 * @author gnaegi<br>
 *         Comment: Use this abstract course node if you implement a node that
 *         has only one accessability condition: access the node. See the
 *         CPCourse node for an example implementation.
 */
public abstract class AbstractAccessableCourseNode extends GenericCourseNode {

	private static final long serialVersionUID = 8769187818935593237L;

Alan Moran's avatar
Alan Moran committed
	private Condition preConditionAccess;

	public static final String BLOCKED_BY_ORIGINAL_ACCESS_RULES = "blockedByOriginalAccessRules";

Alan Moran's avatar
Alan Moran committed
	/**
	 * Constructor, only used by implementing course nodes
	 * 
	 * @param type The course node type
	 * @param parent to init the module configuration
Alan Moran's avatar
Alan Moran committed
	 */
	protected AbstractAccessableCourseNode(String type, INode parent) {
		super(type, parent);
Alan Moran's avatar
Alan Moran committed
	}
	
	@Override
	public void cleanupOnDelete(ICourse course) {
		super.cleanupOnDelete(course);
		course.getCourseEnvironment()
				.getAssessmentManager().deleteIndividualAssessmentDocuments(this);
	}
Alan Moran's avatar
Alan Moran committed

	/**
	 * Returns the generic access precondition
	 * 
	 * @return Condition
	 */
Alan Moran's avatar
Alan Moran committed
	public Condition getPreConditionAccess() {
		if (preConditionAccess == null) {
			preConditionAccess = new Condition();
		}
		preConditionAccess.setConditionId("accessability");
		return preConditionAccess;
	}

	/**
	 * Sets the generic access precondition.
	 * 
	 * @param precondition_accessor The precondition_accessor to set
	 */
	public void setPreConditionAccess(Condition precondition_accessor) {
		if (precondition_accessor == null) {
			precondition_accessor = getPreConditionAccess();
		}
		precondition_accessor.setConditionId("accessability");
		this.preConditionAccess = precondition_accessor;
	}
	protected void postImportCopyConditions(CourseEnvironmentMapper envMapper) {
		super.postImportCopyConditions(envMapper);
		postImportCondition(preConditionAccess, envMapper);
	}
	
	@Override
	public void postExport(CourseEnvironmentMapper envMapper, boolean backwardsCompatible) {
		super.postExport(envMapper, backwardsCompatible);
		postExportCondition(preConditionAccess, envMapper, backwardsCompatible);
	}
	public void calcAccessAndVisibility(ConditionInterpreter ci, NodeEvaluation nodeEval) {
		// </OLATCE-91>
Alan Moran's avatar
Alan Moran committed
		// for this node: only one role: accessing the node
		boolean accessible = getPreConditionAccess().getConditionExpression() == null || ci.evaluateCondition(getPreConditionAccess());
		// <OLATCE-91>
		if(accessible){
			Long courseId = ci.getUserCourseEnvironment().getCourseEnvironment().getCourseResourceableId();
			IdentityEnvironment identityEnv = ci.getUserCourseEnvironment().getIdentityEnvironment();
			nodeEval.putAccessStatus(BLOCKED_BY_ORIGINAL_ACCESS_RULES, false);
			AdditionalConditionManager addMan = new AdditionalConditionManager(this, courseId, identityEnv);
			accessible = addMan.evaluateConditions();
		}
		// </OLATCE-91>
Alan Moran's avatar
Alan Moran committed
		nodeEval.putAccessStatus("access", accessible);
		boolean visible = getPreConditionVisibility().getConditionExpression() == null
				|| ci.evaluateCondition(getPreConditionVisibility());
Alan Moran's avatar
Alan Moran committed
		nodeEval.setVisible(visible);
	}

	public void copyConfigurationTo(CourseNode courseNode, ICourse course) {
		super.copyConfigurationTo(courseNode, course);
		if(courseNode instanceof AbstractAccessableCourseNode) {
			AbstractAccessableCourseNode accessableNode = (AbstractAccessableCourseNode)courseNode;
			if(preConditionAccess != null) {
				accessableNode.setPreConditionAccess(preConditionAccess.clone());
			}
		}
	}

Alan Moran's avatar
Alan Moran committed
	public List<ConditionExpression> getConditionExpressions() {
		ArrayList<ConditionExpression> retVal;
		List<ConditionExpression> parentsConditions = super.getConditionExpressions();
		if (parentsConditions.size() > 0) {
			retVal = new ArrayList<>(parentsConditions);
Alan Moran's avatar
Alan Moran committed
		} else {
Alan Moran's avatar
Alan Moran committed
		}
		//
		String coS = getPreConditionAccess().getConditionExpression();
		if (coS != null && !coS.equals("")) {
			// an active condition is defined
			ConditionExpression ce = new ConditionExpression(getPreConditionAccess().getConditionId());
			ce.setExpressionString(getPreConditionAccess().getConditionExpression());
			retVal.add(ce);
		}
		//
		return retVal;
	}

	public List<AdditionalCondition> getAdditionalConditions(){
		if(additionalConditions==null)
			additionalConditions = new ArrayList<>();
		return additionalConditions;
	}
	
	/**
	 * Defines whether the course node has still a custom access condition
	 * controller or if the standard controller is used.
	 * 
	 * As of today is the goal to eliminate all custom condition controllers. If
	 * this goal is achieved, this method should be deleted and the code from
	 * {@link org.olat.course.editor.NodeEditController}.
	 * 
	 * @return
	 */
	public ConditionAccessEditConfig getAccessEditConfig() {
		return ConditionAccessEditConfig.custom();
	}
	
Alan Moran's avatar
Alan Moran committed
}