From d725b81aa11ad906b53d603d0f00a52fed5893c1 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 4 Jul 2012 17:10:29 +0200
Subject: [PATCH] OO-291:  start work on condition interpreter

---
 .../condition/AreaSelectionController.java    | 162 ++++++++++++++++++
 .../ConditionConfigEasyController.java        |  30 ++--
 ...ler.java => GroupSelectionController.java} | 132 ++++----------
 .../olat/course/editor/CourseEditorEnv.java   |   7 +
 .../course/editor/CourseEditorEnvImpl.java    |  27 ++-
 .../groupsandrights/CourseGroupManager.java   |   8 +-
 .../PersistingCourseGroupManager.java         |  16 +-
 .../olat/course/nodes/co/COConfigForm.java    |  34 ++--
 .../en/ENEditGroupAreaFormController.java     |  34 ++--
 .../preview/PreviewCourseGroupManager.java    |   5 +
 .../run/preview/PreviewSettingsForm.java      |  26 +--
 .../org/olat/group/area/BGAreaManager.java    |   4 +-
 .../olat/group/area/BGAreaManagerImpl.java    |   8 +-
 .../group/manager/BusinessGroupArchiver.java  |   2 +-
 .../ui/management/BGManagementController.java |   6 +-
 .../ui/wizard/MemberListWizardController.java |   2 +-
 .../indexer/repository/RepositoryIndexer.java |   5 +-
 .../olat/group/test/BGAreaManagerTest.java    |   4 +-
 .../test/BusinessGroupImportExportTest.java   |   2 +-
 19 files changed, 306 insertions(+), 208 deletions(-)
 create mode 100644 src/main/java/org/olat/course/condition/AreaSelectionController.java
 rename src/main/java/org/olat/course/condition/{GroupOrAreaSelectionController.java => GroupSelectionController.java} (60%)

diff --git a/src/main/java/org/olat/course/condition/AreaSelectionController.java b/src/main/java/org/olat/course/condition/AreaSelectionController.java
new file mode 100644
index 00000000000..3c921d0f14d
--- /dev/null
+++ b/src/main/java/org/olat/course/condition/AreaSelectionController.java
@@ -0,0 +1,162 @@
+/**
+* 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.
+* <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.
+*/
+package org.olat.course.condition;
+
+import java.util.List;
+import java.util.Set;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItem;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
+import org.olat.core.gui.components.form.flexible.elements.Reset;
+import org.olat.core.gui.components.form.flexible.elements.Submit;
+import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.FormEvent;
+import org.olat.core.gui.components.form.flexible.impl.elements.FormLinkImpl;
+import org.olat.core.gui.components.form.flexible.impl.elements.FormReset;
+import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
+import org.olat.course.groupsandrights.CourseGroupManager;
+import org.olat.group.ui.BGControllerFactory;
+import org.olat.group.ui.NewAreaController;
+
+/**
+ * Description:<br>
+ * TODO: patrickb Class Description for MultiSelectColumnController
+ * <P>
+ * Initial Date: 15.06.2007 <br>
+ * 
+ * @author patrickb
+ */
+public class AreaSelectionController extends FormBasicController {
+
+	private MultipleSelectionElement entrySelector;
+	protected String[] entries;
+	private FormLinkImpl createNew;
+	private CourseGroupManager courseGrpMngr;
+	private NewAreaController areaCreateCntrllr;
+	private CloseableModalController cmc;
+
+	public AreaSelectionController(UserRequest ureq, WindowControl wControl, String title,
+			CourseGroupManager courseGrpMngr, String selectionAsCsvStr) {
+		super(ureq, wControl, "group_or_area_selection");
+		/*
+		 * before initialising the element, prepare data
+		 */
+		this.courseGrpMngr = courseGrpMngr;
+		// group or area mode
+
+		// unique names from list to arry
+		List<String> uniqueNames = courseGrpMngr.getUniqueAreaNamesFromAllContexts();
+		entries = new String[uniqueNames.size()];
+		uniqueNames.toArray(entries);
+		
+		initForm(ureq);
+		
+		String[] activeSelection = selectionAsCsvStr != null ? selectionAsCsvStr.split(",") : new String[] {};
+		for (int i = 0; i < activeSelection.length; i++) {
+			entrySelector.select(activeSelection[i].trim(), true);
+		}
+	}
+
+	@Override
+	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
+		if (source == createNew) {
+			//user wants to create a new area -> show new area create form
+			removeAsListenerAndDispose(areaCreateCntrllr);
+			areaCreateCntrllr = BGControllerFactory.getInstance().createNewAreaController(ureq, getWindowControl(), courseGrpMngr.getCourseResource());
+			listenTo(areaCreateCntrllr);
+			
+			removeAsListenerAndDispose(cmc);
+			cmc = new CloseableModalController(getWindowControl(),"close",areaCreateCntrllr.getInitialComponent());
+			listenTo(cmc);
+			cmc.activate();
+		}
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Controller source, Event event) {
+		if(source == areaCreateCntrllr) {
+			cmc.deactivate();
+			if (event == Event.DONE_EVENT) {
+				List<String> uniqueNames = null;
+				uniqueNames = courseGrpMngr.getUniqueAreaNamesFromAllContexts();
+				// update entries
+				entries = new String[uniqueNames.size()];
+				uniqueNames.toArray(entries);
+				entrySelector.setKeysAndValues(entries, entries, null);
+				//
+				// select new value
+				entrySelector.select(areaCreateCntrllr.getCreatedAreaName(), true);
+				
+				//inform condition config easy about new groups -> which informs further
+				fireEvent(ureq, Event.CHANGED_EVENT);
+			} 
+		}
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+
+	@Override
+	protected void initForm(FormItemContainer boundTo, Controller listener, UserRequest ureq) {
+		// easy creation only possible if a default group context available
+		createNew = new FormLinkImpl("create");
+		//is a button
+		createNew.setCustomEnabledLinkCSS("b_button");
+		createNew.setCustomDisabledLinkCSS("b_button b_disabled");
+		// create new group/area on the right side
+		boundTo.add(createNew);
+
+		entrySelector = uifactory.addCheckboxesVertical("entries",  null, boundTo, entries, entries, null, 1);
+		// submitCancel after checkboxes
+		//
+		Submit subm = new FormSubmit("subm", "apply");
+		Reset reset = new FormReset("reset", "cancel");
+		boundTo.add(subm);
+		boundTo.add(reset);
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		fireEvent(ureq, Event.DONE_EVENT);
+	}
+
+	@Override
+	protected void formResetted(UserRequest ureq) {
+		fireEvent(ureq, Event.CANCELLED_EVENT);
+	}
+
+	public Set<String> getSelectedEntries() {
+		return entrySelector.getSelectedKeys();
+	}
+
+}
diff --git a/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java b/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java
index 92e267bbf1e..6e026b09a82 100644
--- a/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java
+++ b/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java
@@ -100,8 +100,8 @@ public class ConditionConfigEasyController extends FormBasicController implement
 	private TextElement easyAreaTE;
 	private FormLink chooseAreasLink;
 	private MultipleSelectionElement groupSwitch;
-	private GroupOrAreaSelectionController groupChooseC;
-	private GroupOrAreaSelectionController areaChooseC;
+	private GroupSelectionController groupChooseC;
+	private AreaSelectionController areaChooseC;
 	private FormLink fixGroupError;
 	private FormLink fixAreaError;
 	private MultipleSelectionElement assessmentSwitch;
@@ -332,10 +332,8 @@ public class ConditionConfigEasyController extends FormBasicController implement
 		if (source == chooseGroupsLink) {
 			
 			removeAsListenerAndDispose(groupChooseC);
-			groupChooseC = new GroupOrAreaSelectionController(
-					0, getWindowControl(), ureq, "group", courseEditorEnv.getCourseGroupManager(),
-					easyGroupTE.getValue()
-			);
+			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group",
+					courseEditorEnv.getCourseGroupManager(), easyGroupTE.getValue());
 			listenTo(groupChooseC);
 
 			removeAsListenerAndDispose(cmc);
@@ -371,10 +369,8 @@ public class ConditionConfigEasyController extends FormBasicController implement
 		} else if (source == chooseAreasLink) {
 			
 			removeAsListenerAndDispose(areaChooseC);
-			areaChooseC = new GroupOrAreaSelectionController(
-					1, getWindowControl(), ureq, "area", courseEditorEnv.getCourseGroupManager(),
-					easyAreaTE.getValue()
-			);
+			areaChooseC = new AreaSelectionController(ureq, getWindowControl(), "area",
+					courseEditorEnv.getCourseGroupManager(), easyAreaTE.getValue());
 			listenTo(areaChooseC);
 			
 			removeAsListenerAndDispose(cmc);
@@ -687,15 +683,13 @@ public class ConditionConfigEasyController extends FormBasicController implement
 			if (!easyAreaTE.isEmpty()) {
 				// check whether areas exist
 				activeAreaSelection = easyAreaTE.getValue().split(",");
-				boolean exists = false;
-				Set<String> missingAreas = new HashSet<String>();
-				for (int i = 0; i < activeAreaSelection.length; i++) {
-					String trimmed = activeAreaSelection[i].trim();
-					exists = courseEditorEnv.existsArea(trimmed);
-					if (!exists) {
-						missingAreas.add(trimmed);
-					}
+				
+				List<String> activeAreaList = new ArrayList<String>();
+				for (int i=activeAreaSelection.length; i-->0; ) {
+					activeAreaList.add(activeAreaSelection[i].trim());
 				}
+				List<String> missingAreas = courseEditorEnv.validateAreas(activeAreaList);
+
 				if (missingAreas.size() > 0) {
 					retVal = false;
 					String labelKey = missingAreas.size() == 1 ? "error.notfound.name" : "error.notfound.names";
diff --git a/src/main/java/org/olat/course/condition/GroupOrAreaSelectionController.java b/src/main/java/org/olat/course/condition/GroupSelectionController.java
similarity index 60%
rename from src/main/java/org/olat/course/condition/GroupOrAreaSelectionController.java
rename to src/main/java/org/olat/course/condition/GroupSelectionController.java
index b773f3a64ac..899433c61ef 100644
--- a/src/main/java/org/olat/course/condition/GroupOrAreaSelectionController.java
+++ b/src/main/java/org/olat/course/condition/GroupSelectionController.java
@@ -42,7 +42,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.group.ui.BGControllerFactory;
-import org.olat.group.ui.NewAreaController;
 import org.olat.group.ui.NewBGController;
 
 /**
@@ -53,7 +52,7 @@ import org.olat.group.ui.NewBGController;
  * 
  * @author patrickb
  */
-public class GroupOrAreaSelectionController extends FormBasicController {
+public class GroupSelectionController extends FormBasicController {
 
 	private MultipleSelectionElement entrySelector;
 	protected String[] entries;
@@ -61,35 +60,20 @@ public class GroupOrAreaSelectionController extends FormBasicController {
 	private CourseGroupManager courseGrpMngr;
 	private boolean inGroupMode;
 	private NewBGController groupCreateCntrllr;
-	private NewAreaController areaCreateCntrllr;
 	private CloseableModalController cmc;
 
-	public GroupOrAreaSelectionController(int groupOrArea, WindowControl wControl, UserRequest ureq, String title,
+	public GroupSelectionController(UserRequest ureq, WindowControl wControl, String title,
 			CourseGroupManager courseGrpMngr, String selectionAsCsvStr) {
 		super(ureq, wControl, "group_or_area_selection");
-		/*
-		 * before initialising the element, prepare data
-		 */
 		this.courseGrpMngr = courseGrpMngr;
-		// group or area mode
-		this.inGroupMode = groupOrArea == 0;
-		// unique names from list to arry
-		List<String> uniqueNames = null;
-		if (inGroupMode) {
-			uniqueNames = courseGrpMngr.getUniqueLearningGroupNamesFromAllContexts();
-		} else {
-			uniqueNames = courseGrpMngr.getUniqueAreaNamesFromAllContexts();
-		}
-		
+		// unique names from list to array
+		List<String> uniqueNames = courseGrpMngr.getUniqueLearningGroupNamesFromAllContexts();
+
 		entries = new String[uniqueNames.size()];
 		uniqueNames.toArray(entries);
-		/*
-		 * init form elements
-		 */
-		initForm(this.flc, this, ureq);
-		/*
-		 * after initialising the element, select the entries
-		 */
+
+		initForm(ureq);
+		// after initialising the element, select the entries
 		String[] activeSelection = selectionAsCsvStr != null ? selectionAsCsvStr.split(",") : new String[] {};
 		for (int i = 0; i < activeSelection.length; i++) {
 			entrySelector.select(activeSelection[i].trim(), true);
@@ -100,51 +84,26 @@ public class GroupOrAreaSelectionController extends FormBasicController {
 	protected void formInnerEvent(UserRequest ureq, org.olat.core.gui.components.form.flexible.FormItem source,
 			org.olat.core.gui.components.form.flexible.impl.FormEvent event) {
 		if (source == createNew) {
-			if (inGroupMode) {
-				
-				// user wants to create a new group -> show group create form
-				
-				removeAsListenerAndDispose(groupCreateCntrllr);
-				groupCreateCntrllr = BGControllerFactory.getInstance().createNewBGController(
-						ureq, getWindowControl(), true, courseGrpMngr.getCourseResource(), true, null
-				);
-				listenTo(groupCreateCntrllr);
-				
-				removeAsListenerAndDispose(cmc);
-				cmc = new CloseableModalController(
-						getWindowControl(),"close",groupCreateCntrllr.getInitialComponent()
-				);
-				listenTo(cmc);
-				
-				cmc.activate();
-				
-			} else {
-				
-				//user wants to create a new area -> show new area create form
-				
-				removeAsListenerAndDispose(areaCreateCntrllr);
-				areaCreateCntrllr = BGControllerFactory.getInstance().createNewAreaController(
-						ureq, getWindowControl(), courseGrpMngr.getCourseResource()
-				);
-				listenTo(areaCreateCntrllr);
-				
-				removeAsListenerAndDispose(cmc);
-				cmc = new CloseableModalController(
-						getWindowControl(),"close",areaCreateCntrllr.getInitialComponent()
-				);
-				listenTo(cmc);
-				
-				cmc.activate();
-			}
+			// user wants to create a new group -> show group create form
+			removeAsListenerAndDispose(groupCreateCntrllr);
+			groupCreateCntrllr = BGControllerFactory.getInstance().createNewBGController(
+					ureq, getWindowControl(), true, courseGrpMngr.getCourseResource(), true, null
+			);
+			listenTo(groupCreateCntrllr);
+			
+			removeAsListenerAndDispose(cmc);
+			cmc = new CloseableModalController(
+					getWindowControl(),"close",groupCreateCntrllr.getInitialComponent()
+			);
+			listenTo(cmc);
+			cmc.activate();
 		}
 	}
 
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if (source == groupCreateCntrllr) {
-			
 			cmc.deactivate();
-			
 			if (event == Event.DONE_EVENT) {
 				List<String> uniqueNames = null;
 				uniqueNames = courseGrpMngr.getUniqueLearningGroupNamesFromAllContexts();
@@ -159,25 +118,7 @@ public class GroupOrAreaSelectionController extends FormBasicController {
 				//inform condition config easy about new groups -> which informs further
 				fireEvent(ureq, Event.CHANGED_EVENT);
 			} 
-		} else if(source == areaCreateCntrllr){
-			
-			cmc.deactivate();
-			
-			if (event == Event.DONE_EVENT) {
-				List<String> uniqueNames = null;
-				uniqueNames = courseGrpMngr.getUniqueAreaNamesFromAllContexts();
-				// update entries
-				entries = new String[uniqueNames.size()];
-				uniqueNames.toArray(entries);
-				entrySelector.setKeysAndValues(entries, entries, null);
-				//
-				// select new value
-				entrySelector.select(areaCreateCntrllr.getCreatedAreaName(), true);
-				
-				//inform condition config easy about new groups -> which informs further
-				fireEvent(ureq, Event.CHANGED_EVENT);
-			} 
-		}
+		} 
 	}
 
 	/**
@@ -190,31 +131,16 @@ public class GroupOrAreaSelectionController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer boundTo, Controller listener, UserRequest ureq) {
-		/*
-		// | [] group 1 | create group |
-		// | [] group 2 | |
-		// | submit | cancel | |
-		//
-		 * 
-		 */
-
-			// easy creation only possible if a default group context available
-			if (inGroupMode) {
-				createNew = new FormLinkImpl("create");
-			} else {
-				createNew = new FormLinkImpl("create");
-			}
-			//is a button
-			createNew.setCustomEnabledLinkCSS("b_button");
-			createNew.setCustomDisabledLinkCSS("b_button b_disabled");
-			// create new group/area on the right side
-			boundTo.add(createNew);
-
-		
+		// easy creation only possible if a default group context available
+		createNew = new FormLinkImpl("create");
+		//is a button
+		createNew.setCustomEnabledLinkCSS("b_button");
+		createNew.setCustomDisabledLinkCSS("b_button b_disabled");
+		// create new group/area on the right side
+		boundTo.add(createNew);
 
 		entrySelector = uifactory.addCheckboxesVertical("entries",  null, boundTo, entries, entries, null, 1);
 		// submitCancel after checkboxes
-		//
 		Submit subm = new FormSubmit("subm", "apply");
 		Reset reset = new FormReset("reset", "cancel");
 		boundTo.add(subm);
diff --git a/src/main/java/org/olat/course/editor/CourseEditorEnv.java b/src/main/java/org/olat/course/editor/CourseEditorEnv.java
index 93c96bd6f10..633ef432f26 100644
--- a/src/main/java/org/olat/course/editor/CourseEditorEnv.java
+++ b/src/main/java/org/olat/course/editor/CourseEditorEnv.java
@@ -71,6 +71,13 @@ public interface CourseEditorEnv {
 	 * @return
 	 */
 	boolean existsArea(String areaname);
+	
+	/**
+	 * Return the invalid areas
+	 * @param areaname
+	 * @return
+	 */
+	public List<String> validateAreas(List<String> areaname);
 
 	/**
 	 * @return
diff --git a/src/main/java/org/olat/course/editor/CourseEditorEnvImpl.java b/src/main/java/org/olat/course/editor/CourseEditorEnvImpl.java
index 2b202591b28..489548cd649 100644
--- a/src/main/java/org/olat/course/editor/CourseEditorEnvImpl.java
+++ b/src/main/java/org/olat/course/editor/CourseEditorEnvImpl.java
@@ -178,14 +178,33 @@ public class CourseEditorEnvImpl implements CourseEditorEnv {
 	public boolean existsArea(String areaname) {
 		// FIXME:fg:b improve performance by adding a special query for the existence
 		// check!
-		List cnt = cgm.getAllAreasFromAllContexts();
-		for (Iterator iter = cnt.iterator(); iter.hasNext();) {
-			BGArea element = (BGArea) iter.next();
-			if (element.getName().equals(areaname)) { return true; }
+		List<BGArea> cnt = cgm.getAllAreasFromAllContexts();
+		for (BGArea element : cnt) {
+			if (element.getName().equals(areaname)) { 
+				return true;
+			}
 		}
 		return false;
 	}
 
+	@Override
+	public List<String> validateAreas(List<String> areanames) {
+		List<BGArea> cnt = cgm.getAllAreasFromAllContexts();
+		List<String> invalidNames = new ArrayList<String>();
+		
+		a_a:
+		for(String areaname:areanames) {
+			for (BGArea element : cnt) {
+				if (element.getName().equals(areaname)) { 
+					continue a_a;
+				}
+			}
+			invalidNames.add(areaname);
+			
+		}
+		return invalidNames;
+	}
+
 	/**
 	 * @see org.olat.course.editor.CourseEditorEnv#getCurrentCourseNodeId()
 	 */
diff --git a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
index dbf91a20b0a..58e5ccac031 100644
--- a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
@@ -142,12 +142,6 @@ public interface CourseGroupManager {
 	 *         contexts of this course
 	 */
 	public List<BusinessGroup> getLearningGroupsFromAllContexts(String groupName);
-	/**
-	 * 
-	 * @param groupName
-	 * @return
-	 */
-	//public List<BusinessGroup> getRightGroupsFromAllContexts(String groupName);
 
 	/**
 	 * @param areaName
@@ -195,6 +189,8 @@ public interface CourseGroupManager {
 	 * @return A list of all group areas from this course
 	 */
 	public List<BGArea> getAllAreasFromAllContexts();
+	
+	public List<BGArea> getAreasFromContext(String areaname);
 
 	/**
 	 * Deletes the course group management. This will unlink all group contexts
diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
index 193596e18a0..916bbbc1c9c 100644
--- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
@@ -64,7 +64,7 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 	private static final String LEARNINGGROUPEXPORT_XML = "learninggroupexport.xml";
 	private static final String RIGHTGROUPEXPORT_XML = "rightgroupexport.xml";
 	private static final String LEARNINGGROUPARCHIVE_XLS = "learninggroup_archiv.xls";
-	private static final String RIGHTGROUPARCHIVE_XLS = "rightgroup_archiv.xls";
+	//private static final String RIGHTGROUPARCHIVE_XLS = "rightgroup_archiv.xls";
 
 	private final OLATResource courseResource;
 	
@@ -201,16 +201,24 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 	 * @see org.olat.course.groupsandrights.CourseGroupManager#getAllAreasFromAllContexts()
 	 */
 	public List<BGArea> getAllAreasFromAllContexts() {
-		List<BusinessGroup> learningGroups = getAllLearningGroupsFromAllContexts();
-		List<BGArea> areas = areaManager.findBGAreasOfBusinessGroups(learningGroups);
+		List<BGArea> areas = areaManager.findBGAreasInContext(courseResource);
 		return areas;
 	}
 
+	@Override
+	public List<BGArea> getAreasFromContext(String areaname) {
+		BGArea area = areaManager.findBGArea(areaname, courseResource);
+		if(area == null) {
+			return Collections.emptyList();
+		}
+		return Collections.singletonList(area);
+	}
+
 	/**
 	 * @see org.olat.course.groupsandrights.CourseGroupManager#getLearningGroupsInAreaFromAllContexts(java.lang.String)
 	 */
 	public List<BusinessGroup> getLearningGroupsInAreaFromAllContexts(String areaName) {
-		List<BGArea> areas = areaManager.findBGAreasOfBGContext(courseResource);
+		List<BGArea> areas = areaManager.findBGAreasInContext(courseResource);
 		List<BusinessGroup> groups = areaManager.findBusinessGroupsOfAreas(areas);
 		return groups;
 	}
diff --git a/src/main/java/org/olat/course/nodes/co/COConfigForm.java b/src/main/java/org/olat/course/nodes/co/COConfigForm.java
index 653a7734c75..7c4ce35bce8 100644
--- a/src/main/java/org/olat/course/nodes/co/COConfigForm.java
+++ b/src/main/java/org/olat/course/nodes/co/COConfigForm.java
@@ -49,7 +49,8 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.mail.MailHelper;
-import org.olat.course.condition.GroupOrAreaSelectionController;
+import org.olat.course.condition.AreaSelectionController;
+import org.olat.course.condition.GroupSelectionController;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.ui.BGControllerFactory;
@@ -90,8 +91,8 @@ public class COConfigForm extends FormBasicController {
 	
 	private NewAreaController areaCreateCntrllr;
 	private NewBGController groupCreateCntrllr;
-	private GroupOrAreaSelectionController areaChooseC;
-	private GroupOrAreaSelectionController groupChooseC;
+	private AreaSelectionController areaChooseC;
+	private GroupSelectionController groupChooseC;
 	
 	
 	private FormLayoutContainer areaChooseSubContainer, groupChooseSubContainer ;
@@ -251,15 +252,12 @@ public class COConfigForm extends FormBasicController {
 		if (!easyAreaTE.isEmpty()) {
 			// check whether areas exist
 			activeAreaSelection = easyAreaTE.getValue().split(",");
-			boolean exists = false;
-			Set<String> missingAreas = new HashSet<String>();
-			for (int i = 0; i < activeAreaSelection.length; i++) {
-				String trimmed = activeAreaSelection[i].trim();
-				exists = cev.existsArea(trimmed);
-				if (!exists && trimmed.length() > 0 && !missingAreas.contains(trimmed) ) {
-					missingAreas.add(trimmed);
-				}
+
+			List<String> activeAreaList = new ArrayList<String>();
+			for (int i=activeAreaSelection.length; i-->0; ) {
+				activeAreaList.add(activeAreaSelection[i].trim());
 			}
+			List<String> missingAreas = cev.validateAreas(activeAreaList);
 			if (missingAreas.size() > 0) {
 				retVal = false;
 				String labelKey = missingAreas.size() == 1 ? "error.notfound.name" : "error.notfound.names";
@@ -525,11 +523,8 @@ public class COConfigForm extends FormBasicController {
 		if (source == chooseGroupsLink) {
 			
 			removeAsListenerAndDispose(groupChooseC);
-			groupChooseC = new GroupOrAreaSelectionController(
-					0, getWindowControl(), ureq, "group",
-					cev.getCourseGroupManager(),
-					easyGroupTE.getValue()
-			);
+			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group",
+					cev.getCourseGroupManager(), easyGroupTE.getValue());
 			listenTo(groupChooseC);
 
 			removeAsListenerAndDispose(cmc);
@@ -568,11 +563,8 @@ public class COConfigForm extends FormBasicController {
 
 			// already areas -> choose areas
 			removeAsListenerAndDispose(areaChooseC);
-			areaChooseC = new GroupOrAreaSelectionController (
-					1, getWindowControl(), ureq, "area",
-					cev.getCourseGroupManager(),
-					easyAreaTE.getValue()
-			);
+			areaChooseC = new AreaSelectionController (ureq, getWindowControl(), "area",
+					cev.getCourseGroupManager(), easyAreaTE.getValue());
 			listenTo(areaChooseC);
 			
 			
diff --git a/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java b/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java
index 57db98e7bdf..be0255069a8 100644
--- a/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java
+++ b/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java
@@ -53,8 +53,9 @@ import org.olat.core.util.event.EventBus;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.event.MultiUserEvent;
 import org.olat.core.util.resource.OresHelper;
+import org.olat.course.condition.AreaSelectionController;
 import org.olat.course.condition.Condition;
-import org.olat.course.condition.GroupOrAreaSelectionController;
+import org.olat.course.condition.GroupSelectionController;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.nodes.ENCourseNode;
@@ -95,8 +96,8 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener
 	
 	private NewAreaController areaCreateCntrllr;
 	private NewBGController groupCreateCntrllr;
-	private GroupOrAreaSelectionController areaChooseC;
-	private GroupOrAreaSelectionController groupChooseC;
+	private AreaSelectionController areaChooseC;
+	private GroupSelectionController groupChooseC;
 	private FormLayoutContainer areaChooseSubContainer, groupChooseSubContainer ;
 	private FormItemContainer groupsAndAreasSubContainer;
 	
@@ -302,15 +303,12 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener
 		if (!easyAreaTE.isEmpty()) {
 			// check whether areas exist
 			activeAreaSelection = easyAreaTE.getValue().split(",");
-			boolean exists = false;
-			Set<String> missingAreas = new HashSet<String>();
-			for (int i = 0; i < activeAreaSelection.length; i++) {
-				String trimmed = activeAreaSelection[i].trim();
-				exists = cev.existsArea(trimmed);
-				if (!exists && trimmed.length() > 0 && !missingAreas.contains(trimmed) ) {
-					missingAreas.add(trimmed);
-				}
+
+			List<String> activeAreaList = new ArrayList<String>();
+			for (int i=activeAreaSelection.length; i-->0; ) {
+				activeAreaList.add(activeAreaSelection[i].trim());
 			}
+			List<String> missingAreas = cev.validateAreas(activeAreaList);
 			if (missingAreas.size() > 0) {
 				retVal = false;
 				String labelKey = missingAreas.size() == 1 ? "error.notfound.name" : "error.notfound.names";
@@ -385,11 +383,8 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener
 		if (source == chooseGroupsLink) {
 			
 			removeAsListenerAndDispose(groupChooseC);
-			groupChooseC = new GroupOrAreaSelectionController(
-					0, getWindowControl(), ureq, "group",
-					cev.getCourseGroupManager(),
-					easyGroupTE.getValue()
-			);
+			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group",
+					cev.getCourseGroupManager(), easyGroupTE.getValue());
 			listenTo(groupChooseC);
 
 			removeAsListenerAndDispose(cmc);
@@ -429,11 +424,8 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener
 
 			// already areas -> choose areas
 			removeAsListenerAndDispose(areaChooseC);
-			areaChooseC = new GroupOrAreaSelectionController (
-					1, getWindowControl(), ureq, "area",
-					cev.getCourseGroupManager(),
-					easyAreaTE.getValue()
-			);
+			areaChooseC = new AreaSelectionController (ureq, getWindowControl() , "area",
+					cev.getCourseGroupManager(), easyAreaTE.getValue());
 			listenTo(areaChooseC);
 			
 			
diff --git a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
index f5a6307df56..d40ccff1248 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
@@ -200,6 +200,11 @@ final class PreviewCourseGroupManager extends BasicManager implements CourseGrou
 		return areas;
 	}
 
+	@Override
+	public List<BGArea> getAreasFromContext(String areaname) {
+		return null;
+	}
+
 	/**
 	 * @see org.olat.course.groupsandrights.CourseGroupManager#deleteCourseGroupmanagement()
 	 */
diff --git a/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java b/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java
index 3a8250a1df8..fa502ddb9a9 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java
@@ -47,7 +47,8 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.util.StringHelper;
 import org.olat.course.ICourse;
-import org.olat.course.condition.GroupOrAreaSelectionController;
+import org.olat.course.condition.AreaSelectionController;
+import org.olat.course.condition.GroupSelectionController;
 
 /**
  * Description:<br>
@@ -78,8 +79,8 @@ public class PreviewSettingsForm extends FormBasicController {
 	private SingleSelection roles;
 	
 	private ICourse course;
-	//private GroupAndAreaSelectController chooser;
-	private GroupOrAreaSelectionController groupChooser, areaChooser;
+	private AreaSelectionController areaChooser;
+	private GroupSelectionController groupChooser;
 	
 	private CloseableModalController cmc;
 	
@@ -194,12 +195,8 @@ public class PreviewSettingsForm extends FormBasicController {
 	protected void  formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == groupChooserLink) {
 			removeAsListenerAndDispose (groupChooser);
-			groupChooser = new GroupOrAreaSelectionController(
-					0, //group
-					getWindowControl(), ureq,
-					"group", course.getCourseEnvironment().getCourseGroupManager(),
-					group.getValue()
-			);
+			groupChooser = new GroupSelectionController(ureq, getWindowControl(), "group",
+					course.getCourseEnvironment().getCourseGroupManager(), group.getValue());
 			listenTo(groupChooser);
 				
 			removeAsListenerAndDispose(cmc);
@@ -213,15 +210,10 @@ public class PreviewSettingsForm extends FormBasicController {
 			
 		} else if (source == areaChooserLink) {
 			removeAsListenerAndDispose (areaChooser);
-			areaChooser = new GroupOrAreaSelectionController(
-					1, // area
-					getWindowControl(), ureq,
-					"area", course.getCourseEnvironment().getCourseGroupManager(),
-					area.getValue()
-			);
+			areaChooser = new AreaSelectionController(ureq, getWindowControl(), "area",
+					course.getCourseEnvironment().getCourseGroupManager(), area.getValue());
 			listenTo(areaChooser);
-			
-			
+
 			removeAsListenerAndDispose(cmc);
 			cmc = new CloseableModalController(
 				getWindowControl(),
diff --git a/src/main/java/org/olat/group/area/BGAreaManager.java b/src/main/java/org/olat/group/area/BGAreaManager.java
index f270e3359ed..8185afd0f74 100644
--- a/src/main/java/org/olat/group/area/BGAreaManager.java
+++ b/src/main/java/org/olat/group/area/BGAreaManager.java
@@ -157,7 +157,7 @@ public interface BGAreaManager {
 	 * @param resource
 	 * @return Number of business gropu areas
 	 */
-	public abstract int countBGAreasOfBGContext(OLATResource resource);
+	public abstract int countBGAreasInContext(OLATResource resource);
 
 	/**
 	 * Searches for all business group areas in the given business group context
@@ -165,7 +165,7 @@ public interface BGAreaManager {
 	 * @param resource
 	 * @return A list of business group areas
 	 */
-	public List<BGArea> findBGAreasOfBGContext(OLATResource resource);
+	public List<BGArea> findBGAreasInContext(OLATResource resource);
 
 	/**
 	 * Checks if an identity is in a business group areas with a given name in the
diff --git a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
index 7be7083a228..b26d98e640b 100644
--- a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
+++ b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
@@ -92,7 +92,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	 */
 	// o_clusterOK by:cg ; must be synchronized too ? => not 100% sure, 
 	public Map<BGArea,BGArea> copyBGAreasOfBGContext(OLATResource origBgContext, final OLATResource targetBgContext) {
-		List<BGArea> origAreas = findBGAreasOfBGContext(origBgContext);
+		List<BGArea> origAreas = findBGAreasInContext(origBgContext);
 		Map<BGArea,BGArea> areas = new HashMap<BGArea,BGArea>();
 		Iterator<BGArea> iterator = origAreas.iterator();
 		while (iterator.hasNext()) {
@@ -300,7 +300,8 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	/**
 	 * @see org.olat.group.area.BGAreaManager#countBGAreasOfBGContext(org.olat.group.context.BGContext)
 	 */
-	public int countBGAreasOfBGContext(OLATResource resource) {
+	@Override
+	public int countBGAreasInContext(OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select count(area) from ").append(BGAreaImpl.class.getName()).append(" area where area.resource.key=:resourceKey");
 		Number count = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Number.class)
@@ -312,7 +313,8 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	/**
 	 * @see org.olat.group.area.BGAreaManager#findBGAreasOfBGContext(org.olat.group.context.BGContext)
 	 */
-	public List<BGArea> findBGAreasOfBGContext(OLATResource resource) {
+	@Override
+	public List<BGArea> findBGAreasInContext(OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area where area.resource.key=:resourceKey");
 		List<BGArea> areas = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class)
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupArchiver.java b/src/main/java/org/olat/group/manager/BusinessGroupArchiver.java
index 72b2ee7f972..152f3365b1b 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupArchiver.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupArchiver.java
@@ -261,7 +261,7 @@ public class BusinessGroupArchiver {
 		List<Member> participants = new ArrayList<Member>();
 		List<Member> waitings = new ArrayList<Member>();
 
-		List<BGArea> areas = areaManager.findBGAreasOfBGContext(resource);
+		List<BGArea> areas = areaManager.findBGAreasInContext(resource);
 		for (BGArea area :areas) {
 			if (areaList.contains(area)) { //rely on the equals() method of the BGArea impl
  				List<BusinessGroup> areaBusinessGroupList = areaManager.findBusinessGroupsOfArea(area);
diff --git a/src/main/java/org/olat/group/ui/management/BGManagementController.java b/src/main/java/org/olat/group/ui/management/BGManagementController.java
index dba89129d1c..0dc6ebbbd3e 100644
--- a/src/main/java/org/olat/group/ui/management/BGManagementController.java
+++ b/src/main/java/org/olat/group/ui/management/BGManagementController.java
@@ -825,7 +825,7 @@ public class BGManagementController extends MainLayoutBasicController implements
 		overviewVC.contextPut("numbParticipants", new Integer(numOfParticipants));
 		// number of areas
 		if (flags.isEnabled(BGConfigFlags.AREAS)) {
-			overviewVC.contextPut("numbAreas", new Integer(areaManager.countBGAreasOfBGContext(resource)));
+			overviewVC.contextPut("numbAreas", new Integer(areaManager.countBGAreasInContext(resource)));
 		}
 		setTools(STATE_OVERVIEW);
 	}
@@ -963,7 +963,7 @@ public class BGManagementController extends MainLayoutBasicController implements
 
 			// 2. find areas for group list filter
 			if (flags.isEnabled(BGConfigFlags.AREAS)) {
-				List<BGArea> areas = areaManager.findBGAreasOfBGContext(resource);
+				List<BGArea> areas = areaManager.findBGAreasInContext(resource);
 				areaFilters = new ArrayList<ShortName>(areas);
 				groupListCtr.setFilters(this.areaFilters, currentAreaFilter);
 			}
@@ -993,7 +993,7 @@ public class BGManagementController extends MainLayoutBasicController implements
 
 	private void doAreaList(UserRequest ureq, boolean initializeModel) {
 		if (areaListModel == null || initializeModel) {
-			List<BGArea> areas = areaManager.findBGAreasOfBGContext(resource);
+			List<BGArea> areas = areaManager.findBGAreasInContext(resource);
 			areaListModel = new BGAreaTableModel(areas, getTranslator());
 
 			if (areaListCtr != null) areaListCtr.dispose();
diff --git a/src/main/java/org/olat/group/ui/wizard/MemberListWizardController.java b/src/main/java/org/olat/group/ui/wizard/MemberListWizardController.java
index 1f1e93ca31c..a7d61f6cc13 100644
--- a/src/main/java/org/olat/group/ui/wizard/MemberListWizardController.java
+++ b/src/main/java/org/olat/group/ui/wizard/MemberListWizardController.java
@@ -236,7 +236,7 @@ public class MemberListWizardController extends BasicController {
 				objectArrays.add(groupChoiceRowData);
 			}
 		} else if (AREAS_MEMBERS.equals(wizardType)) {
-			List<BGArea> areas = areaManager.findBGAreasOfBGContext(resource);
+			List<BGArea> areas = areaManager.findBGAreasInContext(resource);
 			Collections.sort(areas, new Comparator<BGArea>() {
 				@Override
 				public int compare(BGArea a1, BGArea a2) {
diff --git a/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java
index af8feba93a9..78a4132eed8 100644
--- a/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java
@@ -41,6 +41,7 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.SearchRepositoryEntryParameters;
 import org.olat.search.service.SearchResourceContext;
 import org.olat.search.service.document.RepositoryEntryDocument;
 import org.olat.search.service.indexer.AbstractHierarchicalIndexer;
@@ -76,7 +77,9 @@ public class RepositoryIndexer extends AbstractHierarchicalIndexer {
   	Roles roles = new Roles(true, true, true, true, false, true, false);
   	int counter = 0;
   	//fxdiff VCRP-1,2: access control of resources
-  	List<RepositoryEntry> repositoryList = repositoryManager.genericANDQueryWithRolesRestriction(null,null,null,null,null,roles, null);
+  	SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
+  	params.setRoles(roles);
+  	List<RepositoryEntry> repositoryList = repositoryManager.genericANDQueryWithRolesRestriction(params, 0, -1, true);
   	if (isLogDebugEnabled()) logDebug("RepositoryIndexer repositoryList.size=" + repositoryList.size());
   	// loop over all repository-entries
 		// committing here to make sure the loadBusinessGroup below does actually
diff --git a/src/test/java/org/olat/group/test/BGAreaManagerTest.java b/src/test/java/org/olat/group/test/BGAreaManagerTest.java
index d959f35fd01..e184400d225 100644
--- a/src/test/java/org/olat/group/test/BGAreaManagerTest.java
+++ b/src/test/java/org/olat/group/test/BGAreaManagerTest.java
@@ -231,11 +231,11 @@ public class BGAreaManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//count
-		int numOfAreas = areaManager.countBGAreasOfBGContext(resource);
+		int numOfAreas = areaManager.countBGAreasInContext(resource);
 		Assert.assertEquals(3, numOfAreas);
 		
 		//find areas
-		List<BGArea> areas = areaManager.findBGAreasOfBGContext(resource);
+		List<BGArea> areas = areaManager.findBGAreasInContext(resource);
 		Assert.assertNotNull(areas);
 		Assert.assertEquals(3, areas.size());
 		Assert.assertTrue(areas.contains(area1));
diff --git a/src/test/java/org/olat/group/test/BusinessGroupImportExportTest.java b/src/test/java/org/olat/group/test/BusinessGroupImportExportTest.java
index 8550ed3cd1b..a6de45fc406 100644
--- a/src/test/java/org/olat/group/test/BusinessGroupImportExportTest.java
+++ b/src/test/java/org/olat/group/test/BusinessGroupImportExportTest.java
@@ -151,7 +151,7 @@ public class BusinessGroupImportExportTest extends OlatTestCase {
 		Assert.assertEquals(3, groups.size());
 		
 		//check if all three areas are imported
-		List<BGArea> areas = areaManager.findBGAreasOfBGContext(resource);
+		List<BGArea> areas = areaManager.findBGAreasInContext(resource);
 		Assert.assertNotNull(areas);
 		Assert.assertEquals(3, areas.size());
 		
-- 
GitLab