import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import net.pterodactylus.fcp.AddPeer;
import net.pterodactylus.fcp.ClientHello;
import net.pterodactylus.fcp.CloseConnectionDuplicateClientName;
+import net.pterodactylus.fcp.EndListPeerNotes;
import net.pterodactylus.fcp.EndListPeers;
import net.pterodactylus.fcp.FcpAdapter;
import net.pterodactylus.fcp.FcpConnection;
import net.pterodactylus.fcp.ListPeerNotes;
import net.pterodactylus.fcp.ListPeers;
import net.pterodactylus.fcp.ModifyPeer;
+import net.pterodactylus.fcp.ModifyPeerNote;
import net.pterodactylus.fcp.NodeHello;
import net.pterodactylus.fcp.NodeRef;
import net.pterodactylus.fcp.Peer;
* if an FCP error occurs
*/
public void connect() throws IOException, FcpException {
- ExtendedFcpAdapter fcpListener = new ExtendedFcpAdapter() {
+ new ExtendedFcpAdapter() {
/**
* {@inheritDoc}
public void receivedNodeHello(FcpConnection fcpConnection, NodeHello nodeHello) {
completionLatch.countDown();
}
- };
- fcpListener.execute();
+ }.execute();
}
/**
* if an FCP error occurs
*/
public Set<Peer> getPeers(final boolean withMetadata, final boolean withVolatile) throws IOException, FcpException {
- final Set<Peer> peers = new HashSet<Peer>();
- ExtendedFcpAdapter fcpListener = new ExtendedFcpAdapter() {
+ final Set<Peer> peers = Collections.synchronizedSet(new HashSet<Peer>());
+ new ExtendedFcpAdapter() {
+
+ /** The ID of the “ListPeers” request. */
+ private String identifier = "list-peers-" + System.currentTimeMillis();
/**
* {@inheritDoc}
@Override
@SuppressWarnings("synthetic-access")
public void run() throws IOException {
- fcpConnection.sendMessage(new ListPeers("list-peers", withMetadata, withVolatile));
+ fcpConnection.sendMessage(new ListPeers(identifier, withMetadata, withVolatile));
}
/**
*/
@Override
public void receivedPeer(FcpConnection fcpConnection, Peer peer) {
- peers.add(peer);
+ if (peer.getIdentifier().equals(identifier)) {
+ peers.add(peer);
+ }
}
/**
*/
@Override
public void receivedEndListPeers(FcpConnection fcpConnection, EndListPeers endListPeers) {
- completionLatch.countDown();
+ if (endListPeers.getIdentifier().equals(identifier)) {
+ completionLatch.countDown();
+ }
}
- };
- fcpListener.execute();
+ }.execute();
return peers;
}
* if an FCP error occurs
*/
private void addPeer(final AddPeer addPeer) throws IOException, FcpException {
- ExtendedFcpAdapter fcpListener = new ExtendedFcpAdapter() {
+ new ExtendedFcpAdapter() {
/**
* {@inheritDoc}
public void receivedPeer(FcpConnection fcpConnection, Peer peer) {
completionLatch.countDown();
}
- };
- fcpListener.execute();
+ }.execute();
}
/**
* if an FCP error occurs
*/
public void modifyPeer(final Peer peer, final Boolean allowLocalAddresses, final Boolean disabled, final Boolean listenOnly) throws IOException, FcpException {
- ExtendedFcpAdapter fcpListener = new ExtendedFcpAdapter() {
+ new ExtendedFcpAdapter() {
/**
* {@inheritDoc}
public void receivedPeer(FcpConnection fcpConnection, Peer peer) {
completionLatch.countDown();
}
- };
- fcpListener.execute();
+ }.execute();
}
/**
* if an FCP error occurs
*/
public void removePeer(final Peer peer) throws IOException, FcpException {
- ExtendedFcpAdapter fcpListener = new ExtendedFcpAdapter() {
+ new ExtendedFcpAdapter() {
/**
* {@inheritDoc}
public void receivedPeerRemoved(FcpConnection fcpConnection, PeerRemoved peerRemoved) {
completionLatch.countDown();
}
- };
- fcpListener.execute();
+ }.execute();
}
//
*/
@Override
public void receivedPeerNote(FcpConnection fcpConnection, PeerNote peerNote) {
- objectWrapper.set(peerNote);
+ if (peerNote.getNodeIdentifier().equals(peer.getIdentity())) {
+ objectWrapper.set(peerNote);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void receivedEndListPeerNotes(FcpConnection fcpConnection, EndListPeerNotes endListPeerNotes) {
+ completionLatch.countDown();
}
}.execute();
return objectWrapper.get();
}
/**
+ * Replaces the peer note for the given peer.
+ *
+ * @param peer
+ * The peer
+ * @param noteText
+ * The new base64-encoded note text
+ * @param noteType
+ * The type of the note (currently only <code>1</code> is
+ * allowed)
+ * @throws IOException
+ * if an I/O error occurs
+ * @throws FcpException
+ * if an FCP error occurs
+ */
+ public void modifyPeerNote(final Peer peer, final String noteText, final int noteType) throws IOException, FcpException {
+ new ExtendedFcpAdapter() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @SuppressWarnings("synthetic-access")
+ public void run() throws IOException {
+ fcpConnection.sendMessage(new ModifyPeerNote(peer.getIdentity(), noteText, noteType));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void receivedPeer(FcpConnection fcpConnection, Peer receivedPeer) {
+ if (receivedPeer.getIdentity().equals(peer.getIdentity())) {
+ completionLatch.countDown();
+ }
+ }
+ }.execute();
+ }
+
+ /**
* Implementation of an {@link FcpListener} that can store an
* {@link FcpException} and wait for the arrival of a certain command.
*