changeset 526:6e4c7c35e74c

Remove duplicate extension registry listener code Reviewed-by: vanaltj Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-August/002598.html
author Omair Majid <omajid@redhat.com>
date Tue, 07 Aug 2012 12:53:52 -0400
parents 54f32680a6b8
children 9e9ea30d930d
files client/core/src/main/java/com/redhat/thermostat/client/internal/MainWindowControllerImpl.java
diffstat 1 files changed, 49 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/client/core/src/main/java/com/redhat/thermostat/client/internal/MainWindowControllerImpl.java	Mon Aug 06 14:49:07 2012 +0200
+++ b/client/core/src/main/java/com/redhat/thermostat/client/internal/MainWindowControllerImpl.java	Tue Aug 07 12:53:52 2012 -0400
@@ -90,11 +90,11 @@
 public class MainWindowControllerImpl implements MainWindowController {
 
     private static final Logger logger = LoggingUtils.getLogger(MainWindowControllerImpl.class);
-    
-    private List<HostFilter> hostFilters;
-    private List<VmFilter> vmFilters;
-    
-    private List<VmDecorator> vmTreeDecorators;
+
+    private final CopyOnWriteArrayList<HostFilter> hostFilters = new CopyOnWriteArrayList<>();
+    private final CopyOnWriteArrayList<VmFilter> vmFilters = new CopyOnWriteArrayList<>();
+
+    private final CopyOnWriteArrayList<VmDecorator> vmTreeDecorators = new CopyOnWriteArrayList<>();
 
     private Timer backgroundUpdater;
 
@@ -107,8 +107,6 @@
 
     private UiFacadeFactory facadeFactory;
 
-    // FIXME: sort out the code duplication in the registry listeners
-
     private MenuRegistry menuRegistry;
     private ActionListener<ThermostatExtensionRegistry.Action> menuListener =
             new ActionListener<ThermostatExtensionRegistry.Action>()
@@ -139,88 +137,12 @@
     private VmFilterRegistry vmFilterRegistry;
     private HostFilterRegistry hostFilterRegistry;
 
-    private ActionListener<ThermostatExtensionRegistry.Action> hostFilterListener =
-            new ActionListener<ThermostatExtensionRegistry.Action>()
-    {
-        @Override
-        public void actionPerformed(ActionEvent<com.redhat.thermostat.client.internal.ThermostatExtensionRegistry.Action>
-                                    actionEvent)
-        {
-            HostFilter filter = (HostFilter) actionEvent.getPayload();
-
-            switch (actionEvent.getActionId()) {
-            case SERVICE_ADDED:
-                hostFilters.add(filter);
-                doUpdateTreeAsync();
-                break;
-
-            case SERVICE_REMOVED:
-                hostFilters.remove(filter);
-                doUpdateTreeAsync();
-                break;
-
-            default:
-                logger.log(Level.WARNING, "received unknown event from VMTreeFilterRegistry: " +
-                                           actionEvent.getActionId());
-                break;
-            }
-        }
-    };
+    private ActionListener<ThermostatExtensionRegistry.Action> hostFilterListener = new UpdateListAndTree<>(HostFilter.class, hostFilters);
+    private ActionListener<ThermostatExtensionRegistry.Action> vmFilterListener = new UpdateListAndTree<>(VmFilter.class, vmFilters);
 
-    private ActionListener<ThermostatExtensionRegistry.Action> vmFilterListener =
-            new ActionListener<ThermostatExtensionRegistry.Action>()
-    {
-        @Override
-        public void actionPerformed(ActionEvent<com.redhat.thermostat.client.internal.ThermostatExtensionRegistry.Action>
-                                    actionEvent)
-        {
-            VmFilter filter = (VmFilter) actionEvent.getPayload();
-            
-            switch (actionEvent.getActionId()) {
-            case SERVICE_ADDED:
-                vmFilters.add(filter);
-                doUpdateTreeAsync();
-                break;
-            
-            case SERVICE_REMOVED:
-                vmFilters.remove(filter);
-                doUpdateTreeAsync();
-                break;
-                
-            default:
-                logger.log(Level.WARNING, "received unknown event from VMTreeFilterRegistry: " +
-                                           actionEvent.getActionId());
-                break;
-            }
-        }
-    };
-    
     private VMTreeDecoratorRegistry decoratorRegistry;
-    private ActionListener<ThermostatExtensionRegistry.Action> decoratorListener =
-            new ActionListener<ThermostatExtensionRegistry.Action> ()
-    {
-        public void actionPerformed(com.redhat.thermostat.common.ActionEvent<ThermostatExtensionRegistry.Action>
-                                    actionEvent)
-        {
-            VmDecorator decorator = (VmDecorator) actionEvent.getPayload();
-            switch (actionEvent.getActionId()) {
-            case SERVICE_ADDED:
-                vmTreeDecorators.add(decorator);
-                doUpdateTreeAsync();
-                break;
-            
-            case SERVICE_REMOVED:
-                vmTreeDecorators.remove(decorator);
-                doUpdateTreeAsync();
-                break;
-                
-            default:
-                logger.log(Level.WARNING, "received unknown event from ReferenceDecorator: " +
-                                           actionEvent.getActionId());
-                break;
-            }
-        };
-    };
+
+    private ActionListener<ThermostatExtensionRegistry.Action> vmDecoratorListener = new UpdateListAndTree<>(VmDecorator.class, vmTreeDecorators);
 
     private VMInformationRegistry vmInfoRegistry;
     private ActionListener<ThermostatExtensionRegistry.Action> vmInfoRegistryListener =
@@ -250,10 +172,6 @@
             throw new RuntimeException(e);
         }
 
-        vmTreeDecorators = new CopyOnWriteArrayList<>();
-        
-        hostFilters = new CopyOnWriteArrayList<>();
-        vmFilters = new CopyOnWriteArrayList<>();
         searchFilter = new HostVmFilter();
         hostFilters.add(searchFilter);
         vmFilters.add(searchFilter);
@@ -284,7 +202,7 @@
         vmFilterRegistry.addActionListener(vmFilterListener);
         vmFilterRegistry.start();
 
-        decoratorRegistry.addActionListener(decoratorListener);
+        decoratorRegistry.addActionListener(vmDecoratorListener);
         decoratorRegistry.start();
         
         vmInfoRegistry.addActionListener(vmInfoRegistryListener);
@@ -490,6 +408,45 @@
         }
     }
 
+    private class UpdateListAndTree<T> implements ActionListener<ThermostatExtensionRegistry.Action> {
+
+        private final Class<T> extensionClass;
+        private final CopyOnWriteArrayList<T> extensionList;
+
+        public UpdateListAndTree(Class<T> extensionClass, CopyOnWriteArrayList<T> addRemoveExtensionsFrom) {
+            this.extensionClass = extensionClass;
+            this.extensionList = addRemoveExtensionsFrom;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent<com.redhat.thermostat.client.internal.ThermostatExtensionRegistry.Action> actionEvent) {
+
+            Object payload = actionEvent.getPayload();
+            if (!extensionClass.isInstance(payload)) {
+                throw new IllegalArgumentException("invalid payload type");
+            }
+
+            T filter = (T) payload;
+
+            switch (actionEvent.getActionId()) {
+            case SERVICE_ADDED:
+                extensionList.add(filter);
+                doUpdateTreeAsync();
+                break;
+
+            case SERVICE_REMOVED:
+                extensionList.remove(filter);
+                doUpdateTreeAsync();
+                break;
+
+            default:
+                logger.log(Level.WARNING, "received unknown event from ExtensionRegistry: " +
+                                           actionEvent.getActionId());
+                break;
+            }
+        }
+    }
+
     private class VmInformationControllerProvider {
         private VmInformationController lastSelectedVM;
         private Map<VmRef, Integer> selectedForVM = new ConcurrentHashMap<>();