4c61ec5860993b5707780f9dd6607df5dddcda9e
[OpenSRF.git] / src / java / org / opensrf / Request.java
1 package org.opensrf;
2 import java.util.Queue;
3 import java.util.concurrent.ConcurrentLinkedQueue;
4 import java.util.List;
5 import java.util.Date;
6 import org.opensrf.net.xmpp.XMPPException;
7
8 public class Request {
9     
10     private ClientSession session;
11     private Method method;
12     private int id;
13     private Queue<Result> resultQueue;
14     private boolean resetTimeout;
15     private boolean complete;
16
17     public Request(ClientSession ses, int id, Method method) {
18         this.session = ses;
19         this.id = id;
20         this.method = method;
21         resultQueue = new ConcurrentLinkedQueue<Result>();
22         complete = false;
23         resetTimeout = false;
24     }
25
26     public Request(ClientSession ses, int id, String methodName) {
27         this(ses, id, new Method(methodName));
28     }
29
30     public Request(ClientSession ses, int id, String methodName, List<Object> params) {
31         this(ses, id, new Method(methodName, params));
32     }
33
34     public void send() throws SessionException {
35         session.send(new Message(id, Message.REQUEST, method));
36     }
37
38     public Result recv(long millis) throws SessionException {
39
40         Result result = null;
41
42         if(millis < 0) {
43             session.waitForMessage(millis);
44             if((result = resultQueue.poll()) != null)
45                 return result;
46
47         } else {
48
49             while(millis >= 0) {
50                 long start = new Date().getTime();
51                 session.waitForMessage(millis);
52                 millis -= new Date().getTime() - start;
53                 if((result = resultQueue.poll()) != null)
54                     return result;
55             }
56         }
57
58         return null;
59     }
60
61     public void pushResponse(Result result) {
62         resultQueue.offer(result);
63     }
64
65     /**
66      * @return This request's ID
67      */
68     public int getId() {
69         return id;
70     }
71 }