📄 workgroupmanager.java
字号:
if (packet instanceof Presence) {
if (((Presence)packet).getType() == Presence.Type.error) {
// Skip Presence packets of type error
return;
}
Presence reply = new Presence();
reply.setID(packet.getID());
reply.setTo(packet.getFrom());
reply.setFrom(packet.getTo());
reply.setError(PacketError.Condition.not_authorized);
send(reply);
}
else if (packet instanceof IQ) {
if (((IQ)packet).getType() == IQ.Type.error) {
// Skip IQ packets of type error
return;
}
IQ reply = IQ.createResultIQ((IQ)packet);
reply.setChildElement(((IQ)packet).getChildElement().createCopy());
reply.setError(PacketError.Condition.not_authorized);
send(reply);
}
else {
if (((Message)packet).getType() == Message.Type.error) {
// Skip Message packets of type error
return;
}
Message reply = new Message();
reply.setID(packet.getID());
reply.setTo(packet.getFrom());
reply.setFrom(packet.getTo());
reply.setError(PacketError.Condition.not_authorized);
send(reply);
}
}
}
catch (Exception e) {
ComponentManagerFactory.getComponentManager().getLog().error(e);
}
}
/**
* Returns true if the IQ packet was processed. This method should only process disco packets
* sent to the workgroup service.
*
* @param iq the IQ packet to process.
* @return true if the IQ packet was processed.
*/
private boolean process(IQ iq) {
if (iq.getType() == IQ.Type.error) {
// Skip IQ packets of type error
return false;
}
Element childElement = iq.getChildElement();
String name = null;
String namespace = null;
if (childElement != null) {
namespace = childElement.getNamespaceURI();
name = childElement.getName();
}
if ("http://jabber.org/protocol/disco#info".equals(namespace)) {
IQ reply = iqDiscoInfoHandler.handleIQ(iq);
if (reply != null) {
send(reply);
}
}
else if ("http://jabber.org/protocol/disco#items".equals(namespace)) {
IQ reply = iqDiscoItemsHandler.handleIQ(iq);
if (reply != null) {
send(reply);
}
}
else if ("jabber:iq:version".equals(namespace)) {
IQ reply = IQ.createResultIQ(iq);
Element version = reply.setChildElement("query", "jabber:iq:version");
version.addElement("name").setText("Spark Fastpath");
version.addElement("version").setText("3.2");
version.addElement("os").setText("Java 5");
send(reply);
}
else if ("workgroups".equals(name)) {
try {
// Check that the sender of this IQ is an agent
getAgentManager().getAgent(iq.getFrom());
// Get the agent JID to return his workgroups
String agentJID = childElement.attributeValue("jid");
try {
// Answer the workgroups where the agent can work in
Agent agent = getAgentManager().getAgent(new JID(agentJID));
sendWorkgroups(iq, agent);
}
catch (AgentNotFoundException e) {
IQ reply = IQ.createResultIQ(iq);
reply.setChildElement(iq.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
send(reply);
}
}
catch (AgentNotFoundException e) {
IQ reply = IQ.createResultIQ(iq);
reply.setChildElement(iq.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_authorized));
send(reply);
}
}
else if ("transcript-search".equals(name)) {
iqChatSearchHandler.handleIQ(iq);
}
else if ("http://jabber.org/protocol/commands".equals(namespace)) {
// Process ad-hoc command
IQ reply = commandManager.process(iq);
send(reply);
}
else {
return false;
}
return true;
}
private void sendWorkgroups(IQ request, Agent agent) {
IQ reply = IQ.createResultIQ(request);
Element workgroupsElement = reply.setChildElement("workgroups",
"http://jabber.org/protocol/workgroup");
workgroupsElement.addAttribute("jid", agent.getAgentJID().toBareJID());
for (Workgroup workgroup : getWorkgroups()) {
if (workgroup.getAgents().contains(agent)) {
// Add the information of the workgroup
Element workgroupElement = workgroupsElement.addElement("workgroup");
workgroupElement.addAttribute("jid", workgroup.getJID().toBareJID());
}
}
send(reply);
}
public String getName() {
return "Workgroup Plugin";
}
public String getDescription() {
return "Workgroup plugin for Live Assistance.";
}
public void initialize(JID jid, ComponentManager componentManager) throws ComponentException {
// Set the full domain address that this component is serving
serviceAddress = jid;
agentManager = new AgentManager();
// Set a default MUC service JID. This may be required when the server does
// not support service discovery
mucServiceName = "conference." + componentManager.getServerName();
// Send a disco request to discover the MUC service address
IQ disco = new IQ(IQ.Type.get);
disco.setTo(componentManager.getServerName());
disco.setFrom(jid);
disco.setChildElement("query", "http://jabber.org/protocol/disco#items");
send(disco);
// Start the background processes
startTimer();
// Load Workgroups
loadWorkgroups();
// Set that the workgroups have been loaded
loaded = true;
}
public void send(Packet packet) {
try {
ComponentManagerFactory.getComponentManager().sendPacket(this, packet);
}
catch (ComponentException e) {
// Do nothing. This error should never happen
ComponentManagerFactory.getComponentManager().getLog().error(e);
}
}
public JID getAddress() {
return serviceAddress;
}
/**
* Returns the service name for MUC
*
* @return the MUC Service Name
*/
public final String getMUCServiceName() {
return mucServiceName;
}
public void setMUCServiceName(String mucServiceName) {
this.mucServiceName = mucServiceName;
}
/**
* Listens for changes in the Group model to update respective agents.
*/
private void addGroupManagerListener() {
groupEventListener = new GroupEventListener() {
public void groupCreated(Group group, Map params) {
}
public void groupDeleting(Group group, Map params) {
}
public void groupModified(Group group, Map params) {
}
public void memberAdded(Group group, Map params) {
String userJID = (String)params.get("member");
JID jid = new JID(userJID);
if (!agentManager.hasAgent(jid)) {
for (Workgroup workgroup : workgroups.values()) {
for (RequestQueue queue : workgroup.getRequestQueues()) {
if (queue.hasGroup(group)) {
agentManager.getAgents(group);
}
}
}
}
}
public void memberRemoved(Group group, Map params) {
}
public void adminAdded(Group group, Map params) {
}
public void adminRemoved(Group group, Map params) {
}
};
GroupEventDispatcher.addListener(groupEventListener);
}
/**
* Creates a demo user account.
*
* @return true if the user account was created.
*/
private boolean createDemoUser() {
// Do nothing if user store is read-only
if (UserManager.getUserProvider().isReadOnly()) {
return false;
}
try {
UserManager.getInstance().createUser("demo", "demo", "Fastpath Demo Account", "demo@fastpath.com");
return true;
}
catch (Exception e) {
ComponentManagerFactory.getComponentManager().getLog().error(e);
}
return false;
}
/**
* Creates a demo workgroup.
*
* @return true if the workgroup was created.
*/
private boolean createDemoWorkgroup() {
// Create example workgroup
try {
if (WorkgroupUtils.createWorkgroup("demo", "Demo workgroup", "demo").size() == 0) {
JiveGlobals.setProperty("demo.workgroup", "true");
}
}
catch (Exception e) {
ComponentManagerFactory.getComponentManager().getLog().error(e);
return false;
}
return true;
}
/**
* Checks for outdated presences caused by network failures, etc.
*/
private void handleOutdatePresence() {
for (Workgroup workgroup : getWorkgroups()) {
for (AgentSession agentSession : workgroup.getAgentSessions()) {
final JID agentJID = agentSession.getJID();
final PresenceManager presenceManager = XMPPServer.getInstance().getPresenceManager();
boolean isOnline = false;
for (Presence presence : presenceManager.getPresences(agentJID.getNode())) {
if (presence.getFrom().equals(agentJID)) {
isOnline = true;
}
}
if (!isOnline) {
// Send offline presence to workgroup.
for (Workgroup wgroup : agentSession.getWorkgroups()) {
Presence presence = new Presence();
presence.setFrom(agentJID);
presence.setTo(wgroup.getJID());
presence.setType(Presence.Type.unavailable);
wgroup.getWorkgroupPresenceHandler().process(presence);
}
}
}
}
}
/**
* Sorts all <code>Workgroups</code> by ID.
*/
static Comparator<Workgroup> workgroupComparator = new Comparator<Workgroup>() {
public int compare(Workgroup item1, Workgroup item2) {
float int1 = item1.getID();
float int2 = item2.getID();
if (int1 == int2) {
return 0;
}
if (int1 > int2) {
return 1;
}
if (int1 < int2) {
return -1;
}
return 0;
}
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -