implemented enough of the stack/session logic to make stateless requests and receive...
[OpenSRF.git] / src / java / org / opensrf / ClientSession.java
index 9f3483e..db44606 100644 (file)
@@ -3,6 +3,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Random;
+import java.util.Arrays;
 
 import org.opensrf.util.*;
 
@@ -21,20 +22,103 @@ public class ClientSession extends Session {
     private List<Request> requests;
 
     /**
-     * @param service The remove service to communicate with
+     * Creates a new client session.  Initializes the 
+     * @param service The remove service.
      */
     public ClientSession(String service) throws ConfigException {
         this.service = service;
-        domain = (String) Config.getFirst("/domain/domains");
-        router = (String) Config.getString("/router_name");
+
+        /** generate the remote node string */
+        domain = (String) Config.getFirst("/domains/domain");
+        router = Config.getString("/router_name");
         setRemoteNode(router + "@" + domain + "/" + service);
         origRemoteNode = getRemoteNode();
-        requests = new ArrayList<Request>();
-        nextId = 0;
+
+
+        /* create a random thread */
         long time = new Date().getTime();
         Random rand = new Random(time);
-        thread = rand.nextInt()+""+rand.nextInt()+""+time;
+        setThread(rand.nextInt()+""+rand.nextInt()+""+time);
+
+        requests = new ArrayList<Request>();
+        nextId = 0;
         cacheSession();
     }
+
+    /**
+     * Creates a new request to send to our remote service.
+     * @param method The method API name
+     * @param params The list of method parameters
+     * @return The request object.
+     */
+    public Request request(String method, List<Object> params) throws SessionException {
+        return request(new Request(this, nextId++, method, params));
+    }
+
+    /**
+     * Creates a new request to send to our remote service.
+     * @param method The method API name
+     * @param params The list of method parameters
+     * @return The request object.
+     */
+    public Request request(String method, Object[] params) throws SessionException {
+        return request(new Request(this, nextId++, method, Arrays.asList(params)));
+    }
+
+
+    /**
+     * Creates a new request to send to our remote service.
+     * @param method The method API name
+     * @return The request object.
+     */
+    public Request request(String method) throws SessionException {
+        return request(new Request(this, nextId++, method));
+    }
+
+
+    public Request request(Request req) throws SessionException {
+        if(getConnectState() != ConnectState.CONNECTED)
+            resetRemoteId();
+        //requests.set(req.getId(), req); 
+        requests.add(req); 
+        req.send();
+        return req;
+    }
+
+
+    /**
+     * Resets the remoteNode to its original state.
+     */
+    public void resetRemoteId() {
+        setRemoteNode(origRemoteNode);
+    }
+
+
+    /**
+     * Pushes a response onto the queue of the appropriate request.
+     * @param msg The the received RESULT Message whose payload 
+     * contains a Result object.
+     */
+    public void pushResponse(Message msg) {
+
+        Request req;
+
+        try {
+           req = requests.get(msg.getId());
+        } catch(IndexOutOfBoundsException e) {
+            /** LOG that an unexpected response arrived */
+            return;
+        }
+
+        OSRFObject payload = (OSRFObject) msg.get("payload");
+
+        req.pushResponse(
+            new Result( 
+                payload.getString("status"), 
+                payload.getInt("statusCode"),
+                payload.get("content")
+            )
+        );
+    }
 }