⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workgroupmanager.java

📁 openfire 服务器源码下载
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                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 + -