From d3e5a84ecdf311b05939be649d97e88edfba6c93 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 28 Aug 2012 13:58:17 +0200
Subject: [PATCH] OO-291: make the synchronization groups to IM more
 configurable with a sync all, per group config, never

---
 .../manager/BusinessGroupServiceImpl.java     | 13 ++-
 .../ui/homepage/GroupInfoMainController.java  |  2 +-
 .../AbstractBusinessGroupListController.java  |  3 +
 .../run/BusinessGroupMainRunController.java   |  2 +-
 .../org/olat/instantMessaging/IMConfig.java   | 34 +++----
 .../olat/instantMessaging/IMConfigSync.java   | 30 ++++++
 .../instantMessaging/InstantMessagingJob.java |  2 +-
 .../InstantMessagingModule.java               | 99 ++-----------------
 .../SmackInstantMessagingImpl.java            | 18 +++-
 .../_spring/instantMessagingContext.xml       |  7 +-
 .../fo/restapi/MyForumsWebService.java        |  3 +-
 .../resources/serviceconfig/olat.properties   | 11 +--
 .../_spring/instantMessagingTestContext.xml   |  7 +-
 13 files changed, 88 insertions(+), 143 deletions(-)
 create mode 100644 src/main/java/org/olat/instantMessaging/IMConfigSync.java

diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 4cad783c644..9cba012ec1a 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -87,6 +87,7 @@ import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.right.BGRightManager;
 import org.olat.group.ui.BGMailHelper;
 import org.olat.group.ui.edit.BusinessGroupModifiedEvent;
+import org.olat.instantMessaging.IMConfigSync;
 import org.olat.instantMessaging.InstantMessagingModule;
 import org.olat.instantMessaging.syncservice.SyncSingleUserTask;
 import org.olat.notifications.NotificationsManagerImpl;
@@ -1136,9 +1137,10 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 	private void addToRoster(Identity ureqIdentity, Identity identity, BusinessGroup group) {
 		if (InstantMessagingModule.isEnabled()) {
 			//evaluate whether to sync or not
-			boolean syncGroup = InstantMessagingModule.getAdapter().getConfig().isSyncLearningGroups();
+			IMConfigSync syncGroup = InstantMessagingModule.getAdapter().getConfig().getSyncGroupsConfig();
 			//only sync when a group is a certain type and this type is configured that you want to sync it
-			if(syncGroup) { 
+			if(syncGroup.equals(IMConfigSync.allGroups) || 
+					(syncGroup.equals(IMConfigSync.perConfig) && isChatEnableFor(group))) { 
 				String groupID = InstantMessagingModule.getAdapter().createChatRoomString(group);
 				String groupDisplayName = group.getName();
 				//course group enrolment is time critial so we move this in an separate thread and catch all failures 
@@ -1146,6 +1148,13 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 			}
 		}
 	}
+	private boolean isChatEnableFor(BusinessGroup group) {
+		CollaborationTools tools = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(group);
+		if(tools == null) {
+			return false;
+		}
+		return tools.isToolEnabled(CollaborationTools.TOOL_CHAT);
+	}
 	
 	@Override
 	public void removeOwners(Identity ureqIdentity, Collection<Identity> identitiesToRemove, BusinessGroup group) {
diff --git a/src/main/java/org/olat/group/ui/homepage/GroupInfoMainController.java b/src/main/java/org/olat/group/ui/homepage/GroupInfoMainController.java
index 1b3a7ca8d58..5b3fa5f9712 100644
--- a/src/main/java/org/olat/group/ui/homepage/GroupInfoMainController.java
+++ b/src/main/java/org/olat/group/ui/homepage/GroupInfoMainController.java
@@ -236,7 +236,7 @@ public class GroupInfoMainController extends MainLayoutBasicController implement
 			return true;
 		}
 		if(BusinessGroupModule.CONTACT_BUSINESS_CARD_GROUP_CONFIG.equals(contactConfig)) {
-			CollaborationTools tools = CollaborationToolsFactory.getInstance().getCollaborationToolsIfExists(businessGroup);
+			CollaborationTools tools = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(businessGroup);
 			return tools == null ? false : tools.isToolEnabled(CollaborationTools.TOOL_CONTACT);
 		}
 		return false;
diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
index b51f8fe60b5..40ff61baa64 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
@@ -492,6 +492,9 @@ abstract class AbstractBusinessGroupListController extends BasicController imple
 		if(groups.isEmpty()) {
 			showWarning("msg.alleastone.editable.group");
 			return;
+		} else if(CollaborationTools.TOOLS == null) {
+			//init the available tools
+			CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(groups.get(0));
 		}
 		
 		boolean isAuthor = ureq.getUserSession().getRoles().isAuthor()
diff --git a/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java b/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java
index 0bd4b30f0f2..2d62a3c1981 100644
--- a/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java
+++ b/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java
@@ -1034,7 +1034,7 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im
 		
 		if (InstantMessagingModule.isEnabled() && 
 				collabTools.isToolEnabled(CollaborationTools.TOOL_CHAT) && 
-				InstantMessagingModule.isSyncLearningGroups() // whether LearningGroups can have chat or not)
+				InstantMessagingModule.isSyncGroups() // whether LearningGroups can have chat or not)
 				) {
 			gtnChild = new GenericTreeNode();
 			gtnChild.setTitle(translate("menutree.chat"));
diff --git a/src/main/java/org/olat/instantMessaging/IMConfig.java b/src/main/java/org/olat/instantMessaging/IMConfig.java
index dc966e59f0e..247d0cf2f7d 100644
--- a/src/main/java/org/olat/instantMessaging/IMConfig.java
+++ b/src/main/java/org/olat/instantMessaging/IMConfig.java
@@ -43,12 +43,10 @@ public class IMConfig {
 	private String replaceStringForEmailAt;
 	private String adminUsername = "admin";
 	private String adminPassword;
-	private boolean generateTestUsers = false;
 	private String CONFERENCE_PREFIX = "conference";
 	private int idlePolltime;
 	private int chatPolltime;
-	private boolean syncPersonalGroups;
-	private boolean syncLearningGroups;
+	private String syncGroups;
 	public static final String RESOURCE = "OLAT";
 	// fxdiff: FXOLAT-46
 	private boolean hideExternalClientInfo;
@@ -123,14 +121,6 @@ public class IMConfig {
 		return nodeId;
 	}
 	
-	public boolean generateTestUsers() {
-		return generateTestUsers;
-	}
-	
-	public void setGenerateTestUsers(boolean generateTestUsers) {
-		this.generateTestUsers = generateTestUsers;
-	}
-	
 	public String getConferenceServer() {
 		return CONFERENCE_PREFIX+"."+servername;
 	}
@@ -156,22 +146,20 @@ public class IMConfig {
 		this.chatPolltime = chatPolltime;
 	}
 
-	public boolean isSyncPersonalGroups() {
-		return syncPersonalGroups;
-	}
-
-	public void setSyncPersonalGroups(boolean syncPersonalGroups) {
-		this.syncPersonalGroups = syncPersonalGroups;
+	public IMConfigSync getSyncGroupsConfig() {
+		if("true".equals(syncGroups)) {
+			return IMConfigSync.allGroups;
+		}
+		if("groupconfig".equals(syncGroups)) {
+			return IMConfigSync.perConfig;
+		}
+		return IMConfigSync.never;
 	}
 
-	public boolean isSyncLearningGroups() {
-		return syncLearningGroups;
+	public void setSyncGroups(String syncGroups) {
+		this.syncGroups = syncGroups;
 	}
 
-	public void setSyncLearningGroups(boolean syncLearningGroups) {
-		this.syncLearningGroups = syncLearningGroups;
-	}
-	
 	public void setPacketReplyTimeout (int timeout) {
 		SmackConfiguration.setPacketReplyTimeout(timeout);
 	}
diff --git a/src/main/java/org/olat/instantMessaging/IMConfigSync.java b/src/main/java/org/olat/instantMessaging/IMConfigSync.java
new file mode 100644
index 00000000000..4c716980153
--- /dev/null
+++ b/src/main/java/org/olat/instantMessaging/IMConfigSync.java
@@ -0,0 +1,30 @@
+/**
+ * <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.instantMessaging;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public enum IMConfigSync {
+	allGroups,
+	perConfig,
+	never
+}
diff --git a/src/main/java/org/olat/instantMessaging/InstantMessagingJob.java b/src/main/java/org/olat/instantMessaging/InstantMessagingJob.java
index 6bea7ddcf00..ddc9ec66066 100644
--- a/src/main/java/org/olat/instantMessaging/InstantMessagingJob.java
+++ b/src/main/java/org/olat/instantMessaging/InstantMessagingJob.java
@@ -56,7 +56,7 @@ public class InstantMessagingJob extends JobWithDB {
 		try {
 			List<Property> props = propertyManager.findProperties(null, null, null, "classConfig", createPropertyName(this.getClass(), CONFIG_SYNCED_LEARNING_GROUPS));
 			if (props.size() == 0 || !Boolean.getBoolean(props.get(0).getStringValue())) {
-				if (InstantMessagingModule.isSyncLearningGroups()) {
+				if (InstantMessagingModule.isSyncGroups()) {
 					long start = System.currentTimeMillis();
 					log.info("Start synching learning groups with IM");
 					boolean result = im.synchronizeBusinessGroupsWithIMServer();
diff --git a/src/main/java/org/olat/instantMessaging/InstantMessagingModule.java b/src/main/java/org/olat/instantMessaging/InstantMessagingModule.java
index 192e442376b..5f57f6c352d 100644
--- a/src/main/java/org/olat/instantMessaging/InstantMessagingModule.java
+++ b/src/main/java/org/olat/instantMessaging/InstantMessagingModule.java
@@ -26,16 +26,10 @@
 
 package org.olat.instantMessaging;
 
-import java.util.List;
-
 import org.jivesoftware.smack.ConnectionConfiguration;
 import org.jivesoftware.smack.XMPPConnection;
 import org.olat.admin.user.delete.service.UserDeletionManager;
-import org.olat.basesecurity.Authentication;
-import org.olat.basesecurity.BaseSecurity;
-import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.configuration.Destroyable;
 import org.olat.core.configuration.Initializable;
 import org.olat.core.gui.control.Event;
@@ -44,7 +38,6 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.event.FrameworkStartupEventChannel;
 import org.olat.core.util.event.GenericEventListener;
-import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
 import org.olat.user.UserDataDeletable;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,12 +59,10 @@ public class InstantMessagingModule implements Initializable, Destroyable, UserD
 	private static XMPPConnection adminConnection;
 	//FIXME: used for legacy access
 	private static InstantMessaging instantMessaingStatic;
-	private IMConfig config;
 	private static boolean enabled = false;
-	private static final String CONFIG_SYNCED_BUDDY_GROUPS = "issynced";
 	//fxdiff: FXOLAT-219 decrease the load for synching groups
 	public static final String CONFIG_SYNCED_LEARNING_GROUPS = "syncedlearninggroups";
-	OLog log = Tracing.createLoggerFor(this.getClass());
+	private static final OLog log = Tracing.createLoggerFor(InstantMessagingModule.class);
 	@Autowired
 	private PropertyManager propertyManager;
 	@Autowired
@@ -112,43 +103,11 @@ public class InstantMessagingModule implements Initializable, Destroyable, UserD
 	 */
 	@Autowired(required=true)
 	public void setIMConfig(IMConfig config) {
-		this.config = config;
 		enabled = config.isEnabled();
 	}
 
-	/**
-	 * @see org.olat.core.configuration.OLATModule#init(com.anthonyeden.lib.config.Configuration)
-	 */
 	public void init() {
-		if (config.isEnabled()) {
-			
-			//create test accounts local and on the IM server
-			if (config.generateTestUsers()) checkAndCreateTestUsers();
-
-			// synchronizing of existing buddygroups with the instant messaging
-			// server
-			// if done we set a property (it gets only done once, to reactivate delete
-			// entry in table o_property)
-			/**
-			 * delete from o_property where name='org.olat.instantMessaging.InstantMessagingModule::syncedbuddygroups';
-			 */
-			
-			List<Property> props = propertyManager.findProperties(null, null, null, "classConfig", createPropertyName(this.getClass(), CONFIG_SYNCED_BUDDY_GROUPS));
-			if (props.size() == 0) {
-				
-				if (config.isSyncPersonalGroups()) {
-					instantMessaging.synchronizeBusinessGroupsWithIMServer();
-				}
-				Property property = propertyManager.createPropertyInstance(null, null, null, "classConfig", createPropertyName(this.getClass(), CONFIG_SYNCED_BUDDY_GROUPS), null,  null, Boolean.toString(true), null);
-				propertyManager.saveProperty(property);
-			}
-
-			// Cleanup, otherwise this subjects will have problems in normal OLAT
-			// operation
-			DBFactory.getInstance().intermediateCommit();
-			
-		}// end if enabled
-
+		//synched moved to the job 
 	}
 	
 	/**
@@ -159,54 +118,10 @@ public class InstantMessagingModule implements Initializable, Destroyable, UserD
    */
 
 	//fxdiff: FXOLAT-219 decrease the load for synching groups
-  public static String createPropertyName(Class clazz, String configurationName) {
-          return clazz.getName() + "::" + configurationName;
+  public static String createPropertyName(Class<?> clazz, String configurationName) {
+  	return clazz.getName() + "::" + configurationName;
   }
 
-
-
-
-	/**
-	 * if enabled in the configuration some testusers for IM are created in the
-	 * database. It has nothing to do with accounts on the jabber server itself.
-	 */
-	private void checkAndCreateTestUsers() {
-		Identity identity;
-		Authentication auth;
-		BaseSecurity securityManager = BaseSecurityManager.getInstance();
-		identity = securityManager.findIdentityByName("author");
-		auth = BaseSecurityManager.getInstance().findAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING);
-		if (auth == null) { // create new authentication for provider
-			BaseSecurityManager.getInstance().createAndPersistAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING, identity.getName(),
-					"test");
-			instantMessaging.createAccount("author", "test", "Aurich Throw", "author@olat-newinstallation.org");
-		}
-
-		identity = securityManager.findIdentityByName("administrator");
-		auth = BaseSecurityManager.getInstance().findAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING);
-		if (auth == null) { // create new authentication for provider
-			BaseSecurityManager.getInstance().createAndPersistAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING, identity.getName(),
-					"olat");
-			instantMessaging.createAccount("administrator", "olat", "Administrator", "administrator@olat-newinstallation.org");
-		}
-
-		identity = securityManager.findIdentityByName("learner");
-		auth = BaseSecurityManager.getInstance().findAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING);
-		if (auth == null) { // create new authentication for provider
-			BaseSecurityManager.getInstance().createAndPersistAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING, identity.getName(),
-					"test");
-			instantMessaging.createAccount("learner", "test", "Leise Arnerich", "learner@olat-newinstallation.org");
-		}
-
-		identity = securityManager.findIdentityByName("test");
-		auth = BaseSecurityManager.getInstance().findAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING);
-		if (auth == null) { // create new authentication for provider
-			BaseSecurityManager.getInstance().createAndPersistAuthentication(identity, ClientManager.PROVIDER_INSTANT_MESSAGING, identity.getName(),
-					"test");
-			instantMessaging.createAccount("test", "test", "Thomas Est", "test@olat-newinstallation.org");
-		}
-	}
-
 	/**
 	 * @see org.olat.core.configuration.OLATModule#destroy()
 	 */
@@ -286,8 +201,10 @@ public class InstantMessagingModule implements Initializable, Destroyable, UserD
 	}
 
 
-	public static boolean isSyncLearningGroups() {
-		return instantMessaingStatic.getConfig().isEnabled() && instantMessaingStatic.getConfig().isSyncLearningGroups();
+	public static boolean isSyncGroups() {
+		return instantMessaingStatic.getConfig().isEnabled()
+				&& (IMConfigSync.allGroups.equals(instantMessaingStatic.getConfig().getSyncGroupsConfig())
+						|| IMConfigSync.perConfig.equals(instantMessaingStatic.getConfig().getSyncGroupsConfig()));
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java b/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java
index 121c42caa5e..1f31beff371 100644
--- a/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java
+++ b/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java
@@ -39,6 +39,8 @@ import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.IdentityShort;
 import org.olat.basesecurity.SecurityGroup;
+import org.olat.collaboration.CollaborationTools;
+import org.olat.collaboration.CollaborationToolsFactory;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
@@ -289,7 +291,7 @@ public class SmackInstantMessagingImpl extends LogDelegator implements InstantMe
 	}
 	
 	//fxdiff: FXOLAT-219 decrease the load for synching groups
-	private boolean synchonizeBuddyRoster(BusinessGroup group, Set<Long> checkedIdentities) {
+	private boolean synchonizeRoster(BusinessGroup group, Set<Long> checkedIdentities) {
 		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		List<SecurityGroup> secGroups = new ArrayList<SecurityGroup>();
 		secGroups.add(group.getOwnerGroup());
@@ -329,6 +331,14 @@ public class SmackInstantMessagingImpl extends LogDelegator implements InstantMe
 		return true;
 	}
 	
+	private boolean isChatEnabled(BusinessGroup group) {
+		CollaborationTools tools = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(group);
+		if(tools == null) {
+			return false;
+		}
+		return tools.isToolEnabled(CollaborationTools.TOOL_CHAT);
+	}
+	
 	/**
 	 * 
 	 * @see org.olat.instantMessaging.InstantMessaging#synchronizeLearningGroupsWithIMServer()
@@ -341,7 +351,7 @@ public class SmackInstantMessagingImpl extends LogDelegator implements InstantMe
 		}
 		logInfo("Starting synchronisation of LearningGroups with IM server");
 		long start = System.currentTimeMillis();
-		boolean syncLearn = InstantMessagingModule.getAdapter().getConfig().isSyncLearningGroups();
+		IMConfigSync syncGroups = InstantMessagingModule.getAdapter().getConfig().getSyncGroupsConfig();
 
 		int counter = 0;
 		int GROUP_BATCH_SIZE = 50;
@@ -351,12 +361,12 @@ public class SmackInstantMessagingImpl extends LogDelegator implements InstantMe
 		do {
 			groups = businessGroupService.findBusinessGroups(params, null, counter, GROUP_BATCH_SIZE);
 			for (BusinessGroup group:groups) {
-				if (!syncLearn) {
+				if (syncGroups == IMConfigSync.never || (syncGroups == IMConfigSync.perConfig && !isChatEnabled(group))) {
 					String groupID = InstantMessagingModule.getAdapter().createChatRoomString(group);
 					if (deleteRosterGroup(groupID)) {
 						logInfo("deleted unwanted group: "+group.getResourceableTypeName()+" "+groupID, null);
 					}
-				} else if (!synchonizeBuddyRoster(group, checkedIdentities)) {
+				} else if (!synchonizeRoster(group, checkedIdentities)) {
 					logError("couldn't sync group: "+group.getResourceableTypeName(), null);
 				}
 				if (counter++ % 6 == 0) {
diff --git a/src/main/java/org/olat/instantMessaging/_spring/instantMessagingContext.xml b/src/main/java/org/olat/instantMessaging/_spring/instantMessagingContext.xml
index b28fa98e02c..35929316a69 100644
--- a/src/main/java/org/olat/instantMessaging/_spring/instantMessagingContext.xml
+++ b/src/main/java/org/olat/instantMessaging/_spring/instantMessagingContext.xml
@@ -91,7 +91,6 @@
 		<property name="servername" value="${instantMessaging.server.name}" />
 		<property name="nodeId" value="${node.id}" />		
 		<property name="multipleInstances" value="${instantMessaging.multipleInstances}"/>
-		<property name="generateTestUsers" value="${instantMessaging.generateTestUsers}" />
 		<property name="adminName" value="${instantMessaging.admin.username}" />		
 		<property name="adminPassword" value="${instantMessaging.admin.password}" />
 		<property name="replaceStringForEmailAt" value="${instantMessaging.replaceStringForEmailAt}" />
@@ -104,10 +103,8 @@
 		<property name="idlePolltime" value="5000" />
 		<!-- polling intervall while chatting -->
 		<property name="chatPolltime" value="2000" />
-		<!-- synchonisation of olat group as buddy group on IM server. Runs only once -->
-		<property name="syncPersonalGroups" value="${instantMessaging.sync.personal.groups}" />
-		<!-- synchonisation of olat learning group as buddy group on IM server. Runs only once -->
-		<property name="syncLearningGroups" value="${instantMessaging.sync.learning.groups}" />
+		<!-- synchonisation of groups on IM server. -->
+		<property name="syncGroups" value="${instantMessaging.sync.groups}" />
 		<property name="packetReplyTimeout" value="${instantMessaging.packetReplyTimeout}" />
 	</bean>
 	
diff --git a/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java b/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java
index 799b6f9ae2e..ea2a7363010 100644
--- a/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java
@@ -72,7 +72,6 @@ import org.olat.repository.RepositoryManager;
 import org.olat.repository.SearchRepositoryEntryParameters;
 import org.olat.resource.accesscontrol.ACService;
 import org.olat.resource.accesscontrol.AccessResult;
-import org.olat.resource.accesscontrol.manager.ACFrontendManager;
 import org.olat.restapi.group.LearningGroupWebService;
 
 /**
@@ -187,7 +186,7 @@ public class MyForumsWebService {
 		final List<ForumVO> forumVOs = new ArrayList<ForumVO>();
 		
 		RepositoryManager rm = RepositoryManager.getInstance();
-		ACService acManager = (ACFrontendManager)CoreSpringFactory.getImpl(ACService.class);
+		ACService acManager = CoreSpringFactory.getImpl(ACService.class);
 		SearchRepositoryEntryParameters repoParams = new SearchRepositoryEntryParameters(retrievedUser, roles, "CourseModule");
 		repoParams.setOnlyExplicitMember(true);
 		List<RepositoryEntry> entries = rm.genericANDQueryWithRolesRestriction(repoParams, 0, -1, true);
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 53b4393d85b..eb035c71705 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -440,17 +440,12 @@ instantMessaging.multipleInstances=false
 # when using multiple OLAT instances if you use email addresses as OLAT
 # usernames then the '@' must be replaced !
 instantMessaging.replaceStringForEmailAt=_at_
-# only required for testing/debugging purposes
-instantMessaging.generateTestUsers=false
 # an "admin" account must be present, do not change this username!
 instantMessaging.admin.username=admin
 instantMessaging.admin.password=admin
-#if true all personal groups are synchronized with the im server
-instantMessaging.sync.personal.groups=true
-#if true all learning groups (all groups from all courses!) are synchronized with the im server.
-#ATTENTION: On a server with many courses and groups this can generate thousand of groups and therefore
-#generete millions of presence messages. Check openfire reguarly if set to true!
-instantMessaging.sync.learning.groups=true
+#if true all groups are synchronized with the im server
+instantMessaging.sync.groups=true
+instantMessaging.sync.groups.values=true,groupconfig,false
 #FXOLAT-219 The delay
 instantMessaging.sync.learning.groups.start.delay=15000
 #Default in Smack is 5000 so set to that here
diff --git a/src/test/java/org/olat/instantMessaging/_spring/instantMessagingTestContext.xml b/src/test/java/org/olat/instantMessaging/_spring/instantMessagingTestContext.xml
index 258df1861b0..91ec458ae4a 100644
--- a/src/test/java/org/olat/instantMessaging/_spring/instantMessagingTestContext.xml
+++ b/src/test/java/org/olat/instantMessaging/_spring/instantMessagingTestContext.xml
@@ -87,7 +87,6 @@
 		<property name="servername" value="${instantMessaging.server.name}" />
 		<property name="nodeId" value="${node.id}" />		
 		<property name="multipleInstances" value="${instantMessaging.multipleInstances}"/>
-		<property name="generateTestUsers" value="${instantMessaging.generateTestUsers}" />
 		<property name="adminName" value="${instantMessaging.admin.username}" />		
 		<property name="adminPassword" value="${instantMessaging.admin.password}" />
 		<property name="replaceStringForEmailAt" value="${instantMessaging.replaceStringForEmailAt}" />
@@ -98,10 +97,8 @@
 		<property name="idlePolltime" value="15000" />
 		<!-- polling intervall while chatting -->
 		<property name="chatPolltime" value="2500" />
-		<!-- synchonisation of olat group as buddy group on IM server. Runs only once -->
-		<property name="syncPersonalGroups" value="${instantMessaging.sync.personal.groups}" />
-		<!-- synchonisation of olat learning group as buddy group on IM server. Runs only once -->
-		<property name="syncLearningGroups" value="${instantMessaging.sync.learning.groups}" />
+		<!-- synchonisation of groups on IM server. -->
+		<property name="syncGroups" value="${instantMessaging.sync.groups}" />
 		
 	</bean>
 	
-- 
GitLab