use of org.jivesoftware.xmpp.workgroup.request.UserRequest in project Openfire by igniterealtime.
the class WorkgroupIQHandler method handleIQGet.
private void handleIQGet(IQ packet) {
IQ reply = null;
// TODO: verify namespace and send error if wrong
Element iq = packet.getChildElement();
UserRequest request;
final WorkgroupStats stats = new WorkgroupStats(workgroup);
String name = iq.getName();
String namespace = iq.getNamespaceURI();
if ("queue-status".equals(name)) {
try {
request = UserRequest.getRequest(workgroup, packet.getFrom());
request.updateQueueStatus(true);
} catch (NotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
}
} else if ("transcripts".equals(name)) {
try {
// Otherwise return a not_authorized
if (agentManager.getAgentSession(packet.getFrom()) == null) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
} else {
String userID = iq.attributeValue("userID");
stats.getChatTranscripts(packet, userID);
}
} catch (AgentNotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
}
} else if ("transcript".equals(name)) {
try {
// Otherwise return a not_authorized
if (agentManager.getAgentSession(packet.getFrom()) == null) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
} else {
String sessionID = iq.attributeValue("sessionID");
stats.getChatTranscript(packet, sessionID);
}
} catch (AgentNotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
}
} else if ("agent-status-request".equals(name)) {
try {
AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
if (agentSession == null) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
} else {
agentSession.sendAgentsInWorkgroup(packet, workgroup);
}
} catch (AgentNotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
}
} else if ("agent-info".equals(name)) {
try {
// Send the agent's info to the session that requested its own information
AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
if (agentSession == null) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
} else {
agentSession.sendAgentInfo(packet);
}
} catch (AgentNotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
}
} else if ("occupants-info".equals(name)) {
try {
// Just check that the packet was sent by a logged agent to this workgroup
AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
if (agentSession == null) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
} else {
// Send information about the occupants of the requested room
String roomID = iq.attributeValue("roomID");
workgroup.sendOccupantsInfo(packet, roomID);
}
} catch (AgentNotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
}
} else if ("chat-settings".equals(name)) {
ChatSettingsManager chatSettingsManager = ChatSettingsManager.getInstance();
String key = iq.attributeValue("key");
String type = iq.attributeValue("type");
if (ModelUtil.hasLength(key)) {
chatSettingsManager.getChatSettingByKey(packet, workgroup, key);
} else if (ModelUtil.hasLength(type)) {
try {
int typeInt = Integer.parseInt(type);
chatSettingsManager.getChatSettingsByType(packet, workgroup, typeInt);
} catch (NumberFormatException e) {
// Bad type.
}
} else {
chatSettingsManager.getAllChatSettings(packet, workgroup);
}
} else if ("jabber:iq:private".equals(namespace)) {
// IQ private for agents global macro storage
getIQPrivate(packet);
} else if ("vcard-temp".equals(namespace)) {
// Return workgroup's VCard
getVCard(packet);
} else {
// none are found, send bad request error.
for (WorkgroupProvider provider : providerManager.getWorkgroupProviders()) {
// Will provider handle the GET
if (provider.handleGet(packet)) {
// Pass off packet
provider.executeGet(packet, workgroup);
return;
}
}
dropPacket(packet);
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.bad_request));
}
if (reply != null) {
workgroup.send(reply);
}
}
use of org.jivesoftware.xmpp.workgroup.request.UserRequest in project Openfire by igniterealtime.
the class WorkgroupIQHandler method handleIQSet.
private void handleIQSet(IQ packet) {
IQ reply;
// TODO: verify namespace and send error if wrong
Element iq = packet.getChildElement();
JID sender = packet.getFrom();
reply = IQ.createResultIQ(packet);
reply.setFrom(workgroup.getJID());
String queryName = iq.getName();
String queryNamespace = iq.getNamespace().toString();
if ("join-queue".equals(queryName)) {
InterceptorManager interceptorManager = QueueInterceptorManager.getInstance();
try {
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, false);
// Received a Join Queue request from a visitor, create a new request.
UserRequest request = new UserRequest(packet, workgroup);
// Let the workgroup process the new request
if (!workgroup.queueRequest(request)) {
// It was not possible to add the request to a queue so answer that the
// workgroup is not accepting new join-queue requests
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.service_unavailable));
}
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, true);
} catch (PacketRejectedException e) {
workgroup.rejectPacket(packet, e);
reply = null;
}
} else if ("depart-queue".equals(queryName)) {
// Visitor is departing queue
try {
Request request = UserRequest.getRequest(workgroup, sender);
InterceptorManager interceptorManager = QueueInterceptorManager.getInstance();
try {
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, false);
request.cancel(Request.CancelType.DEPART);
iq.add(request.getSessionElement());
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, true);
} catch (PacketRejectedException e) {
workgroup.rejectPacket(packet, e);
reply = null;
}
} catch (NotFoundException e) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Request not found" + " while departing queue:", e);
}
} else if ("offer-accept".equals(queryName)) {
try {
InterceptorManager interceptorManager = OfferInterceptorManager.getInstance();
String id = iq.attributeValue("id");
String jid = iq.attributeValue("jid");
if (id != null || jid != null) {
Request request;
if (id != null) {
// Search request by its unique ID
request = Request.getRequest(id);
} else {
// Old version of FP refers to requests by the user's jid. This old version
// implements transfers and invitations on the client and not the server side.
// Therefore, for each user's jid there is always a unique Request
request = UserRequest.getRequest(workgroup, new JID(jid));
}
Offer offer = request.getOffer();
if (offer != null && offer.isOutstanding()) {
AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
if (agentSession == null) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Agent not found while accepting offer");
} else {
try {
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, false);
offer.accept(agentSession);
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, true);
} catch (PacketRejectedException e) {
workgroup.rejectPacket(packet, e);
reply = null;
}
}
} else {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_acceptable));
}
}
} catch (NotFoundException e) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Request not found " + "while accepting offer: ", e);
} catch (AgentNotFoundException e) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Agent not found " + "while accepting offer: ", e);
}
} else if ("offer-reject".equals(queryName)) {
try {
InterceptorManager interceptorManager = OfferInterceptorManager.getInstance();
String id = iq.attributeValue("id");
String jid = iq.attributeValue("jid");
if (id != null || jid != null) {
Request request;
if (id != null) {
// Search request by its unique ID
request = Request.getRequest(id);
} else {
// Old version of FP refers to requests by the user's jid. This old version
// implements transfers and invitations on the client and not the server side.
// Therefore, for each user's jid there is always a unique Request
request = UserRequest.getRequest(workgroup, new JID(jid));
}
Offer offer = request.getOffer();
if (offer != null) {
AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
if (agentSession == null) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Agent not found while accepting offer");
} else {
try {
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, false);
offer.reject(agentSession);
interceptorManager.invokeInterceptors(workgroup.getJID().toBareJID(), packet, true, true);
} catch (PacketRejectedException e) {
workgroup.rejectPacket(packet, e);
reply = null;
}
}
}
}
} catch (NotFoundException e) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Request not found " + "while rejecting offer: ", e);
} catch (AgentNotFoundException e) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
Log.debug("Agent not found " + "while accepting offer: ", e);
}
} else if ("invite".equals(queryName)) {
// Get the type of inviation (i.e. entity type is being invited)
InvitationRequest request = new InvitationRequest(packet, workgroup);
workgroup.processInvitation(request, packet);
reply = null;
} else if ("transfer".equals(queryName)) {
// Get the type of transfer (i.e. entity type is going to get the transfer offer)
TransferRequest request = new TransferRequest(packet, workgroup);
workgroup.processTransfer(request, packet);
reply = null;
} else if ("jabber:iq:private".equals(queryNamespace)) {
// IQ private for agents global macro storage
setIQPrivate(packet);
} else if ("agent-info".equals(queryName)) {
if (!JiveGlobals.getBooleanProperty("xmpp.live.agent.change-properties", true)) {
// Answer that agents are not allowed to change their properties (feature disabled)
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.service_unavailable));
} else {
try {
AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
if (agentSession == null) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
} else {
String allowsToChange = agentSession.getAgent().getProperties().getProperty("change-properties");
if (!"false".equals(allowsToChange)) {
// Set the new agent's info
agentSession.getAgent().updateAgentInfo(packet);
} else {
// Answer that this agent is not allowed to change his properties
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.service_unavailable));
}
}
} catch (AgentNotFoundException e) {
reply = IQ.createResultIQ(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
}
}
} else {
// none are found, send bad request error.
for (WorkgroupProvider provider : providerManager.getWorkgroupProviders()) {
// Handle packet?
if (provider.handleSet(packet)) {
// If provider accepts responsibility, hand off packet.
provider.executeSet(packet, workgroup);
return;
}
}
dropPacket(packet);
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.bad_request));
}
if (reply != null) {
workgroup.send(reply);
}
}
use of org.jivesoftware.xmpp.workgroup.request.UserRequest in project Openfire by igniterealtime.
the class Chatbot method sendRoomInvitation.
private void sendRoomInvitation(Message message, ChatbotSession session) {
UserRequest request = session.getRequest();
// Send again the room invitation to the user
workgroup.sendUserInvitiation(request, request.getInvitedRoomID());
// Send a confirmation to the user notifying that the invitation was sent
sendMessage(message.getFrom(), session.getMessageThread(), getInvitationResentMessage());
}
use of org.jivesoftware.xmpp.workgroup.request.UserRequest in project Openfire by igniterealtime.
the class RoundRobinDispatcher method overflow.
/**
* <p>Overflow the current request into another queue if possible.</p>
* <p/>
* <p>Future versions of the dispatcher may wish to overflow in
* more sophisticated ways. Currently we do it according to overflow
* rules: none (no overflow), backup (to a backup if it exists and is
* available, or randomly.</p>
*
* @param offer the offer to place in the overflow queue.
*/
private void overflow(Offer offer) {
RequestQueue backup = null;
if (RequestQueue.OverflowType.OVERFLOW_BACKUP.equals(queue.getOverflowType())) {
backup = queue.getBackupQueue();
// Check that the backup queue has agents available otherwise discard it
if (backup != null && !backup.getAgentSessionList().containsAvailableAgents()) {
backup = null;
}
} else if (RequestQueue.OverflowType.OVERFLOW_RANDOM.equals(queue.getOverflowType())) {
backup = getRandomQueue();
}
// and add the request in the backup queue
if (backup != null) {
offer.cancel();
UserRequest request = (UserRequest) offer.getRequest();
// Remove the request from the queue since it is going to be added to another
// queue
queue.removeRequest(request);
// Log debug trace
Log.debug("RR - Overflowing request: " + request + " to queue: " + backup.getAddress());
backup.addRequest(request);
}
}
Aggregations