Return a collection instead of a set.
[jFCPlib.git] / src / net / pterodactylus / fcp / highlevel / FcpClient.java
index dae7546..4af4426 100644 (file)
@@ -23,14 +23,18 @@ import java.io.IOException;
 import java.net.InetAddress;
 import java.net.URL;
 import java.net.UnknownHostException;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 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.DataFound;
 import net.pterodactylus.fcp.EndListPeerNotes;
 import net.pterodactylus.fcp.EndListPeers;
 import net.pterodactylus.fcp.EndListPersistentRequests;
@@ -38,6 +42,7 @@ import net.pterodactylus.fcp.FcpAdapter;
 import net.pterodactylus.fcp.FcpConnection;
 import net.pterodactylus.fcp.FcpListener;
 import net.pterodactylus.fcp.GenerateSSK;
+import net.pterodactylus.fcp.GetFailed;
 import net.pterodactylus.fcp.ListPeerNotes;
 import net.pterodactylus.fcp.ListPeers;
 import net.pterodactylus.fcp.ListPersistentRequests;
@@ -49,9 +54,11 @@ import net.pterodactylus.fcp.Peer;
 import net.pterodactylus.fcp.PeerNote;
 import net.pterodactylus.fcp.PeerRemoved;
 import net.pterodactylus.fcp.PersistentGet;
+import net.pterodactylus.fcp.PersistentPut;
 import net.pterodactylus.fcp.ProtocolError;
 import net.pterodactylus.fcp.RemovePeer;
 import net.pterodactylus.fcp.SSKKeypair;
+import net.pterodactylus.fcp.SimpleProgress;
 import net.pterodactylus.fcp.WatchGlobal;
 import net.pterodactylus.util.thread.ObjectWrapper;
 
@@ -165,6 +172,8 @@ public class FcpClient {
                                fcpConnection.connect();
                                ClientHello clientHello = new ClientHello(name);
                                fcpConnection.sendMessage(clientHello);
+                               WatchGlobal watchGlobal = new WatchGlobal(true);
+                               fcpConnection.sendMessage(watchGlobal);
                        }
 
                        /**
@@ -204,7 +213,7 @@ public class FcpClient {
         * @throws FcpException
         *             if an FCP error occurs
         */
-       public Set<Peer> getPeers(final boolean withMetadata, final boolean withVolatile) throws IOException, FcpException {
+       public Collection<Peer> getPeers(final boolean withMetadata, final boolean withVolatile) throws IOException, FcpException {
                final Set<Peer> peers = Collections.synchronizedSet(new HashSet<Peer>());
                new ExtendedFcpAdapter() {
 
@@ -555,8 +564,12 @@ public class FcpClient {
         * @throws FcpException
         *             if an FCP error occurs
         */
-       public Set<PersistentGet> getGetRequests(final boolean global) throws IOException, FcpException {
-               final Set<PersistentGet> getRequests = Collections.synchronizedSet(new HashSet<PersistentGet>());
+       public Collection<Request> getGetRequests(final boolean global) throws IOException, FcpException {
+               return getRequests(global);
+       }
+
+       public Collection<Request> getRequests(final boolean global) throws IOException, FcpException {
+               final Map<String, Request> requests = Collections.synchronizedMap(new HashMap<String, Request>());
                new ExtendedFcpAdapter() {
 
                        /**
@@ -565,7 +578,6 @@ public class FcpClient {
                        @Override
                        @SuppressWarnings("synthetic-access")
                        public void run() throws IOException {
-                               fcpConnection.sendMessage(new WatchGlobal(global));
                                fcpConnection.sendMessage(new ListPersistentRequests());
                        }
 
@@ -574,7 +586,79 @@ public class FcpClient {
                         */
                        @Override
                        public void receivedPersistentGet(FcpConnection fcpConnection, PersistentGet persistentGet) {
-                               getRequests.add(persistentGet);
+                               if (!persistentGet.isGlobal() || global) {
+                                       GetRequest getRequest = new GetRequest(persistentGet);
+                                       requests.put(persistentGet.getIdentifier(), getRequest);
+                               }
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        *
+                        * @see net.pterodactylus.fcp.FcpAdapter#receivedDataFound(net.pterodactylus.fcp.FcpConnection,
+                        *      net.pterodactylus.fcp.DataFound)
+                        */
+                       @Override
+                       public void receivedDataFound(FcpConnection fcpConnection, DataFound dataFound) {
+                               Request getRequest = requests.get(dataFound.getIdentifier());
+                               if (getRequest == null) {
+                                       return;
+                               }
+                               getRequest.setComplete(true);
+                               getRequest.setLength(dataFound.getDataLength());
+                               getRequest.setContentType(dataFound.getMetadataContentType());
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        *
+                        * @see net.pterodactylus.fcp.FcpAdapter#receivedGetFailed(net.pterodactylus.fcp.FcpConnection,
+                        *      net.pterodactylus.fcp.GetFailed)
+                        */
+                       @Override
+                       public void receivedGetFailed(FcpConnection fcpConnection, GetFailed getFailed) {
+                               Request getRequest = requests.get(getFailed.getIdentifier());
+                               if (getRequest == null) {
+                                       return;
+                               }
+                               getRequest.setComplete(true);
+                               getRequest.setFailed(true);
+                               getRequest.setFatal(getFailed.isFatal());
+                               getRequest.setErrorCode(getFailed.getCode());
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        *
+                        * @see net.pterodactylus.fcp.FcpAdapter#receivedPersistentPut(net.pterodactylus.fcp.FcpConnection,
+                        *      net.pterodactylus.fcp.PersistentPut)
+                        */
+                       @Override
+                       public void receivedPersistentPut(FcpConnection fcpConnection, PersistentPut persistentPut) {
+                               if (!persistentPut.isGlobal() || global) {
+                                       PutRequest putRequest = new PutRequest(persistentPut);
+                                       requests.put(persistentPut.getIdentifier(), putRequest);
+                               }
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        *
+                        * @see net.pterodactylus.fcp.FcpAdapter#receivedSimpleProgress(net.pterodactylus.fcp.FcpConnection,
+                        *      net.pterodactylus.fcp.SimpleProgress)
+                        */
+                       @Override
+                       public void receivedSimpleProgress(FcpConnection fcpConnection, SimpleProgress simpleProgress) {
+                               Request request = requests.get(simpleProgress.getIdentifier());
+                               if (request == null) {
+                                       return;
+                               }
+                               request.setTotalBlocks(simpleProgress.getTotal());
+                               request.setRequiredBlocks(simpleProgress.getRequired());
+                               request.setFailedBlocks(simpleProgress.getFailed());
+                               request.setFatallyFailedBlocks(simpleProgress.getFatallyFailed());
+                               request.setSucceededBlocks(simpleProgress.getSucceeded());
+                               request.setFinalizedTotal(simpleProgress.isFinalizedTotal());
                        }
 
                        /**
@@ -585,7 +669,7 @@ public class FcpClient {
                                completionLatch.countDown();
                        }
                }.execute();
-               return getRequests;
+               return requests.values();
        }
 
        //