(Current state.)
[jSite2.git] / src / net / pterodactylus / jsite / core / RequestManager.java
index 23184b9..54ae5ac 100644 (file)
@@ -43,6 +43,9 @@ public class RequestManager implements NodeListener {
        /** The logger. */
        private static final Logger logger = Logger.getLogger(RequestManager.class.getName());
 
+       /** Request event manager. */
+       private final RequestListenerManager requestListenerManager = new RequestListenerManager();
+
        /** The node manager. */
        private final NodeManager nodeManager;
 
@@ -60,6 +63,32 @@ public class RequestManager implements NodeListener {
        }
 
        //
+       // LISTENER MANAGEMENT
+       //
+
+       /**
+        * Adds the given request listener to the list of registered listeners.
+        *
+        * @see RequestListenerManager#addListener(RequestListener)
+        * @param requestListener
+        *            The request listener to add
+        */
+       public void addRequestListener(RequestListener requestListener) {
+               requestListenerManager.addListener(requestListener);
+       }
+
+       /**
+        * Removes the given request listener from the list of registered listeners.
+        *
+        * @see RequestListenerManager#removeListener(RequestListener)
+        * @param requestListener
+        *            The request listener to remove
+        */
+       public void removeRequestListener(RequestListener requestListener) {
+               requestListenerManager.removeListener(requestListener);
+       }
+
+       //
        // ACTIONS
        //
 
@@ -69,6 +98,34 @@ public class RequestManager implements NodeListener {
        public void save() throws IOException {
        }
 
+       /**
+        * Starts inserting the given project.
+        *
+        * @param project
+        *            The project to insert
+        * @throws JSiteException
+        *             if the project’s node is not connected, or no node is
+        *             connected at all
+        */
+       public void insertProject(Project project) throws JSiteException {
+               Request request = new Request();
+               request.setClientToken(generateClientToken(project));
+               Node wantedNode = project.getNode();
+               if (wantedNode == null) {
+                       for (Node node : nodeManager.getNodes()) {
+                               if (nodeManager.getFcpClient(node) != null) {
+                                       wantedNode = node;
+                                       break;
+                               }
+                       }
+               }
+               if (wantedNode == null) {
+                       /* TODO use custom exception */
+                       throw new JSiteException("No node connected.");
+               }
+               FcpClient fcpClient = nodeManager.getFcpClient(wantedNode);
+       }
+
        //
        // PRIVATE METHODS
        //
@@ -91,15 +148,34 @@ public class RequestManager implements NodeListener {
                if (projectIdString.length() != (IdGenerator.DEFAULT_LENGTH * 2)) {
                        return false;
                }
+               int clientTokenHashCode = -1;
                try {
                        Hex.toByte(projectIdString);
+                       Long.valueOf(clientTokenParts[1]);
+                       clientTokenHashCode = Integer.valueOf(clientTokenParts[2]);
                } catch (NumberFormatException nfe1) {
                        return false;
                }
+               if ((clientTokenParts[0] + "." + clientTokenParts[1]).hashCode() != clientTokenHashCode) {
+                       return false;
+               }
                return true;
        }
 
        /**
+        * Generates a client token for the given project.
+        *
+        * @param project
+        *            The project to generate a client token for
+        * @return The generated client token
+        */
+       public String generateClientToken(Project project) {
+               String clientToken = project.getId() + "." + System.currentTimeMillis();
+               clientToken += "." + clientToken.hashCode();
+               return clientToken;
+       }
+
+       /**
         * Wraps the requests of the FCP API into jSite requests.
         *
         * @param requests