ServerManagement: user control of multicast announcements
[WeStealzYourDataz.git] / src / uk / ac / ntu / n0521366 / wsyd / management / ServerManagement.java
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;