Add “connected” flag.
[jFCPlib.git] / src / net / pterodactylus / fcp / highlevel / FcpClient.java
index a958f07..7f2d8bd 100644 (file)
@@ -81,6 +81,9 @@ public class FcpClient {
        /** The underlying FCP connection. */
        private final FcpConnection fcpConnection;
 
+       /** Whether the client is currently connected. */
+       private volatile boolean connected;
+
        /**
         * Creates an FCP client with the given name.
         *
@@ -163,6 +166,8 @@ public class FcpClient {
         *             if an FCP error occurs
         */
        public void connect() throws IOException, FcpException {
+               checkConnected(false);
+               connected = true;
                new ExtendedFcpAdapter() {
 
                        /**
@@ -651,6 +656,31 @@ public class FcpClient {
        }
 
        /**
+        * Returns all currently visible persistent put requests.
+        *
+        * @param global
+        *            <code>true</code> to return put requests from the global
+        *            queue, <code>false</code> to only show requests from the
+        *            client-local queue
+        * @return All put requests
+        * @throws IOException
+        *             if an I/O error occurs
+        * @throws FcpException
+        *             if an FCP error occurs
+        */
+       public Collection<Request> getPutRequests(final boolean global) throws IOException, FcpException {
+               return Filters.filteredCollection(getRequests(global), new Filter<Request>() {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       public boolean filterObject(Request request) {
+                               return request instanceof PutRequest;
+                       }
+               });
+       }
+
+       /**
         * Returns all currently visible persistent requests.
         *
         * @param global
@@ -783,6 +813,28 @@ public class FcpClient {
        }
 
        /**
+        * Checks whether the connection is in the required state.
+        *
+        * @param connected
+        *            The required connection state
+        * @throws FcpException
+        *             if the connection is not in the required state
+        */
+       private void checkConnected(boolean connected) throws FcpException {
+               if (this.connected != connected) {
+                       throw new FcpException("Client is " + (connected ? "not" : "already") + " connected.");
+               }
+       }
+
+       /**
+        * Tells the client that it is now disconnected. This method is called by
+        * {@link ExtendedFcpAdapter} only.
+        */
+       private void setDisconnected() {
+               connected = false;
+       }
+
+       /**
         * Implementation of an {@link FcpListener} that can store an
         * {@link FcpException} and wait for the arrival of a certain command.
         *
@@ -814,6 +866,7 @@ public class FcpClient {
                 */
                @SuppressWarnings("synthetic-access")
                public void execute() throws IOException, FcpException {
+                       checkConnected(true);
                        fcpConnection.addFcpListener(this);
                        try {
                                run();
@@ -825,10 +878,14 @@ public class FcpClient {
                                                /* ignore, we’ll loop. */
                                        }
                                }
+                       } catch (IOException ioe1) {
+                               setDisconnected();
+                               throw ioe1;
                        } finally {
                                fcpConnection.removeFcpListener(this);
                        }
                        if (fcpException != null) {
+                               setDisconnected();
                                throw fcpException;
                        }
                }