From 92900099cb2d142bd56371b0edc5a19c494b0889 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 17 Oct 2012 10:11:07 +0200
Subject: [PATCH] OO-385: fix some leak of controllers

---
 .../olat/commons/calendar/ui/ManageCalendarsController.java | 2 +-
 .../olat/commons/calendar/ui/WeeklyCalendarController.java  | 2 +-
 .../commons/contextHelp/ContextHelpTopNavController.java    | 4 +++-
 .../java/org/olat/core/gui/control/DefaultController.java   | 2 ++
 .../gui/control/generic/iframe/IFrameDisplayController.java | 5 ++---
 .../olat/core/gui/control/generic/portal/PortalImpl.java    | 5 +++--
 .../org/olat/core/gui/control/winmgr/WindowManagerImpl.java | 6 ------
 .../group/ui/homepage/GroupMembersDisplayController.java    | 3 +++
 .../java/org/olat/gui/control/OlatTopNavController.java     | 3 +++
 .../controllerCreators/HomePortalControllerCreator.java     | 5 ++++-
 .../org/olat/login/AfterLoginInterceptionController.java    | 2 ++
 src/main/java/org/olat/modules/cp/CPDisplayController.java  | 1 +
 src/main/java/org/olat/user/PersonalSettingsController.java | 1 +
 13 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/src/main/java/org/olat/commons/calendar/ui/ManageCalendarsController.java b/src/main/java/org/olat/commons/calendar/ui/ManageCalendarsController.java
index a26e9a20d88..eabc54fd116 100644
--- a/src/main/java/org/olat/commons/calendar/ui/ManageCalendarsController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/ManageCalendarsController.java
@@ -77,7 +77,7 @@ public class ManageCalendarsController extends BasicController {
 			
 		// Import calendar functionalities
 		importedCalendarConfig = new ImportedCalendarConfigurationController(importedCalendarWrappers, ureq, getWindowControl(), true);
-		importedCalendarConfig.addControllerListener(this);
+		listenTo(importedCalendarConfig);
 		manageVC.put("importedCalendarConfig", importedCalendarConfig.getInitialComponent());
 		manageVC.contextPut("importedCalendarWrappers", importedCalendarWrappers);
 		
diff --git a/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java b/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
index c95d36cb5d3..9f6d741611f 100644
--- a/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
@@ -247,7 +247,7 @@ public class WeeklyCalendarController extends BasicController implements Activat
 		
 		vcMain.put("calendarConfig", calendarConfig.getInitialComponent());
 		importedCalendarConfig = new ImportedCalendarConfigurationController(importedCalendarWrappers, ureq, getWindowControl(), false);
-		importedCalendarConfig.addControllerListener(this);
+		listenTo(importedCalendarConfig);
 		vcMain.put("importedCalendarConfig", importedCalendarConfig.getInitialComponent());
 
 		// calendar subscription
diff --git a/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java b/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java
index 466e901087c..e303e4b561a 100644
--- a/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java
+++ b/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java
@@ -162,6 +162,8 @@ public class ContextHelpTopNavController extends FormBasicController {
 	 * @see org.olat.core.gui.control.DefaultController#doDispose()
 	 */
 	protected void doDispose() {
-		// nothing to dispose
+		if(searchController != null) {
+			searchController.dispose();
+		}
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/control/DefaultController.java b/src/main/java/org/olat/core/gui/control/DefaultController.java
index 8b9d5d8c658..37a62615d93 100644
--- a/src/main/java/org/olat/core/gui/control/DefaultController.java
+++ b/src/main/java/org/olat/core/gui/control/DefaultController.java
@@ -36,6 +36,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
+import org.olat.core.gui.control.generic.portal.PortalImpl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.BusinessControlFactory;
@@ -494,5 +495,6 @@ public abstract class DefaultController implements Controller, ControllerEventLi
 	 */
 	protected void setDisposedMsgController(Controller disposeMsgController) {
 		disposedMessageController = disposeMsgController;
+		controllerCnt.decrementAndGet();
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
index 9b80675df83..6cdb2bcfba9 100644
--- a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
@@ -78,7 +78,7 @@ public class IFrameDisplayController extends BasicController implements GenericE
 	/**
 	 * Base URI of contentMapper
 	 */
-	private String baseURI;
+	private final String baseURI;
 	/**
 	 * Relative uri of currently loaded page in iframe
 	 */
@@ -166,8 +166,7 @@ public class IFrameDisplayController extends BasicController implements GenericE
 				null /*g_encoding*/, null /*jsEncoding*/, null /*contentEncoding*/,
 				frameId, null /*customCssURL*/, themeBaseUri, null /*customHeaderContent*/,
 				staticFilesPath, mapPathGlossar);
-		
-		String baseURI;
+
 		String mapperID = VFSManager.getRealPath(rootDir);
 		if (mapperID == null) {
 			// can't cache mapper, no cacheable context available
diff --git a/src/main/java/org/olat/core/gui/control/generic/portal/PortalImpl.java b/src/main/java/org/olat/core/gui/control/generic/portal/PortalImpl.java
index cb6d5fad6c6..17a9f86dad1 100644
--- a/src/main/java/org/olat/core/gui/control/generic/portal/PortalImpl.java
+++ b/src/main/java/org/olat/core/gui/control/generic/portal/PortalImpl.java
@@ -202,6 +202,7 @@ public class PortalImpl extends DefaultController implements Portal, ControllerE
 				// discard invalid portlet names
 			}
 		}
+		dispose();
 		return new PortalImpl(this.name, ureq, wContr, cleanedUserColumns);
 	}
 	
@@ -408,9 +409,9 @@ public class PortalImpl extends DefaultController implements Portal, ControllerE
 	 */
 	protected void doDispose() {
 		// cleanup all portlet containers
-		Iterator iter = portletContainers.values().iterator();
+		Iterator<PortletContainer> iter = portletContainers.values().iterator();
 		while (iter.hasNext()) {
-			PortletContainer element = (PortletContainer) iter.next();
+			PortletContainer element = iter.next();
 			element.dispose();
 		}
 		portletContainers = null;
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
index dcddc749625..b64aa4c15b0 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
@@ -83,12 +83,6 @@ public class WindowManagerImpl extends BasicManager implements WindowManager {
 
 	private PopupBrowserWindowControllerCreator pbwcc;
 	
-	
-	
-	// global urls for mapped path e.g. for css, js and so on; for all users!
-	private static Map<String,String> mappedPaths = new HashMap<String, String>();
-	
-	
 	public WindowManagerImpl() {
 		
 		this.pbwcc = (PopupBrowserWindowControllerCreator) 
diff --git a/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java b/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java
index 99e8653ff6b..5d9122a23af 100644
--- a/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java
+++ b/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java
@@ -48,14 +48,17 @@ public class GroupMembersDisplayController extends BasicController {
 		if(members.isOwnersPublic()) {
 			GroupController groupOwnersController = new GroupController(ureq, wControl, false, true, false, false, false, businessGroup.getOwnerGroup());
 			content.put("owners", groupOwnersController.getInitialComponent());
+			listenTo(groupOwnersController);
 		}
 		if(members.isParticipantsPublic()) {
 			GroupController groupParticipantsController = new GroupController(ureq, wControl, false, true, false, false, false, businessGroup.getPartipiciantGroup());
 			content.put("participants", groupParticipantsController.getInitialComponent());
+			listenTo(groupParticipantsController);
 		}
 		if(members.isWaitingListPublic()) {
 			GroupController groupWaitingListController = new GroupController(ureq, wControl, false, true, false, false, false, businessGroup.getWaitingGroup());
 			content.put("waitingList", groupWaitingListController.getInitialComponent());
+			listenTo(groupWaitingListController);
 		}
 		putInitialPanel(content);
 	}
diff --git a/src/main/java/org/olat/gui/control/OlatTopNavController.java b/src/main/java/org/olat/gui/control/OlatTopNavController.java
index b39f053656b..dd108295249 100644
--- a/src/main/java/org/olat/gui/control/OlatTopNavController.java
+++ b/src/main/java/org/olat/gui/control/OlatTopNavController.java
@@ -182,6 +182,9 @@ public class OlatTopNavController extends BasicController implements GenericEven
 		if (singleUserEventCenter != null) {
 			singleUserEventCenter.deregisterFor(this, ass);
 		}
+		if(searchC != null) {
+			searchC.dispose();
+		}
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/home/controllerCreators/HomePortalControllerCreator.java b/src/main/java/org/olat/home/controllerCreators/HomePortalControllerCreator.java
index 51b8a3253e7..fa571c4bf32 100644
--- a/src/main/java/org/olat/home/controllerCreators/HomePortalControllerCreator.java
+++ b/src/main/java/org/olat/home/controllerCreators/HomePortalControllerCreator.java
@@ -119,7 +119,10 @@ public class HomePortalControllerCreator extends AutoCreator  {
 		
 		@Override
 		protected void doDispose() {
-			//
+			if (myPortal != null) {
+				myPortal.dispose();
+				myPortal = null;
+			}
 		}
 
 		@Override
diff --git a/src/main/java/org/olat/login/AfterLoginInterceptionController.java b/src/main/java/org/olat/login/AfterLoginInterceptionController.java
index 3ff198bb447..f0a905214aa 100644
--- a/src/main/java/org/olat/login/AfterLoginInterceptionController.java
+++ b/src/main/java/org/olat/login/AfterLoginInterceptionController.java
@@ -126,6 +126,7 @@ public class AfterLoginInterceptionController extends BasicController {
 					if(loginInterceptor.isInterceptionRequired(ureq)) {
 						mapInfos.put(CONTROLLER, ctrl);
 					} else {
+						ctrl.dispose();
 						mapInfosIt.remove();
 					}
 				} else if (ctrl != null ){
@@ -148,6 +149,7 @@ public class AfterLoginInterceptionController extends BasicController {
 		wiz = new WizardInfoController(ureq, aftctrls.size());
 		vC.put("wizard", wiz.getInitialComponent());
 		vC.contextPut("ctrlCount", aftctrls.size());
+		listenTo(wiz);
 
 		// get first Ctrl into Wizard
 		putControllerToPanel(ureq, wControl, 0);
diff --git a/src/main/java/org/olat/modules/cp/CPDisplayController.java b/src/main/java/org/olat/modules/cp/CPDisplayController.java
index 532340104eb..a71308e89df 100644
--- a/src/main/java/org/olat/modules/cp/CPDisplayController.java
+++ b/src/main/java/org/olat/modules/cp/CPDisplayController.java
@@ -119,6 +119,7 @@ public class CPDisplayController extends BasicController implements Activateable
 		  SearchServiceUIFactory searchServiceUIFactory = (SearchServiceUIFactory)CoreSpringFactory.getBean(SearchServiceUIFactory.class);
 		  searchCtrl = searchServiceUIFactory.createInputController(ureq, wControl, DisplayOption.BUTTON, null);
 		  myContent.put("search_input", searchCtrl.getInitialComponent());
+		  listenTo(searchCtrl);
 		}
 		
 		//TODO:gs:a
diff --git a/src/main/java/org/olat/user/PersonalSettingsController.java b/src/main/java/org/olat/user/PersonalSettingsController.java
index 1f375178811..287e9d81c84 100644
--- a/src/main/java/org/olat/user/PersonalSettingsController.java
+++ b/src/main/java/org/olat/user/PersonalSettingsController.java
@@ -107,6 +107,7 @@ public class PersonalSettingsController extends BasicController implements Activ
 			if(WebDAVManager.getInstance().isEnabled()) {
 				pwdav = new WebDAVPasswordController(ureq, getWindowControl());
 				userConfig.addTab(translate("tab.pwdav"), pwdav.getInitialComponent());
+				listenTo(pwdav);
 			}
 			
 			if(InstantMessagingModule.isEnabled()){
-- 
GitLab