1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.bitrepository.client.conversation;
26
27 import org.bitrepository.bitrepositorymessages.Message;
28 import org.bitrepository.client.eventhandler.OperationFailedEvent;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32
33
34
35
36
37
38 public class StateBasedConversation implements Conversation {
39 private Logger log = LoggerFactory.getLogger(getClass());
40 private long startTime;
41 private ConversationContext context;
42
43
44
45
46
47
48 public StateBasedConversation(ConversationContext context) {
49 this.startTime = System.currentTimeMillis();
50 this.context = context;
51 }
52
53 @Override
54 public synchronized void onMessage(Message message) {
55 context.getState().handleMessage(message);
56 }
57
58 @Override
59 public String getConversationID() {
60 return context.getConversationID();
61 }
62
63 @Override
64 public long getStartTime() {
65 return startTime;
66 }
67
68 @Override
69 public synchronized void startConversation() {
70 context.getState().start();
71 }
72
73 @Override
74 public void endConversation() {
75 context.setState(new FinishedState(context));
76 }
77
78 @Override
79 public synchronized void failConversation(OperationFailedEvent failedEvent) {
80 getMonitor().operationFailed(failedEvent);
81 endConversation();
82 }
83
84
85
86
87 public ConversationEventMonitor getMonitor() {
88 return context.getMonitor();
89 }
90
91 @Override
92 public boolean hasEnded() {
93 return context.getState() instanceof FinishedState;
94 }
95 }