Stab at getRequests() implementationt.
[jFCPlib.git] / src / net / pterodactylus / fcp / highlevel / FcpClient.java
index d33105c..027b415 100644 (file)
@@ -23,21 +23,29 @@ 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;
 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;
 import net.pterodactylus.fcp.ModifyPeer;
 import net.pterodactylus.fcp.ModifyPeerNote;
 import net.pterodactylus.fcp.NodeHello;
@@ -45,8 +53,13 @@ import net.pterodactylus.fcp.NodeRef;
 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;
 
 /**
@@ -159,6 +172,8 @@ public class FcpClient {
                                fcpConnection.connect();
                                ClientHello clientHello = new ClientHello(name);
                                fcpConnection.sendMessage(clientHello);
+                               WatchGlobal watchGlobal = new WatchGlobal(true);
+                               fcpConnection.sendMessage(watchGlobal);
                        }
 
                        /**
@@ -203,7 +218,8 @@ public class FcpClient {
                new ExtendedFcpAdapter() {
 
                        /** The ID of the “ListPeers” request. */
-                       private String identifier = "list-peers-" + System.currentTimeMillis();
+                       @SuppressWarnings("synthetic-access")
+                       private String identifier = createIdentifier("list-peers");
 
                        /**
                         * {@inheritDoc}
@@ -493,6 +509,184 @@ public class FcpClient {
                }.execute();
        }
 
+       //
+       // KEY GENERATION
+       //
+
+       /**
+        * Generates a new SSK key pair.
+        *
+        * @return The generated key pair
+        * @throws IOException
+        *             if an I/O error occurs
+        * @throws FcpException
+        *             if an FCP error occurs
+        */
+       public SSKKeypair generateKeyPair() throws IOException, FcpException {
+               final ObjectWrapper<SSKKeypair> sskKeypairWrapper = new ObjectWrapper<SSKKeypair>();
+               new ExtendedFcpAdapter() {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @Override
+                       @SuppressWarnings("synthetic-access")
+                       public void run() throws IOException {
+                               fcpConnection.sendMessage(new GenerateSSK());
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @Override
+                       public void receivedSSKKeypair(FcpConnection fcpConnection, SSKKeypair sskKeypair) {
+                               sskKeypairWrapper.set(sskKeypair);
+                               completionLatch.countDown();
+                       }
+               }.execute();
+               return sskKeypairWrapper.get();
+       }
+
+       //
+       // REQUEST MANAGEMENT
+       //
+
+       /**
+        * Returns all currently visible persistent get requests.
+        *
+        * @param global
+        *            <code>true</code> to return get requests from the global
+        *            queue, <code>false</code> to only show requests from the
+        *            client-local queue
+        * @return All get requests
+        * @throws IOException
+        *             if an I/O error occurs
+        * @throws FcpException
+        *             if an FCP error occurs
+        */
+       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() {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @Override
+                       @SuppressWarnings("synthetic-access")
+                       public void run() throws IOException {
+                               fcpConnection.sendMessage(new ListPersistentRequests());
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @Override
+                       public void receivedPersistentGet(FcpConnection fcpConnection, PersistentGet 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());
+                       }
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       @Override
+                       public void receivedEndListPersistentRequests(FcpConnection fcpConnection, EndListPersistentRequests endListPersistentRequests) {
+                               completionLatch.countDown();
+                       }
+               }.execute();
+               return requests.values();
+       }
+
+       //
+       // PRIVATE METHODS
+       //
+
+       /**
+        * Creates a unique request identifier.
+        *
+        * @param basename
+        *            The basename of the request
+        * @return The created request identifier
+        */
+       private String createIdentifier(String basename) {
+               return basename + "-" + System.currentTimeMillis() + "-" + (int) (Math.random() * Integer.MAX_VALUE);
+       }
+
        /**
         * Implementation of an {@link FcpListener} that can store an
         * {@link FcpException} and wait for the arrival of a certain command.