5 import java.util.HashMap;
6 import java.util.ArrayList;
7 import java.util.Random;
8 import java.util.Arrays;
10 import org.opensrf.util.*;
14 * Models an OpenSRF client session.
16 public class ClientSession extends Session {
18 /** The remote service to communicate with */
19 private String service;
21 private String domain;
23 private String router;
26 * original remote node. The current remote node will change based
27 * on server responses. This is used to reset the remote node to
30 private String origRemoteNode;
31 /** The next request id */
33 /** The requests this session has sent */
34 private Map<Integer, Request> requests;
37 * Creates a new client session. Initializes the
38 * @param service The remove service.
40 public ClientSession(String service) throws ConfigException {
41 this.service = service;
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();
50 /** create a random thread */
51 long time = new Date().getTime();
52 Random rand = new Random(time);
53 setThread(rand.nextInt()+""+rand.nextInt()+""+time);
56 requests = new HashMap<Integer, Request>();
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.
66 public Request request(String method, List<Object> params) throws SessionException {
67 return request(new Request(this, nextId++, method, params));
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.
76 public Request request(String method, Object[] params) throws SessionException {
77 return request(new Request(this, nextId++, method, Arrays.asList(params)));
82 * Creates a new request to send to our remote service.
83 * @param method The method API name
84 * @return The request object.
86 public Request request(String method) throws SessionException {
87 return request(new Request(this, nextId++, method));
91 private Request request(Request req) throws SessionException {
92 if(getConnectState() != ConnectState.CONNECTED)
94 requests.put(new Integer(req.getId()), req);
101 * Resets the remoteNode to its original state.
103 public void resetRemoteId() {
104 setRemoteNode(origRemoteNode);
109 * Pushes a response onto the result queue of the appropriate request.
110 * @param msg The received RESULT Message
112 public void pushResponse(Message msg) {
114 Request req = requests.get(new Integer(msg.getId()));
116 /** LOG that we've received a result to a non-existant request */
119 OSRFObject payload = (OSRFObject) msg.get("payload");
121 /** build a result and push it onto the request's result queue */
124 payload.getString("status"),
125 payload.getInt("statusCode"),
126 payload.get("content")
132 * Removes a request for this session's request set
134 public void cleanupRequest(int reqId) {
135 requests.remove(new Integer(reqId));