changeset 2550:1a9f0dc69d14

Add controller caching for when switching between vms PR3267 Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-December/021865.html
author Alex Macdonald <almacdon@redhat.com>
date Fri, 16 Dec 2016 16:57:19 -0500
parents a4d9708db5f1
children b1f77c58792e
files notes/client-core/src/main/java/com/redhat/thermostat/notes/client/core/VmNotesControllerProvider.java vm-byteman/client-swing/src/main/java/com/redhat/thermostat/vm/byteman/client/swing/internal/VmBytemanInformationService.java vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/VmClassStatServiceImpl.java vm-compiler/client-core/src/main/java/com/redhat/thermostat/vm/compiler/client/core/internal/VmCompilerStatServiceImpl.java vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/VmCpuServiceImpl.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcServiceImpl.java vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/HeapDumperServiceImpl.java vm-io/client-core/src/main/java/com/redhat/thermostat/vm/io/client/core/internal/VmIoServiceImpl.java vm-jmx/client-core/src/main/java/com/redhat/thermostat/vm/jmx/client/core/internal/JmxNotificationsViewServiceImpl.java vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/MemoryStatsServiceImpl.java vm-numa/client-core/src/main/java/com/redhat/thermostat/vm/numa/client/core/VmNumaServiceImpl.java vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/VmOverviewServiceImpl.java vm-profiler/client-swing/src/main/java/com/redhat/thermostat/vm/profiler/client/swing/internal/VmProfileService.java
diffstat 13 files changed, 108 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/notes/client-core/src/main/java/com/redhat/thermostat/notes/client/core/VmNotesControllerProvider.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/notes/client-core/src/main/java/com/redhat/thermostat/notes/client/core/VmNotesControllerProvider.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.notes.client.core;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.common.ApplicationService;
 import com.redhat.thermostat.common.Clock;
 import com.redhat.thermostat.notes.common.VmNoteDAO;
@@ -43,13 +46,18 @@
 
 public class VmNotesControllerProvider extends NotesControllerProvider<VmRef, VmNoteDAO> {
 
+    private Map<VmRef, VmNotesController> controllers = new ConcurrentHashMap<>();
+
     public VmNotesControllerProvider(Clock clock, ApplicationService appSvc, VmNoteDAO vmNoteDao, NotesViewProvider viewProvider) {
         super(clock, appSvc, vmNoteDao, viewProvider);
     }
 
     @Override
     public VmNotesController getInformationServiceController(VmRef vm) {
-        return new VmNotesController(clock, appSvc, dao, vm, viewProvider);
+        if (controllers.get(vm) == null) {
+            controllers.put(vm, new VmNotesController(clock, appSvc, dao, vm, viewProvider));
+        }
+        return controllers.get(vm);
     }
 
 }
--- a/vm-byteman/client-swing/src/main/java/com/redhat/thermostat/vm/byteman/client/swing/internal/VmBytemanInformationService.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-byteman/client-swing/src/main/java/com/redhat/thermostat/vm/byteman/client/swing/internal/VmBytemanInformationService.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.byteman.client.swing.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
@@ -74,6 +77,8 @@
     
     @Reference
     private RequestQueue requestQueue;
+    
+    private Map<VmRef, VmBytemanInformationController> controllers = new ConcurrentHashMap<>();
 
     @Override
     public int getOrderValue() {
@@ -89,9 +94,10 @@
 
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new VmBytemanInformationController(ref, agentInfoDao,
-                                                  vmInfoDao, vmBytemanDao,
-                                                  requestQueue);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmBytemanInformationController(ref, agentInfoDao, vmInfoDao, vmBytemanDao, requestQueue));
+        }
+        return controllers.get(ref);
     }
 
 }
--- a/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/VmClassStatServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/VmClassStatServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.classstat.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.common.Filter;
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
@@ -53,6 +56,7 @@
     private ApplicationService appSvc;
     private VmClassStatDAO vmClassStatDao;
     private VmClassStatViewProvider viewProvider;
+    private Map<VmRef, VmClassStatController> controllers = new ConcurrentHashMap<>();
 
     public VmClassStatServiceImpl(ApplicationService appSvc,
             VmClassStatDAO vmClassStatDao, VmClassStatViewProvider viewProvider) {
@@ -63,7 +67,10 @@
     
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new VmClassStatController(appSvc, vmClassStatDao, ref, viewProvider);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmClassStatController(appSvc, vmClassStatDao, ref, viewProvider));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-compiler/client-core/src/main/java/com/redhat/thermostat/vm/compiler/client/core/internal/VmCompilerStatServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-compiler/client-core/src/main/java/com/redhat/thermostat/vm/compiler/client/core/internal/VmCompilerStatServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.compiler.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.common.ApplicationService;
@@ -53,6 +56,7 @@
     private ApplicationService appSvc;
     private VmCompilerStatDao vmCompilerStatDao;
     private VmCompilerStatViewProvider viewProvider;
+    private Map<VmRef, VmCompilerStatController> controllers = new ConcurrentHashMap<>();
 
     public VmCompilerStatServiceImpl(ApplicationService appSvc,
             VmCompilerStatDao vmCompilerStatDao, VmCompilerStatViewProvider viewProvider) {
@@ -63,7 +67,10 @@
 
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new VmCompilerStatController(appSvc, vmCompilerStatDao, ref, viewProvider);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmCompilerStatController(appSvc, vmCompilerStatDao, ref, viewProvider));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/VmCpuServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/VmCpuServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.cpu.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.common.Filter;
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
@@ -53,6 +56,7 @@
     private ApplicationService appSvc;
     private VmCpuStatDAO vmCpuStatDAO;
     private VmCpuViewProvider viewProvider;
+    private Map<VmRef, VmCpuController> controllers = new ConcurrentHashMap<>();
     
     public VmCpuServiceImpl(ApplicationService appSvc, VmCpuStatDAO vmCpuStatDAO,
             VmCpuViewProvider viewProvider) {
@@ -64,7 +68,10 @@
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(
             VmRef ref) {
-        return new VmCpuController(appSvc, vmCpuStatDAO, ref, viewProvider);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmCpuController(appSvc, vmCpuStatDAO, ref, viewProvider));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.gc.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.common.Filter;
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
@@ -61,6 +64,7 @@
     private AgentInfoDAO agentInfoDAO;
     private VmGcViewProvider viewProvider;
     private GCRequest gcRequest;
+    private Map<VmRef, VmGcController> controllers = new ConcurrentHashMap<>();
     
     public VmGcServiceImpl(ApplicationService appSvc,
             VmMemoryStatDAO vmMemoryStatDAO, VmGcStatDAO vmGcStatDAO, VmInfoDAO vmInfoDAO, AgentInfoDAO agentInfoDAO,
@@ -77,7 +81,10 @@
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(
             VmRef ref) {
-        return new VmGcController(appSvc, vmMemoryStatDAO, vmGcStatDAO, vmInfoDAO, agentInfoDAO, ref, viewProvider, gcRequest);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmGcController(appSvc, vmMemoryStatDAO, vmGcStatDAO, vmInfoDAO, agentInfoDAO, ref, viewProvider, gcRequest));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/HeapDumperServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/HeapDumperServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.heap.analysis.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.client.core.progress.ProgressNotifier;
@@ -74,6 +77,8 @@
     private ProgressNotifier notifier;
     
     private HeapDumpListViewProvider heapDumpListViewProvider;
+
+    private Map<VmRef, HeapDumpController> controllers = new ConcurrentHashMap<>();
     
     public HeapDumperServiceImpl(ApplicationService appService,
             VmInfoDAO vmInfoDao, VmMemoryStatDAO vmMemoryStatDao,
@@ -101,9 +106,10 @@
 
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new HeapDumpController(vmMemoryStatDao, vmInfoDao, heapDao, ref, appService,
-                viewProvider, detailsViewProvider, histogramViewProvider, treeMapViewProvider, objectDetailsViewProvider,
-                objectRootsViewProvider, heapDumpListViewProvider, notifier);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new HeapDumpController(vmMemoryStatDao, vmInfoDao, heapDao, ref, appService, viewProvider, detailsViewProvider, histogramViewProvider, treeMapViewProvider, objectDetailsViewProvider, objectRootsViewProvider, heapDumpListViewProvider, notifier));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-io/client-core/src/main/java/com/redhat/thermostat/vm/io/client/core/internal/VmIoServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-io/client-core/src/main/java/com/redhat/thermostat/vm/io/client/core/internal/VmIoServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.io.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.common.ApplicationService;
@@ -53,6 +56,7 @@
     private ApplicationService appSvc;
     private VmIoStatDAO vmIoStatDAO;
     private VmIoViewProvider viewProvider;
+    private Map<VmRef, VmIoController> controllers = new ConcurrentHashMap<>();
 
     public VmIoServiceImpl(ApplicationService appSvc, VmIoStatDAO vmCpuStatDAO, VmIoViewProvider viewProvider) {
         this.appSvc = appSvc;
@@ -62,7 +66,10 @@
 
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new VmIoController(appSvc, vmIoStatDAO, ref, viewProvider);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmIoController(appSvc, vmIoStatDAO, ref, viewProvider));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-jmx/client-core/src/main/java/com/redhat/thermostat/vm/jmx/client/core/internal/JmxNotificationsViewServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-jmx/client-core/src/main/java/com/redhat/thermostat/vm/jmx/client/core/internal/JmxNotificationsViewServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.jmx.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.command.RequestQueue;
 import com.redhat.thermostat.common.Filter;
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
@@ -62,6 +65,8 @@
     private final RequestQueue requestQueue;
     private final TimerFactory timerFactory;
 
+    private Map<VmRef, JmxNotificationsViewController> controllers = new ConcurrentHashMap<>();
+
     public JmxNotificationsViewServiceImpl(ApplicationService appSvc,
             AgentInfoDAO agentDao, VmInfoDAO vmInfoDao, JmxNotificationDAO notificationDao,
             RequestQueue requestQueue, TimerFactory timerFactory,
@@ -82,8 +87,10 @@
 
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new JmxNotificationsViewController(appSvc, agentDao, vmInfoDao, notificationDao, timerFactory,
-                requestQueue, viewProvider, ref);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new JmxNotificationsViewController(appSvc, agentDao, vmInfoDao, notificationDao, timerFactory, requestQueue, viewProvider, ref));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/MemoryStatsServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/MemoryStatsServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.memory.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.common.ApplicationService;
@@ -61,6 +64,7 @@
     private AgentInfoDAO agentDAO;
     private GCRequest gcRequest;
     private MemoryStatsViewProvider viewProvider;
+    private Map<VmRef, MemoryStatsController> controllers = new ConcurrentHashMap<>();
     
     public MemoryStatsServiceImpl(ApplicationService appSvc,
             VmInfoDAO vmInfoDao, VmMemoryStatDAO vmMemoryStatDao, VmTlabStatDAO vmTlabStatDao, AgentInfoDAO agentDAO,
@@ -76,7 +80,10 @@
     
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new MemoryStatsController(appSvc, vmInfoDao, vmMemoryStatDao, vmTlabStatDao, ref, viewProvider, agentDAO, gcRequest);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new MemoryStatsController(appSvc, vmInfoDao, vmMemoryStatDao, vmTlabStatDao, ref, viewProvider, agentDAO, gcRequest));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-numa/client-core/src/main/java/com/redhat/thermostat/vm/numa/client/core/VmNumaServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-numa/client-core/src/main/java/com/redhat/thermostat/vm/numa/client/core/VmNumaServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.numa.client.core;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.common.ApplicationService;
@@ -56,6 +59,7 @@
     private VmNumaDAO vmNumaDAO;
     private VmNumaViewProvider vmNumaViewProvider;
     private NumaDAO numaDAO;
+    private Map<VmRef, VmNumaController> controllers = new ConcurrentHashMap<>();
 
     public VmNumaServiceImpl(ApplicationService applicationService, NumaDAO numaDAO, VmNumaDAO vmNumaDAO, VmNumaViewProvider vmNumaViewProvider) {
         this.appSvc = applicationService;
@@ -73,7 +77,10 @@
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
         VmId vmId = new VmId(ref.getVmId());
         AgentId agentId = new AgentId(ref.getHostRef().getAgentId());
-        return new VmNumaController(appSvc, numaDAO, vmNumaDAO, vmId, agentId, vmNumaViewProvider);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmNumaController(appSvc, numaDAO, vmNumaDAO, vmId, agentId, vmNumaViewProvider));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/VmOverviewServiceImpl.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/VmOverviewServiceImpl.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.overview.client.core.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.common.Filter;
 import com.redhat.thermostat.client.core.NameMatchingRefFilter;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
@@ -53,6 +56,7 @@
     private ApplicationService appSvc;
     private VmInfoDAO vmInfoDAO;
     private VmOverviewViewProvider viewProvider;
+    private Map<VmRef, VmOverviewController> controllers = new ConcurrentHashMap<>();
     
     public VmOverviewServiceImpl(ApplicationService appSvc, VmInfoDAO vmInfoDAO, VmOverviewViewProvider viewProvider) {
         this.appSvc = appSvc;
@@ -63,7 +67,10 @@
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(
             VmRef ref) {
-        return new VmOverviewController(vmInfoDAO, ref, viewProvider);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmOverviewController(vmInfoDAO, ref, viewProvider));
+        }
+        return controllers.get(ref);
     }
 
     @Override
--- a/vm-profiler/client-swing/src/main/java/com/redhat/thermostat/vm/profiler/client/swing/internal/VmProfileService.java	Fri Dec 16 09:06:40 2016 -0500
+++ b/vm-profiler/client-swing/src/main/java/com/redhat/thermostat/vm/profiler/client/swing/internal/VmProfileService.java	Fri Dec 16 16:57:19 2016 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.vm.profiler.client.swing.internal;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import com.redhat.thermostat.client.command.RequestQueue;
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
@@ -59,6 +62,7 @@
     private RequestQueue queue;
     private VmProfileTreeMapViewProvider treeMapViewProvider;
     private UIDefaults uiDefaults;
+    private Map<VmRef, VmProfileController> controllers = new ConcurrentHashMap<>();
 
     public VmProfileService(ApplicationService service, ProgressNotifier notifier,
             AgentInfoDAO agentInfoDao, VmInfoDAO vmInfoDao, ProfileDAO dao,
@@ -88,8 +92,10 @@
 
     @Override
     public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new VmProfileController(service, notifier, agentInfoDao, vmInfoDao, dao, queue,
-                treeMapViewProvider, ref, uiDefaults);
+        if (controllers.get(ref) == null) {
+            controllers.put(ref, new VmProfileController(service, notifier, agentInfoDao, vmInfoDao, dao, queue, treeMapViewProvider, ref, uiDefaults));
+        }
+        return controllers.get(ref);
     }
 
 }