ServerManagement: user control of multicast announcements
authorTJ <hacker@iam.tj>
Mon, 4 May 2015 16:26:44 +0000 (17:26 +0100)
committerTJ <hacker@iam.tj>
Mon, 4 May 2015 16:26:44 +0000 (17:26 +0100)
Add menu item to Log menu allowing user to control multicast announcement
of the Log service.

Refactor the ActionListener and Timer to better reflect its use for performing
unrelated regular tasks.

src/uk/ac/ntu/n0521366/wsyd/management/ServerManagement.form
src/uk/ac/ntu/n0521366/wsyd/management/ServerManagement.java

index c1ed78a..3d3ba16 100644 (file)
                 <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="gMenuLogAutoScrollActionPerformed"/>
               </Events>
             </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="gMenuLogServiceAnnounce">
+              <Properties>
+                <Property name="selected" type="boolean" value="true"/>
+                <Property name="text" type="java.lang.String" value="Multicast Announce"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="gMenuLogServiceAnnounceActionPerformed"/>
+              </Events>
+            </MenuItem>
           </SubComponents>
         </Menu>
         <Menu class="javax.swing.JMenu" name="gMenuServers">
index 2fb2938..fc20cb7 100644 (file)
@@ -114,7 +114,7 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
     /**
      * Regular presence announcements
      */
-    Timer multicastAnnounce;
+    Timer regularTasks;
     
     /**
      * Creates new GUI
@@ -143,7 +143,8 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
     public ServerManagement(boolean multicastAnnouncements, InetAddress serverSocial) {
         this();
         this._multicastAnnouncements = multicastAnnouncements;
-        // TODO: implement constructor setting IP address of SocialServer from command-line value - needs ServiceToHostMap separating from NetworkServerAbstract and do not allow manually added service map element being treated as stale
+        gMenuLogServiceAnnounce.setSelected(_multicastAnnouncements);
+        // TODO: implement constructor setting IP address of SocialServer from command-line value
     }
     /**
      * Initialise listeners and other objects that require a reference to 'this'.
@@ -175,47 +176,58 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
         // permit broadcasting to pseudo-host 'all' since this is multicast
         _serviceToAddressMap.put("all", new LastSeenHost(new InetSocketAddress(Network.MULTICAST_IP, Network.PORTS_MULTICAST_DISCOVERY), LastSeenHost.STATE.STATIC));
         
-        if (this._multicastAnnouncements) {
-            ActionListener multicastAnnounceActionListener = new ActionListener() {
-                /**
-                 * Activated by timer events to send multi-cast neighbour
-                 * announcements for the Log Service.
-                 *
-                 * @param e
-                 */
-                @Override
-                public void actionPerformed(ActionEvent e) {
+        ActionListener regularTasksActionListener = new ActionListener() {
+            // provide a way to read the current version of the parent process object's fields
+            ServerManagement owner;
+            
+            // XXX: Anonymous class initialisation - effectively used as the body of the object's constructor
+            {
+                // XXX: access to the outer class's instance object
+                owner = ServerManagement.this;
+            }
+
+            /**
+             * Activated by timer events to send multi-cast neighbour
+             * announcements for the Log Service.
+             *
+             * @param e
+             */
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                String serviceName  = "LogService";
+                // check the current value ofthe parent process' flag
+                if (owner._multicastAnnouncements) {
                     // Create local log report first
                     LogRecord record = new LogRecord(Level.FINEST, "Multicast: Announcing Presence");
-                    record.setSourceClassName("ServerLog");
+                    record.setSourceClassName(serviceName);
                     record.setMillis(System.currentTimeMillis());
                     LOGGER.log(record);
 
-                    // Announce the Log Server service
-                    MessagePresence mp = new MessagePresence(_title + "Log", _udpLogService.getSocketAddress());
+                    // Announce the log service
+                    MessagePresence mp = new MessagePresence(_title + serviceName, _udpLogService.getSocketAddress());
                     NetworkMessage nm = NetworkMessage.createNetworkMessage("Neighbour", "all", mp);
-                    nm.setSender(_title + "Log");
+                    nm.setSender(_title + serviceName);
                     _multicastServer.queueMessage(nm);
-
-                    // clean up the known hosts map and keep Server menu up-to-date
-                    ArrayList<String> servicesRemoved =  _serviceToAddressMap.cleanServiceAddressMap(5000);
-                    for (String service : servicesRemoved) {
-                        switch (service) {
-                            case "ServerSocial":
-                                gMenuServerSocial.setEnabled(false);
-                                break;
-                            case "ServerChat":
-                                gMenuServerChat.setEnabled(false);
-                                break;
-                        }
+                }
+                // clean up the known hosts map
+                ArrayList<String> servicesRemoved = _serviceToAddressMap.cleanServiceAddressMap(5000);
+                //  keep Server menu up-to-date
+                for (String service : servicesRemoved) {
+                    switch (service) {
+                        case "ServerSocial":
+                            gMenuServerSocial.setEnabled(false);
+                            break;
+                        case "ServerChat":
+                            gMenuServerChat.setEnabled(false);
+                            break;
                     }
-
                 }
-            };
-            multicastAnnounce = new Timer(1000, multicastAnnounceActionListener);
-            multicastAnnounce.setInitialDelay(100);
-            multicastAnnounce.start();
-        }
+
+            }
+        };
+        regularTasks = new Timer(1000, regularTasksActionListener);
+        regularTasks.setInitialDelay(100);
+        regularTasks.start();
         
         return this;
     }
@@ -305,6 +317,7 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
         gMenuLogClear = new javax.swing.JMenuItem();
         gMenuLogControl = new javax.swing.JCheckBoxMenuItem();
         gMenuLogAutoScroll = new javax.swing.JCheckBoxMenuItem();
+        gMenuLogServiceAnnounce = new javax.swing.JCheckBoxMenuItem();
         gMenuServers = new javax.swing.JMenu();
         gMenuServerSocial = new javax.swing.JMenu();
         gMenuServerSocialRestart = new javax.swing.JMenuItem();
@@ -439,6 +452,15 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
         });
         gMenuLog.add(gMenuLogAutoScroll);
 
+        gMenuLogServiceAnnounce.setSelected(true);
+        gMenuLogServiceAnnounce.setText("Multicast Announce");
+        gMenuLogServiceAnnounce.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                gMenuLogServiceAnnounceActionPerformed(evt);
+            }
+        });
+        gMenuLog.add(gMenuLogServiceAnnounce);
+
         gMenuBar.add(gMenuLog);
 
         gMenuServers.setText("Servers");
@@ -595,6 +617,14 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
         gMenuLogAutoScroll.setSelected(_autoScroll);
     }//GEN-LAST:event_gMenuLogAutoScrollActionPerformed
 
+    /**
+     * Enable or disable multicast log service announcements.
+     * @param evt 
+     */
+    private void gMenuLogServiceAnnounceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gMenuLogServiceAnnounceActionPerformed
+        this._multicastAnnouncements = gMenuLogServiceAnnounce.isSelected();
+    }//GEN-LAST:event_gMenuLogServiceAnnounceActionPerformed
+
     /**
      * Receive a NetworkMessageEvent and dispose of it
      * @param event
@@ -715,6 +745,7 @@ public class ServerManagement extends javax.swing.JFrame implements NetworkMessa
     private javax.swing.JCheckBoxMenuItem gMenuLogAutoScroll;
     private javax.swing.JMenuItem gMenuLogClear;
     private javax.swing.JCheckBoxMenuItem gMenuLogControl;
+    private javax.swing.JCheckBoxMenuItem gMenuLogServiceAnnounce;
     private javax.swing.JMenu gMenuServerChat;
     private javax.swing.JMenuItem gMenuServerChatRestart;
     private javax.swing.JMenuItem gMenuServerChatStop;