X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Ffcp%2FFcpConnection.java;h=d1a1be7cb17d4ea03847568f46ed3f592c4eb47c;hb=b188a5d4f66c1bc99d5e9695f97fe317393da931;hp=1af3bab3c9f55b4cde3c3baa6d5ad22cadaae01f;hpb=f553531be78d6d6d95dc152728f2b8d40242b57d;p=jFCPlib.git
diff --git a/src/net/pterodactylus/fcp/FcpConnection.java b/src/net/pterodactylus/fcp/FcpConnection.java
index 1af3bab..d1a1be7 100644
--- a/src/net/pterodactylus/fcp/FcpConnection.java
+++ b/src/net/pterodactylus/fcp/FcpConnection.java
@@ -19,6 +19,7 @@
package net.pterodactylus.fcp;
+import java.io.Closeable;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -31,14 +32,18 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.logging.Logger;
/**
* An FCP connection to a Freenet node.
- *
+ *
* @author David âBombeâ Roden <bombe@freenetproject.org>
* @version $Id$
*/
-public class FcpConnection {
+public class FcpConnection implements Closeable {
+
+ /** Logger. */
+ private static final Logger logger = Logger.getLogger(FcpConnection.class.getName());
/** The default port for FCP v2. */
public static final int DEFAULT_PORT = 9481;
@@ -70,7 +75,7 @@ public class FcpConnection {
/**
* Creates a new FCP connection to the freenet node running on localhost,
* using the default port.
- *
+ *
* @throws UnknownHostException
* if the hostname can not be resolved
*/
@@ -81,7 +86,7 @@ public class FcpConnection {
/**
* Creates a new FCP connection to the Freenet node running on the given
* host, listening on the default port.
- *
+ *
* @param host
* The hostname of the Freenet node
* @throws UnknownHostException
@@ -94,7 +99,7 @@ public class FcpConnection {
/**
* Creates a new FCP connection to the Freenet node running on the given
* host, listening on the given port.
- *
+ *
* @param host
* The hostname of the Freenet node
* @param port
@@ -109,7 +114,7 @@ public class FcpConnection {
/**
* Creates a new FCP connection to the Freenet node running at the given
* address, listening on the default port.
- *
+ *
* @param address
* The address of the Freenet node
*/
@@ -120,7 +125,7 @@ public class FcpConnection {
/**
* Creates a new FCP connection to the Freenet node running at the given
* address, listening on the given port.
- *
+ *
* @param address
* The address of the Freenet node
* @param port
@@ -137,7 +142,7 @@ public class FcpConnection {
/**
* Adds the given listener to the list of listeners.
- *
+ *
* @param fcpListener
* The listener to add
*/
@@ -147,7 +152,7 @@ public class FcpConnection {
/**
* Removes the given listener from the list of listeners.
- *
+ *
* @param fcpListener
* The listener to remove
*/
@@ -157,7 +162,7 @@ public class FcpConnection {
/**
* Notifies listeners that a âNodeHelloâ message was received.
- *
+ *
* @see FcpListener#receivedNodeHello(FcpConnection, NodeHello)
* @param nodeHello
* The âNodeHelloâ message
@@ -171,7 +176,7 @@ public class FcpConnection {
/**
* Notifies listeners that a âCloseConnectionDuplicateClientNameâ message
* was received.
- *
+ *
* @see FcpListener#receivedCloseConnectionDuplicateClientName(FcpConnection,
* CloseConnectionDuplicateClientName)
* @param closeConnectionDuplicateClientName
@@ -185,7 +190,7 @@ public class FcpConnection {
/**
* Notifies listeners that a âSSKKeypairâ message was received.
- *
+ *
* @see FcpListener#receivedSSKKeypair(FcpConnection, SSKKeypair)
* @param sskKeypair
* The âSSKKeypairâ message
@@ -198,7 +203,7 @@ public class FcpConnection {
/**
* Notifies listeners that a âPeerâ message was received.
- *
+ *
* @see FcpListener#receivedPeer(FcpConnection, Peer)
* @param peer
* The âPeerâ message
@@ -211,7 +216,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âEndListPeersâ message was received.
- *
+ *
* @see FcpListener#receivedEndListPeers(FcpConnection, EndListPeers)
* @param endListPeers
* The âEndListPeersâ message
@@ -224,7 +229,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPeerNoteâ message was received.
- *
+ *
* @see FcpListener#receivedPeerNote(FcpConnection, PeerNote)
* @param peerNote
*/
@@ -236,7 +241,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âEndListPeerNotesâ message was received.
- *
+ *
* @see FcpListener#receivedEndListPeerNotes(FcpConnection,
* EndListPeerNotes)
* @param endListPeerNotes
@@ -250,7 +255,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPeerRemovedâ message was received.
- *
+ *
* @see FcpListener#receivedPeerRemoved(FcpConnection, PeerRemoved)
* @param peerRemoved
* The âPeerRemovedâ message
@@ -263,7 +268,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âNodeDataâ message was received.
- *
+ *
* @see FcpListener#receivedNodeData(FcpConnection, NodeData)
* @param nodeData
* The âNodeDataâ message
@@ -276,7 +281,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âTestDDAReplyâ message was received.
- *
+ *
* @see FcpListener#receivedTestDDAReply(FcpConnection, TestDDAReply)
* @param testDDAReply
* The âTestDDAReplyâ message
@@ -289,7 +294,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âTestDDACompleteâ message was received.
- *
+ *
* @see FcpListener#receivedTestDDAComplete(FcpConnection, TestDDAComplete)
* @param testDDAComplete
* The âTestDDACompleteâ message
@@ -302,7 +307,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPersistentGetâ message was received.
- *
+ *
* @see FcpListener#receivedPersistentGet(FcpConnection, PersistentGet)
* @param persistentGet
* The âPersistentGetâ message
@@ -315,7 +320,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPersistentPutâ message was received.
- *
+ *
* @see FcpListener#receivedPersistentPut(FcpConnection, PersistentPut)
* @param persistentPut
* The âPersistentPutâ message
@@ -329,7 +334,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âEndListPersistentRequestsâ message was
* received.
- *
+ *
* @see FcpListener#receivedEndListPersistentRequests(FcpConnection,
* EndListPersistentRequests)
* @param endListPersistentRequests
@@ -343,7 +348,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âURIGeneratedâ message was received.
- *
+ *
* @see FcpListener#receivedURIGenerated(FcpConnection, URIGenerated)
* @param uriGenerated
* The âURIGeneratedâ message
@@ -356,7 +361,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âDataFoundâ message was received.
- *
+ *
* @see FcpListener#receivedDataFound(FcpConnection, DataFound)
* @param dataFound
* The âDataFoundâ message
@@ -369,7 +374,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âAllDataâ message was received.
- *
+ *
* @see FcpListener#receivedAllData(FcpConnection, AllData)
* @param allData
* The âAllDataâ message
@@ -382,7 +387,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âSimpleProgressâ message was received.
- *
+ *
* @see FcpListener#receivedSimpleProgress(FcpConnection, SimpleProgress)
* @param simpleProgress
* The âSimpleProgressâ message
@@ -395,7 +400,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âStartedCompressionâ message was received.
- *
+ *
* @see FcpListener#receivedStartedCompression(FcpConnection,
* StartedCompression)
* @param startedCompression
@@ -409,7 +414,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âFinishedCompressionâ message was received.
- *
+ *
* @see FcpListener#receviedFinishedCompression(FcpConnection,
* FinishedCompression)
* @param finishedCompression
@@ -424,7 +429,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âUnknownPeerNoteTypeâ message was
* received.
- *
+ *
* @see FcpListener#receivedUnknownPeerNoteType(FcpConnection,
* UnknownPeerNoteType)
* @param unknownPeerNoteType
@@ -439,7 +444,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âUnknownNodeIdentifierâ message was
* received.
- *
+ *
* @see FcpListener#receivedUnknownNodeIdentifier(FcpConnection,
* UnknownNodeIdentifier)
* @param unknownNodeIdentifier
@@ -453,7 +458,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âConfigDataâ message was received.
- *
+ *
* @see FcpListener#receivedConfigData(FcpConnection, ConfigData)
* @param configData
* The âConfigDataâ message
@@ -466,7 +471,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âGetFailedâ message was received.
- *
+ *
* @see FcpListener#receivedGetFailed(FcpConnection, GetFailed)
* @param getFailed
* The âGetFailedâ message
@@ -479,7 +484,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPutFailedâ message was received.
- *
+ *
* @see FcpListener#receivedPutFailed(FcpConnection, PutFailed)
* @param putFailed
* The âPutFailedâ message
@@ -493,7 +498,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âIdentifierCollisionâ message was
* received.
- *
+ *
* @see FcpListener#receivedIdentifierCollision(FcpConnection,
* IdentifierCollision)
* @param identifierCollision
@@ -507,7 +512,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âPersistentPutDirâ message was received.
- *
+ *
* @see FcpListener#receivedPersistentPutDir(FcpConnection,
* PersistentPutDir)
* @param persistentPutDir
@@ -522,7 +527,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPersistentRequestRemovedâ message was
* received.
- *
+ *
* @see FcpListener#receivedPersistentRequestRemoved(FcpConnection,
* PersistentRequestRemoved)
* @param persistentRequestRemoved
@@ -536,7 +541,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âSubscribedUSKUpdateâ message was received.
- *
+ *
* @see FcpListener#receivedSubscribedUSKUpdate(FcpConnection,
* SubscribedUSKUpdate)
* @param subscribedUSKUpdate
@@ -550,7 +555,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPluginInfoâ message was received.
- *
+ *
* @see FcpListener#receivedPluginInfo(FcpConnection, PluginInfo)
* @param pluginInfo
* The âPluginInfoâ message
@@ -563,7 +568,7 @@ public class FcpConnection {
/**
* Notifies all listeners that an âFCPPluginReplyâ message was received.
- *
+ *
* @see FcpListener#receivedFCPPluginReply(FcpConnection, FCPPluginReply)
* @param fcpPluginReply
* The âFCPPluginReplyâ message
@@ -577,7 +582,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPersistentRequestModifiedâ message was
* received.
- *
+ *
* @see FcpListener#receivedPersistentRequestModified(FcpConnection,
* PersistentRequestModified)
* @param persistentRequestModified
@@ -591,7 +596,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPutSuccessfulâ message was received.
- *
+ *
* @see FcpListener#receivedPutSuccessful(FcpConnection, PutSuccessful)
* @param putSuccessful
* The âPutSuccessfulâ message
@@ -604,7 +609,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âPutFetchableâ message was received.
- *
+ *
* @see FcpListener#receivedPutFetchable(FcpConnection, PutFetchable)
* @param putFetchable
* The âPutFetchableâ message
@@ -617,7 +622,7 @@ public class FcpConnection {
/**
* Notifies all listeners that a âProtocolErrorâ message was received.
- *
+ *
* @see FcpListener#receivedProtocolError(FcpConnection, ProtocolError)
* @param protocolError
* The âProtocolErrorâ message
@@ -630,7 +635,7 @@ public class FcpConnection {
/**
* Notifies all registered listeners that a message has been received.
- *
+ *
* @see FcpListener#receivedMessage(FcpConnection, FcpMessage)
* @param fcpMessage
* The message that was received
@@ -643,12 +648,15 @@ public class FcpConnection {
/**
* Notifies all listeners that the connection to the node was closed.
- *
- * @see FcpListener#connectionClosed(FcpConnection)
+ *
+ * @param throwable
+ * The exception that caused the disconnect, or null
+ * if there was no exception
+ * @see FcpListener#connectionClosed(FcpConnection, Throwable)
*/
- private void fireConnectionClosed() {
+ private void fireConnectionClosed(Throwable throwable) {
for (FcpListener fcpListener: fcpListeners) {
- fcpListener.connectionClosed(this);
+ fcpListener.connectionClosed(this, throwable);
}
}
@@ -658,7 +666,7 @@ public class FcpConnection {
/**
* Connects to the node.
- *
+ *
* @throws IOException
* if an I/O error occurs
* @throws IllegalStateException
@@ -668,6 +676,7 @@ public class FcpConnection {
if (connectionHandler != null) {
throw new IllegalStateException("already connected, disconnect first");
}
+ logger.info("connecting to " + address + ":" + port + "â¦");
remoteSocket = new Socket(address, port);
remoteInputStream = remoteSocket.getInputStream();
remoteOutputStream = remoteSocket.getOutputStream();
@@ -677,26 +686,32 @@ public class FcpConnection {
/**
* Disconnects from the node. If there is no connection to the node, this
* method does nothing.
+ *
+ * @deprecated Use {@link #close()} instead
*/
+ @Deprecated
public synchronized void disconnect() {
- if (connectionHandler == null) {
- return;
- }
- FcpUtils.close(remoteSocket);
- connectionHandler.stop();
- connectionHandler = null;
+ close();
+ }
+
+ /**
+ * Closes the connection. If there is no connection to the node, this method
+ * does nothing.
+ */
+ public void close() {
+ handleDisconnect(null);
}
/**
* Sends the given FCP message.
- *
+ *
* @param fcpMessage
* The FCP message to send
* @throws IOException
* if an I/O error occurs
*/
public synchronized void sendMessage(FcpMessage fcpMessage) throws IOException {
- System.out.println("sending message: " + fcpMessage.getName());
+ logger.fine("sending message: " + fcpMessage.getName());
fcpMessage.write(remoteOutputStream);
}
@@ -707,11 +722,12 @@ public class FcpConnection {
/**
* Handles the given message, notifying listeners. This message should only
* be called by {@link FcpConnectionHandler}.
- *
+ *
* @param fcpMessage
* The received message
*/
void handleMessage(FcpMessage fcpMessage) {
+ logger.fine("received message: " + fcpMessage.getName());
String messageName = fcpMessage.getName();
countMessage(messageName);
if ("SimpleProgress".equals(messageName)) {
@@ -803,13 +819,20 @@ public class FcpConnection {
/**
* Handles a disconnect from the node.
+ *
+ * @param throwable
+ * The exception that caused the disconnect, or null
+ * if there was no exception
*/
- synchronized void handleDisconnect() {
+ synchronized void handleDisconnect(Throwable throwable) {
FcpUtils.close(remoteInputStream);
FcpUtils.close(remoteOutputStream);
FcpUtils.close(remoteSocket);
- connectionHandler = null;
- fireConnectionClosed();
+ if (connectionHandler != null) {
+ connectionHandler.stop();
+ connectionHandler = null;
+ fireConnectionClosed(throwable);
+ }
}
//
@@ -819,7 +842,7 @@ public class FcpConnection {
/**
* Incremets the counter in {@link #incomingMessageStatistics} by 1
* for the given message name.
- *
+ *
* @param name
* The name of the message to count
*/
@@ -829,11 +852,12 @@ public class FcpConnection {
oldValue = incomingMessageStatistics.get(name);
}
incomingMessageStatistics.put(name, oldValue + 1);
+ logger.finest("count for " + name + ": " + (oldValue + 1));
}
/**
* Returns a limited input stream from the nodeâs input stream.
- *
+ *
* @param dataLength
* The length of the stream
* @return The limited input stream
@@ -848,7 +872,7 @@ public class FcpConnection {
/**
* A wrapper around an {@link InputStream} that only supplies a limit number
* of bytes from the underlying input stream.
- *
+ *
* @author David Roden
* @version $Id$
*/
@@ -860,7 +884,7 @@ public class FcpConnection {
/**
* Creates a new LimitedInputStream that supplies at most
* length
bytes from the given input stream.
- *
+ *
* @param inputStream
* The input stream
* @param length
@@ -925,7 +949,7 @@ public class FcpConnection {
/**
* {@inheritDoc} This method does nothing, as {@link #mark(int)} and
* {@link #reset()} are not supported.
- *
+ *
* @see java.io.FilterInputStream#mark(int)
*/
@Override
@@ -935,7 +959,7 @@ public class FcpConnection {
/**
* {@inheritDoc}
- *
+ *
* @see java.io.FilterInputStream#markSupported()
* @return false
*/
@@ -947,7 +971,7 @@ public class FcpConnection {
/**
* {@inheritDoc} This method does nothing, as {@link #mark(int)} and
* {@link #reset()} are not supported.
- *
+ *
* @see java.io.FilterInputStream#reset()
*/
@Override
@@ -958,7 +982,7 @@ public class FcpConnection {
/**
* Consumes the input stream, i.e. read all bytes until the limit is
* reached.
- *
+ *
* @throws IOException
* if an I/O error occurs
*/