📄 workgroupiqhandler.java
字号:
/**
* $RCSfile$
* $Revision: 28498 $
* $Date: 2006-03-13 09:51:42 -0800 (Mon, 13 Mar 2006) $
*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution, or a commercial license
* agreement with Jive.
*/
package org.jivesoftware.xmpp.workgroup;
import org.jivesoftware.openfire.fastpath.WorkgroupSettings;
import org.jivesoftware.openfire.fastpath.settings.chat.ChatSettingsManager;
import org.jivesoftware.xmpp.workgroup.interceptor.InterceptorManager;
import org.jivesoftware.xmpp.workgroup.interceptor.OfferInterceptorManager;
import org.jivesoftware.xmpp.workgroup.interceptor.PacketRejectedException;
import org.jivesoftware.xmpp.workgroup.interceptor.QueueInterceptorManager;
import org.jivesoftware.xmpp.workgroup.request.InvitationRequest;
import org.jivesoftware.xmpp.workgroup.request.Request;
import org.jivesoftware.xmpp.workgroup.request.TransferRequest;
import org.jivesoftware.xmpp.workgroup.request.UserRequest;
import org.jivesoftware.xmpp.workgroup.utils.ModelUtil;
import org.dom4j.Element;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.NotFoundException;
import org.xmpp.component.ComponentManagerFactory;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import org.xmpp.packet.PacketError;
/**
* <p>The Workgroup's IQ handler processes all incoming IQ packets sent to the workgroup.</p>
* <p/>
* <p>Currently the workgroup recognizes:</p>
* <ul>
* <li>IQ for user joins
* <ul>
* <li>available - Join the workgoup and create agent session</li>
* <li>unavailable - Depart the workgroup and delete agent session</li>
* </ul>
* </li>
* <li>IQ for iq-private (used in global agent macro storage)
* <ul>
* <li>get - Allowed for any agent member of the workgroup</li>
* <li>set - Allowed for any agent member of the workgroup with
* admin priviledges</li>
* </ul>
* </li>
* </ul>
*
* @author Derek DeMoro
*/
public class WorkgroupIQHandler {
private Workgroup workgroup;
private WorkgroupSettings workgroupSettings = null;
private WorkgroupProviderManager providerManager;
private AgentManager agentManager;
public WorkgroupIQHandler() {
workgroupSettings = new WorkgroupSettings();
providerManager = WorkgroupProviderManager.getInstance();
agentManager = WorkgroupManager.getInstance().getAgentManager();
}
public void setWorkgroup(Workgroup workgroup) {
this.workgroup = workgroup;
}
public void process(IQ packet) {
try {
IQ.Type type = packet.getType();
if (type == IQ.Type.set) {
handleIQSet(packet);
}
else if (type == IQ.Type.get) {
handleIQGet(packet);
}
else if (type == IQ.Type.result) {
handleIQResult(packet);
}
else if (type == IQ.Type.error) {
handleIQError(packet);
}
else {
IQ reply = IQ.createResultIQ(packet);
if (packet.getChildElement() != null) {
reply.setChildElement(packet.getChildElement().createCopy());
}
reply.setError(new PacketError(PacketError.Condition.bad_request));
workgroup.send(reply);
}
}
catch (Exception e) {
ComponentManagerFactory.getComponentManager().getLog().error(e);
IQ reply = IQ.createResultIQ(packet);
if (packet.getChildElement() != null) {
reply.setChildElement(packet.getChildElement().createCopy());
}
reply.setError(new PacketError(PacketError.Condition.internal_server_error));
workgroup.send(reply);
}
}
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));
ComponentManagerFactory.getComponentManager().getLog().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));
ComponentManagerFactory.getComponentManager().getLog()
.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));
ComponentManagerFactory.getComponentManager().getLog().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));
ComponentManagerFactory.getComponentManager().getLog().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));
ComponentManagerFactory.getComponentManager().getLog()
.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));
ComponentManagerFactory.getComponentManager().getLog().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));
ComponentManagerFactory.getComponentManager().getLog().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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -