diff --git a/src/main/java/net/sharksystem/hub/hubside/HubSingleEntityMetrics.java b/src/main/java/net/sharksystem/hub/hubside/HubSingleEntityMetrics.java new file mode 100644 index 0000000..f7e7fef --- /dev/null +++ b/src/main/java/net/sharksystem/hub/hubside/HubSingleEntityMetrics.java @@ -0,0 +1,70 @@ +package net.sharksystem.hub.hubside; + +import net.sharksystem.hub.ASAPHubException; +import net.sharksystem.hub.hubside.metrics.HubLogger; +import net.sharksystem.utils.streams.StreamPair; + +import java.io.IOException; +import java.util.Set; + +/** + * Use this Class as a parent class instead of HubSingleEntity when wanting to use the metrics analyzing tool. + */ + +public abstract class HubSingleEntityMetrics extends HubSingleEntity{ + + private final HubLogger logger = new HubLogger(); + + @Override + public void register(CharSequence peerId, ConnectorInternal hubConnectorSession) { + //logger.writeRegister(peerID); + super.register(peerId, hubConnectorSession); + } + + @Override + public void register(CharSequence peerId, ConnectorInternal hubConnectorSession, boolean canCreateTCPConnections) { + logger.writeRegister(peerId, canCreateTCPConnections); + super.register(peerId, hubConnectorSession, canCreateTCPConnections); + } + + @Override + public void unregister(CharSequence peerId) { + logger.writeUnregister(peerId); + super.unregister(peerId); + } + + @Override + public Set getRegisteredPeers() { + return super.getRegisteredPeers(); + } + + @Override + public boolean isRegistered(CharSequence peerID) { + return super.isRegistered(peerID); + } + + @Override + public void connectionRequest(CharSequence sourcePeerID, CharSequence targetPeerID, int timeout) throws ASAPHubException, IOException { + logger.writeConnectionRequested(sourcePeerID, targetPeerID, timeout); + super.connectionRequest(sourcePeerID, targetPeerID, timeout); + } + + @Override + public void disconnect(CharSequence sourcePeerID, CharSequence targetPeerID) throws ASAPHubException { + logger.writeDisconnected(sourcePeerID, targetPeerID); + super.disconnect(sourcePeerID, targetPeerID); + } + + @Override + public void startDataSession(CharSequence sourcePeerID, CharSequence targetPeerID, StreamPair connection, int timeout) throws ASAPHubException, IOException { + logger.writeStartDataSession(sourcePeerID, targetPeerID, System.currentTimeMillis(), timeout); + super.startDataSession(sourcePeerID, targetPeerID, connection, timeout); + } + + @Override + public void notifyConnectionEnded(CharSequence sourcePeerID, CharSequence targetPeerID, StreamPair connection) throws ASAPHubException { + logger.writeConnectionEnded(sourcePeerID, targetPeerID, System.currentTimeMillis()); + super.notifyConnectionEnded(sourcePeerID, targetPeerID, connection); + } +} + diff --git a/src/main/java/net/sharksystem/hub/hubside/HubSingleEntitySharedChannel.java b/src/main/java/net/sharksystem/hub/hubside/HubSingleEntitySharedChannel.java index 2a733b4..f26f405 100644 --- a/src/main/java/net/sharksystem/hub/hubside/HubSingleEntitySharedChannel.java +++ b/src/main/java/net/sharksystem/hub/hubside/HubSingleEntitySharedChannel.java @@ -10,7 +10,7 @@ /** * Implements hub as a single entity to which connectors can connect. */ -public class HubSingleEntitySharedChannel extends HubSingleEntity implements NewConnectionCreatorListener { +public class HubSingleEntitySharedChannel extends HubSingleEntityMetrics implements NewConnectionCreatorListener { /** * Method is called on the hub by a connector and asks for connection to another peer via its connector. In a * decentralized system like this - look for a registered connector and relay the request. source and target diff --git a/src/main/java/net/sharksystem/hub/hubside/metrics/HubLogger.java b/src/main/java/net/sharksystem/hub/hubside/metrics/HubLogger.java new file mode 100644 index 0000000..1f177dc --- /dev/null +++ b/src/main/java/net/sharksystem/hub/hubside/metrics/HubLogger.java @@ -0,0 +1,61 @@ +package net.sharksystem.hub.hubside.metrics; + +import net.sharksystem.utils.Log; + +public class HubLogger { + + public void logWrite(String logMessage){ + System.out.println(logMessage); + } + + public void writeRegister(CharSequence peerId, boolean canCreateTCPConnections) { + String logMessage = + "[REGISTER] peerId:" + peerId + + "; canCreateTCPConnections:" + canCreateTCPConnections + + "; [/REGISTER]"; + logWrite(logMessage); + } + + public void writeUnregister(CharSequence peerId) { + String logMessage = + "[UNREGISTER] peerId:" + peerId + + "; [/UNREGISTER]"; + logWrite(logMessage); + } + + public void writeStartDataSession(CharSequence source, CharSequence target, long timeStart, int timeout) { + String logMessage = + "[START_DATA_SESSION] source:" + source + + "; target:" + target + + "; timeStart:" + timeStart + + "; timeout:" + timeout + + "; [/START_DATA_SESSION]"; + logWrite(logMessage); + } + + public void writeConnectionRequested(CharSequence source, CharSequence target, int timeout) { + String logMessage = + "[CONNECTION_REQUEST] source:" + source + + "; target:" + target + + "; timeout:" + timeout + + "; [/CONNECTION_REQUEST]"; + logWrite(logMessage); + } + + public void writeConnectionEnded(CharSequence source, CharSequence target, long timeEnd) { + String logMessage = + "[NOTIFY_CONNECTION_ENDED] source:" + source + + "; target:" + target + + "; timeEnd:" + timeEnd + + "; [/NOTIFY_CONNECTION_ENDED]"; + logWrite(logMessage); + } + + public void writeDisconnected(CharSequence source, CharSequence target) { + String logMessage = + "[DISCONNECT] source:" + source + + "; target:" + target + + "; [/DISCONNECT]"; + logWrite(logMessage); + } +} diff --git a/src/main/java/net/sharksystem/hub/hubside/metrics/HubMetricsDecorator.java b/src/main/java/net/sharksystem/hub/hubside/metrics/HubMetricsDecorator.java new file mode 100644 index 0000000..0f9e56f --- /dev/null +++ b/src/main/java/net/sharksystem/hub/hubside/metrics/HubMetricsDecorator.java @@ -0,0 +1,87 @@ +package net.sharksystem.hub.hubside.metrics; + +import net.sharksystem.hub.ASAPHubException; +import net.sharksystem.hub.hubside.ConnectorInternal; +import net.sharksystem.hub.hubside.HubGenericImpl; +import net.sharksystem.hub.hubside.HubInternal; +import net.sharksystem.utils.streams.StreamPair; + +import java.io.IOException; +import java.util.Set; + +/** + * HubMetricsDecorator is a class that can decorate + * any object that implements HubInternal. It acts + * as a man-in-the-middle and relays hub method calls + * without any changes and side effects. This decorator + * implements the same interface (HubInternal) as the class + * it decorates. + */ +public abstract class HubMetricsDecorator extends HubGenericImpl { + + /** + * hubDelegate is the concrete hub instance to be + * decorated. Incoming method calls to this decorator + * instance will be relayed to this delegate instance + * without changed parameters or interfering with the + * delegate in any way. + */ + private final HubInternal hubDelegate; + private final HubLogger logger = new HubLogger(); + + @Override + public void register(CharSequence peerId, ConnectorInternal hubConnectorSession) { + //logger.writeRegister(peerID); + hubDelegate.register(peerId, hubConnectorSession); + } + + @Override + public void register(CharSequence peerId, ConnectorInternal hubConnectorSession, boolean canCreateTCPConnections) { + logger.writeRegister(peerId, canCreateTCPConnections); + hubDelegate.register(peerId, hubConnectorSession, canCreateTCPConnections); + } + + @Override + public void unregister(CharSequence peerId) { + logger.writeUnregister(peerId); + hubDelegate.unregister(peerId); + } + + @Override + public Set getRegisteredPeers() { + return hubDelegate.getRegisteredPeers(); + } + + @Override + public boolean isRegistered(CharSequence peerID) { + return hubDelegate.isRegistered(peerID); + } + + @Override + public void connectionRequest(CharSequence sourcePeerID, CharSequence targetPeerID, int timeout) throws ASAPHubException, IOException { + logger.writeConnectionRequested(sourcePeerID, targetPeerID, timeout); + hubDelegate.connectionRequest(sourcePeerID, targetPeerID, timeout); + } + + @Override + public void disconnect(CharSequence sourcePeerID, CharSequence targetPeerID) throws ASAPHubException { + logger.writeDisconnected(sourcePeerID, targetPeerID); + hubDelegate.disconnect(sourcePeerID, targetPeerID); + } + + @Override + public void startDataSession(CharSequence sourcePeerID, CharSequence targetPeerID, StreamPair connection, int timeout) throws ASAPHubException, IOException { + logger.writeStartDataSession(sourcePeerID, targetPeerID, System.currentTimeMillis(), timeout); + hubDelegate.startDataSession(sourcePeerID, targetPeerID, connection, timeout); + } + + @Override + public void notifyConnectionEnded(CharSequence sourcePeerID, CharSequence targetPeerID, StreamPair connection) throws ASAPHubException { + logger.writeConnectionEnded(sourcePeerID, targetPeerID, System.currentTimeMillis()); + hubDelegate.notifyConnectionEnded(sourcePeerID, targetPeerID, connection); + } + + public HubMetricsDecorator(HubInternal hubDelegate) { + this.hubDelegate = hubDelegate; + } +}