]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/java/org/opensrf/ClientSession.java
db44606203024f4d2dbd25137d735af341355806
[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.ArrayList;
5 import java.util.Random;
6 import java.util.Arrays;
7
8 import org.opensrf.util.*;
9
10
11 /**
12  * Models an OpenSRF client session.
13  */
14 public class ClientSession extends Session {
15
16     /** The remote service to communicate with */
17     private String service;
18     private String domain;
19     private String router;
20     private String origRemoteNode;
21     private int nextId;
22     private List<Request> requests;
23
24     /**
25      * Creates a new client session.  Initializes the 
26      * @param service The remove service.
27      */
28     public ClientSession(String service) throws ConfigException {
29         this.service = service;
30
31         /** generate the remote node string */
32         domain = (String) Config.getFirst("/domains/domain");
33         router = Config.getString("/router_name");
34         setRemoteNode(router + "@" + domain + "/" + service);
35         origRemoteNode = getRemoteNode();
36
37
38         /* create a random thread */
39         long time = new Date().getTime();
40         Random rand = new Random(time);
41         setThread(rand.nextInt()+""+rand.nextInt()+""+time);
42
43         requests = new ArrayList<Request>();
44         nextId = 0;
45         cacheSession();
46     }
47
48     /**
49      * Creates a new request to send to our remote service.
50      * @param method The method API name
51      * @param params The list of method parameters
52      * @return The request object.
53      */
54     public Request request(String method, List<Object> params) throws SessionException {
55         return request(new Request(this, nextId++, method, params));
56     }
57
58     /**
59      * Creates a new request to send to our remote service.
60      * @param method The method API name
61      * @param params The list of method parameters
62      * @return The request object.
63      */
64     public Request request(String method, Object[] params) throws SessionException {
65         return request(new Request(this, nextId++, method, Arrays.asList(params)));
66     }
67
68
69     /**
70      * Creates a new request to send to our remote service.
71      * @param method The method API name
72      * @return The request object.
73      */
74     public Request request(String method) throws SessionException {
75         return request(new Request(this, nextId++, method));
76     }
77
78
79     public Request request(Request req) throws SessionException {
80         if(getConnectState() != ConnectState.CONNECTED)
81             resetRemoteId();
82         //requests.set(req.getId(), req); 
83         requests.add(req); 
84         req.send();
85         return req;
86     }
87
88
89     /**
90      * Resets the remoteNode to its original state.
91      */
92     public void resetRemoteId() {
93         setRemoteNode(origRemoteNode);
94     }
95
96
97     /**
98      * Pushes a response onto the queue of the appropriate request.
99      * @param msg The the received RESULT Message whose payload 
100      * contains a Result object.
101      */
102     public void pushResponse(Message msg) {
103
104         Request req;
105
106         try {
107            req = requests.get(msg.getId());
108         } catch(IndexOutOfBoundsException e) {
109             /** LOG that an unexpected response arrived */
110             return;
111         }
112
113         OSRFObject payload = (OSRFObject) msg.get("payload");
114
115         req.pushResponse(
116             new Result( 
117                 payload.getString("status"), 
118                 payload.getInt("statusCode"),
119                 payload.get("content")
120             )
121         );
122     }
123 }
124