1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.asteriskjava.live.internal;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.asteriskjava.live.AgentState;
25 import org.asteriskjava.live.AsteriskAgent;
26 import org.asteriskjava.live.ManagerCommunicationException;
27 import org.asteriskjava.manager.ResponseEvents;
28 import org.asteriskjava.manager.action.AgentsAction;
29 import org.asteriskjava.manager.event.AgentCallbackLoginEvent;
30 import org.asteriskjava.manager.event.AgentCallbackLogoffEvent;
31 import org.asteriskjava.manager.event.AgentCalledEvent;
32 import org.asteriskjava.manager.event.AgentCompleteEvent;
33 import org.asteriskjava.manager.event.AgentConnectEvent;
34 import org.asteriskjava.manager.event.AgentLoginEvent;
35 import org.asteriskjava.manager.event.AgentLogoffEvent;
36 import org.asteriskjava.manager.event.AgentsEvent;
37 import org.asteriskjava.manager.event.ManagerEvent;
38 import org.asteriskjava.util.Log;
39 import org.asteriskjava.util.LogFactory;
40
41
42
43
44
45
46
47
48
49
50
51 public class AgentManager
52 {
53
54 private final Log logger = LogFactory.getLog(this.getClass());
55
56 private final AsteriskServerImpl server;
57
58
59
60
61 private final Map<String, AsteriskAgentImpl> agents;
62
63
64
65
66
67 private final Map<String, AsteriskAgentImpl> ringingAgents;
68
69 AgentManager(AsteriskServerImpl asteriskServerImpl)
70 {
71 this.server = asteriskServerImpl;
72 agents = new HashMap<String, AsteriskAgentImpl>();
73 ringingAgents = new HashMap<String, AsteriskAgentImpl>();
74 }
75
76
77
78
79
80
81
82
83 void initialize() throws ManagerCommunicationException
84 {
85 ResponseEvents re;
86
87 re = server.sendEventGeneratingAction(new AgentsAction());
88
89 for (ManagerEvent event : re.getEvents())
90 {
91 if (event instanceof AgentsEvent)
92 {
93 System.out.println(event);
94 handleAgentsEvent((AgentsEvent) event);
95 }
96 }
97 }
98
99 void disconnected()
100 {
101 synchronized (agents)
102 {
103 agents.clear();
104 }
105 }
106
107
108
109
110
111
112 void handleAgentsEvent(AgentsEvent event)
113 {
114 AsteriskAgentImpl agent = new AsteriskAgentImpl(server,
115 event.getName(), "Agent/" + event.getAgent(), AgentState.valueOf(event.getStatus()));
116 logger.info("Adding agent " + agent.getName() + "(" + agent.getAgentId() + ")");
117
118 addAgent(agent);
119 }
120
121
122
123
124
125
126 private void addAgent(AsteriskAgentImpl agent)
127 {
128 synchronized (agents)
129 {
130 agents.put(agent.getAgentId(), agent);
131 }
132 server.fireNewAgent(agent);
133 }
134
135
136
137
138
139
140
141 AsteriskAgentImpl getAgentByAgentId(String agentId)
142 {
143 synchronized (agents)
144 {
145 return agents.get(agentId);
146 }
147 }
148
149
150
151
152
153
154 void handleAgentCalledEvent(AgentCalledEvent event)
155 {
156 AsteriskAgentImpl agent = getAgentByAgentId(event.getAgentCalled());
157 if (agent == null)
158 {
159 logger.error("Ignored AgentCalledEvent for unknown agent " + event.getAgentCalled());
160 return;
161 }
162 updateRingingAgents(event.getChannelCalling(), agent);
163 updateAgentState(agent, AgentState.AGENT_RINGING);
164 }
165
166
167
168
169
170
171 private void updateAgentState(AsteriskAgentImpl agent, AgentState newState)
172 {
173 logger.info("Set state of agent " + agent.getAgentId() + " to " + newState);
174 synchronized (agent)
175 {
176 agent.updateState(newState);
177 }
178 }
179
180
181
182
183
184
185
186
187
188 private void updateRingingAgents(String channelCalling, AsteriskAgentImpl agent)
189 {
190 synchronized (ringingAgents)
191 {
192 if (ringingAgents.containsKey(channelCalling))
193 {
194 updateAgentState(ringingAgents.get(channelCalling), AgentState.AGENT_IDLE);
195 }
196 ringingAgents.put(channelCalling, agent);
197 }
198 }
199
200
201
202
203
204
205 void handleAgentConnectEvent(AgentConnectEvent event)
206 {
207 AsteriskAgentImpl agent = getAgentByAgentId(event.getChannel());
208 if (agent == null)
209 {
210 logger.error("Ignored AgentConnectEvent for unknown agent " + event.getChannel());
211 return;
212 }
213 agent.updateState(AgentState.AGENT_ONCALL);
214 }
215
216
217
218
219
220
221 void handleAgentLoginEvent(AgentLoginEvent event)
222 {
223 AsteriskAgentImpl agent = getAgentByAgentId("Agent/" + event.getAgent());
224 if (agent == null)
225 {
226 synchronized (agents)
227 {
228 logger.error("Ignored AgentLoginEvent for unknown agent "
229 + event.getAgent() + ". Agents: " + agents.values().toString());
230
231 }
232 return;
233 }
234 agent.updateState(AgentState.AGENT_IDLE);
235 }
236
237
238
239
240
241
242 void handleAgentLogoffEvent(AgentLogoffEvent event)
243 {
244 AsteriskAgentImpl agent = getAgentByAgentId("Agent/" + event.getAgent());
245 if (agent == null)
246 {
247 logger.error("Ignored AgentLogoffEvent for unknown agent "
248 + event.getAgent() + ". Agents: "
249 + agents.values().toString());
250 return;
251 }
252 agent.updateState(AgentState.AGENT_LOGGEDOFF);
253 }
254
255
256
257
258
259
260 void handleAgentCallbackLoginEvent(AgentCallbackLoginEvent event)
261 {
262 AsteriskAgentImpl agent = getAgentByAgentId("Agent/" + event.getAgent());
263 if (agent == null)
264 {
265 synchronized (agents)
266 {
267 logger.error("Ignored AgentCallbackLoginEvent for unknown agent "
268 + event.getAgent() + ". Agents: " + agents.values().toString());
269
270 }
271 return;
272 }
273 agent.updateState(AgentState.AGENT_IDLE);
274 }
275
276
277
278
279
280
281 void handleAgentCallbackLogoffEvent(AgentCallbackLogoffEvent event)
282 {
283 AsteriskAgentImpl agent = getAgentByAgentId("Agent/" + event.getAgent());
284 if (agent == null)
285 {
286 logger.error("Ignored AgentCallbackLogoffEvent for unknown agent "
287 + event.getAgent() + ". Agents: "
288 + agents.values().toString());
289 return;
290 }
291 agent.updateState(AgentState.AGENT_LOGGEDOFF);
292
293 }
294
295
296
297
298
299
300 Collection<AsteriskAgent> getAgents()
301 {
302 Collection<AsteriskAgent> copy;
303
304 synchronized (agents)
305 {
306 copy = new ArrayList<AsteriskAgent>(agents.values());
307 }
308 return copy;
309 }
310
311
312
313
314
315
316 void handleAgentCompleteEvent(AgentCompleteEvent event)
317 {
318 AsteriskAgentImpl agent = getAgentByAgentId(event.getChannel());
319 if (agent == null)
320 {
321 logger.error("Ignored AgentCompleteEvent for unknown agent " + event.getChannel());
322 return;
323 }
324 agent.updateState(AgentState.AGENT_IDLE);
325 }
326 }