09cfce179b40f9104313a2d2c6a57d7b0bf99c85
[OpenSRF.git] / src / java / org / opensrf / ClientSession.java
1 package org.opensrf;
2 import java.util.Date;
3 import java.util.List;
4 import java.util.Map;
5 import java.util.HashMap;
6 import java.util.ArrayList;
7 import java.util.Random;
8 import java.util.Arrays;
9
10 import org.opensrf.util.*;
11
12
13 /**
14  * Models an OpenSRF client session.
15  */
16 public class ClientSession extends Session {
17
18     /** The remote service to communicate with */
19     private String service;
20     /** OpenSRF domain */
21     private String domain;
22     /** Router name */
23     private String router;
24
25     /** 
26      * original remote node.  The current remote node will change based 
27      * on server responses.  This is used to reset the remote node to 
28      * its original state.
29      */
30     private String origRemoteNode;
31     /** The next request id */
32     private int nextId;
33     /** The requests this session has sent */
34     private Map<Integer, Request> requests;
35
36     /**
37      * Creates a new client session.  Initializes the 
38      * @param service The remove service.
39      */
40     public ClientSession(String service) throws ConfigException {
41         this.service = service;
42
43         /** generate the remote node string */
44         domain = (String) Config.getFirst("/domains/domain");
45         router = Config.getString("/router_name");
46         setRemoteNode(router + "@" + domain + "/" + service);
47         origRemoteNode = getRemoteNode();
48
49
50         /** create a random thread */
51         long time = new Date().getTime();
52         Random rand = new Random(time);
53         setThread(rand.nextInt()+""+rand.nextInt()+""+time);
54
55         nextId = 0;
56         requests = new HashMap<Integer, Request>();
57         cacheSession();
58     }
59
60     /**
61      * Creates a new request to send to our remote service.
62      * @param method The method API name
63      * @param params The list of method parameters
64      * @return The request object.
65      */
66     public Request request(String method, List<Object> params) throws SessionException {
67         return request(new Request(this, nextId++, method, params));
68     }
69
70     /**
71      * Creates a new request to send to our remote service.
72      * @param method The method API name
73      * @param params The list of method parameters
74      * @return The request object.
75      */
76     public Request request(String method, Object[] params) throws SessionException {
77         return request(new Request(this, nextId++, method, Arrays.asList(params)));
78     }
79
80
81     /**
82      * Creates a new request to send to our remote service.
83      * @param method The method API name
84      * @return The request object.
85      */
86     public Request request(String method) throws SessionException {
87         return request(new Request(this, nextId++, method));
88     }
89
90
91     private Request request(Request req) throws SessionException {
92         if(getConnectState() != ConnectState.CONNECTED)
93             resetRemoteId();
94         requests.put(new Integer(req.getId()), req);
95         req.send();
96         return req;
97     }
98
99
100     /**
101      * Resets the remoteNode to its original state.
102      */
103     public void resetRemoteId() {
104         setRemoteNode(origRemoteNode);
105     }
106
107
108     /**
109      * Pushes a response onto the result queue of the appropriate request.
110      * @param msg The received RESULT Message
111      */
112     public void pushResponse(Message msg) {
113
114         Request req = requests.get(new Integer(msg.getId()));
115         if(req == null) {
116             /** LOG that we've received a result to a non-existant request */
117             return;
118         }
119         OSRFObject payload = (OSRFObject) msg.get("payload");
120
121         /** build a result and push it onto the request's result queue */
122         req.pushResponse(
123             new Result( 
124                 payload.getString("status"), 
125                 payload.getInt("statusCode"),
126                 payload.get("content")
127             )
128         );
129     }
130
131     /**
132      * Removes a request for this session's request set
133      */
134     public void cleanupRequest(int reqId) {
135         requests.remove(new Integer(reqId));
136     }
137 }
138