PacketHandler: support changing sender ID and tagging outgoing messages
authorEddie <dev@fun2be.me>
Sat, 6 Jun 2015 10:00:17 +0000 (11:00 +0100)
committerEddie <dev@fun2be.me>
Sat, 6 Jun 2015 10:00:17 +0000 (11:00 +0100)
src/uk/ac/ntu/n0521366/wsyd/libs/logging/PacketHandler.java

index 8bd688d..f3155f6 100644 (file)
 package uk.ac.ntu.n0521366.wsyd.libs.logging;
 
 import java.io.IOException;
-import java.util.logging.LogRecord;
-import java.util.logging.Handler;
-import java.util.logging.ErrorManager;
 import java.net.InetSocketAddress;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
+import java.util.logging.LogRecord;
+import java.util.logging.Handler;
+import java.util.logging.ErrorManager;
 import uk.ac.ntu.n0521366.wsyd.libs.message.MessageLogRecord;
+import uk.ac.ntu.n0521366.wsyd.libs.net.Network;
 import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkMessage;
 
 /**
  * Publish log records over UDP encapsulated in a NetworkMessage.
  *
- * Sends the records to a remote NetworkServerUDP service.
+ * Sends the records to a remote {@see uk.ac.ntu.n0521366.wsyd.libs.net.NetworkServerUDP} service.
  *
  * @see java.util.logging.Handler
  * @see uk.ac.ntu.n0521366.wsyd.libs.net.NetworkMessage
@@ -48,6 +49,17 @@ public class PacketHandler extends Handler {
      * Where to send the log record
      */
     private final InetSocketAddress _socketAddress;
+    
+    private final String _intent;
+    private final String _target;
+    /**
+     * Name of the sending service or user.
+     */
+    private String _source;
+    
+    static String LOG_SOURCE = "PacketHandler";
+    static String LOG_INTENT = "Log";
+    static String LOG_SERVICE = "LogService";
 
     @Override
     public void close() {
@@ -73,24 +85,21 @@ public class PacketHandler extends Handler {
             return;
         }
         MessageLogRecord m = new MessageLogRecord(record);
-        NetworkMessage nm = NetworkMessage.createNetworkMessage("Log", "ServerLog", m);
-        try {
-            byte[] data = NetworkMessage.serialize(nm);
-            DatagramPacket packetMessage = new DatagramPacket(data, data.length);
+        NetworkMessage nm = NetworkMessage.createNetworkMessage(_intent, _target, m);
+        nm.setSender(_source);
+        byte[] data = NetworkMessage.serialize(nm);
+        DatagramPacket packetMessage = new DatagramPacket(data, data.length);
 
-            // set remote log server host address and port
-            packetMessage.setSocketAddress(this._socketAddress);
+        // set remote log server host address and port
+        packetMessage.setSocketAddress(this._socketAddress);
 
-            try (
-                DatagramSocket datagramSocket = new DatagramSocket(_socketAddress.getPort(), _socketAddress.getAddress())
-            )
-            {
-                datagramSocket.send(packetMessage);
-            } catch (IOException e ) {
-                reportError("Unable to create UDP socket", e, ErrorManager.WRITE_FAILURE);
-            }
-        } catch (IOException e) {
-            reportError("Unable to serialize NetworkMessage", e, ErrorManager.WRITE_FAILURE);
+        try (
+            DatagramSocket datagramSocket = new DatagramSocket(Network.PORTS_EPHEMERAL, Network.IPv4_WILDCARD)
+        )
+        {
+            datagramSocket.send(packetMessage);
+        } catch (IOException e ) {
+            reportError("Unable to create UDP socket", e, ErrorManager.WRITE_FAILURE);
         }
     }
 
@@ -98,8 +107,35 @@ public class PacketHandler extends Handler {
      * Create a handler that sends log records to a UDP log service.
      * 
      * @param logService address of the target log service
+     * @param intent The intent to deliver to (defaults to "Log")
+     * @param target name of the target service
+     * @param source name of the source service
      */
-    public PacketHandler(InetSocketAddress logService) {
+    public PacketHandler(InetSocketAddress logService, String intent, String target, String source) throws NullPointerException {
+        if (logService == null)
+            throw new NullPointerException("logService address cannot be null");
         this._socketAddress = logService;
+        this._intent = intent != null ? intent : LOG_INTENT;
+        this._target = target != null ? target : LOG_SERVICE;
+        this._source = source != null ? source : LOG_SOURCE;
+    }
+    
+    /**
+     * Change the sender name set on outgoing NetworkMessages.
+     * @param newSource the new sender name
+     * @return the original sender name
+     */
+    public String setSource(String newSource) {
+        String oldSource = _source;
+        _source = newSource != null ? newSource : _source;
+        return oldSource;
+    }
+    
+    /**
+     * Get the current sender name.
+     * @return the current sender name
+     */
+    public String getSource() {
+        return _source;
     }
 }