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
* 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() {
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);
}
}
* 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;
}
}