/* * Copyright (C) 1999-2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.openfire.fastpath.util; import gnu.inet.encoding.Stringprep; import gnu.inet.encoding.StringprepException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.jivesoftware.openfire.fastpath.dataforms.FormManager; import org.jivesoftware.openfire.fastpath.settings.chat.ChatSettingsCreator; import org.jivesoftware.openfire.user.UserManager; import org.jivesoftware.openfire.user.UserNotFoundException; import org.jivesoftware.util.ClassUtils; import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.xmpp.workgroup.Agent; import org.jivesoftware.xmpp.workgroup.AgentManager; import org.jivesoftware.xmpp.workgroup.RequestQueue; import org.jivesoftware.xmpp.workgroup.UserAlreadyExistsException; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupManager; import org.jivesoftware.xmpp.workgroup.dispatcher.AgentSelector; import org.jivesoftware.xmpp.workgroup.spi.dispatcher.BasicAgentSelector; import org.jivesoftware.xmpp.workgroup.utils.ModelUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.component.ComponentManagerFactory; import org.xmpp.packet.JID; /** * A Utility class to allow for creation and modification of workgroups and queues. * * @author Derek DeMoro */ public class WorkgroupUtils { private static final Logger Log = LoggerFactory.getLogger(WorkgroupUtils.class); public static String updateWorkgroup(String workgroupName, String displayName, String description, int maxSize, int minSize, long requestTimeout, long offerTimeout) { final WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); Workgroup workgroup; try { workgroup = workgroupManager.getWorkgroup(new JID(workgroupName)); } catch (UserNotFoundException e) { return getUpdateMessage(false, "The JID specified is invalid."); } workgroup.setDisplayName(displayName); workgroup.setDescription(description); if (maxSize < minSize) { return getUpdateMessage(false, "Max size must be greater or equal to min size."); } workgroup.setMaxChats(maxSize); workgroup.setMinChats(minSize); workgroup.setRequestTimeout(requestTimeout); workgroup.setOfferTimeout(offerTimeout); return getUpdateMessage(true, "Workgroup has been updated"); } public static void toggleStatus(String workgroupName) { final WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); Workgroup workgroup; try { workgroup = workgroupManager.getWorkgroup(new JID(workgroupName)); } catch (UserNotFoundException e) { return; } Workgroup.Status status = workgroup.getStatus(); if (status == Workgroup.Status.READY) { workgroup.setStatus(Workgroup.Status.CLOSED); } else { workgroup.setStatus(Workgroup.Status.READY); } } public static String getUpdateMessage(boolean successfull, String message) { String returnString; if (successfull) { returnString = " <div class=\"jive-success\">\n" + " <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n" + " <tbody>\n" + " <tr><td class=\"jive-icon\"><img src=\"images/success-16x16.gif\" width=\"16\" height=\"16\"\n" + " border=\"0\"></td>\n" + " <td class=\"jive-icon-label\">\n" + " " + message + "\n" + " </td></tr>\n" + " </tbody>\n" + " </table>\n" + " </div><br>"; } else { returnString = " <p class=\"jive-error-text\">\n" + " " + message + "\n" + " </p>"; } return returnString; } public synchronized static List<AgentSelector> getAvailableAgentSelectors() { List<AgentSelector> answer = new ArrayList<AgentSelector>(); // First, add in built-in list of algorithms. for (Class newClass : getBuiltInAgentSelectorClasses()) { try { AgentSelector algorithm = (AgentSelector)newClass.newInstance(); answer.add(algorithm); } catch (Exception e) { Log.error(e.getMessage(), e); } } // Now get custom algorithms. List<String> classNames = JiveGlobals.getProperties("agentSelector.classes"); for (String className : classNames) { install_algorithm: try { Class algorithmClass = loadClass(className); // Make sure that the intercepter isn't already installed. for (AgentSelector agentSelector : answer) { if (algorithmClass.equals(agentSelector.getClass())) { break install_algorithm; } } AgentSelector algorithm = (AgentSelector)algorithmClass.newInstance(); answer.add(algorithm); } catch (Exception e) { Log.error(e.getMessage(), e); } } return answer; } private static Collection<Class> getBuiltInAgentSelectorClasses() { return Arrays.asList((Class)BasicAgentSelector.class); } private static Class loadClass(String className) throws ClassNotFoundException { try { return ClassUtils.forName(className); } catch (ClassNotFoundException e) { return WorkgroupUtils.class.getClassLoader().loadClass(className); } } public synchronized static void addAgentSelectorClass(Class newClass) throws IllegalArgumentException { try { AgentSelector newAlgorithm = (AgentSelector)newClass.newInstance(); // Make sure the interceptor isn't already in the list. List<AgentSelector> availableAgentSelectors = getAvailableAgentSelectors(); for (AgentSelector algorithm : availableAgentSelectors) { if (newAlgorithm.getClass().equals(algorithm.getClass())) { return; } } // Add in the new algorithm availableAgentSelectors.add(newAlgorithm); // Write out new class names. JiveGlobals.deleteProperty("agentSelector.classes"); for (int i = 0; i < availableAgentSelectors.size(); i++) { String cName = availableAgentSelectors.get(i).getClass().getName(); JiveGlobals.setProperty("agentSelector.classes." + i, cName); } } catch (IllegalAccessException e) { throw new IllegalArgumentException(e.getMessage()); } catch (InstantiationException e2) { throw new IllegalArgumentException(e2.getMessage()); } catch (ClassCastException e5) { throw new IllegalArgumentException("Class is not a AgentSelector"); } } /** * Create a new Workgroup. * * @param workgroupName the name of the workgroup. * @param description the description of the workgroup. * @param agents the agents, in a comma delimited string. * @return a map of errors (if any) */ public static Map<String, String> createWorkgroup(String workgroupName, String description, String agents) { Map<String, String> errors = new HashMap<String, String>(); // Get a workgroup manager WorkgroupManager wgManager = WorkgroupManager.getInstance(); if (wgManager == null) { errors.put("general_error", "The server is down"); return errors; } String defaultQueueName = "Default Queue"; // Validate if (workgroupName == null) { errors.put("wgName", ""); } else { try { workgroupName = workgroupName.trim().toLowerCase(); workgroupName = Stringprep.nodeprep(workgroupName); } catch (StringprepException se) { errors.put("wgName", ""); } } // do a create if there were no errors RequestQueue queue = null; if (errors.size() == 0) { try { // Create new workgroup Workgroup workgroup = wgManager.createWorkgroup(workgroupName); workgroup.setDescription(description); // Create a default workgroup queue queue = workgroup.createRequestQueue(defaultQueueName); //workgroup.setMaxChats(maxChats); //workgroup.setMinChats(minChats); // Make the workgroup ready by default: workgroup.setStatus(Workgroup.Status.READY); // Create default messages and images for the new workgroup ChatSettingsCreator.getInstance().createDefaultSettings(workgroup.getJID()); // Add generic web form FormManager formManager = FormManager.getInstance(); formManager.createGenericForm(workgroup); } catch (UserAlreadyExistsException uaee) { errors.put("exists", ""); } catch (Exception e) { Log.error(e.getMessage(), e); errors.put("general", ""); } } if (ModelUtil.hasLength(agents)) { addAgents(queue, agents); } return errors; } /** * Adds agents to a request queue. * * @param queue the <code>RequestQueue</code> to add agents to. * @param agents a comma-delimited list of agents. */ public static void addAgents(RequestQueue queue, String agents) { WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); AgentManager agentManager = workgroupManager.getAgentManager(); // loop thru all params StringTokenizer tokenizer = new StringTokenizer(agents, ", \t\n\r\f"); while (tokenizer.hasMoreTokens()) { String usernameToken = tokenizer.nextToken(); if (usernameToken.indexOf('@') != -1) { usernameToken = JID.escapeNode(usernameToken); } try { // See if they are a user in the system. UserManager.getInstance().getUser(usernameToken); usernameToken += ("@" + ComponentManagerFactory.getComponentManager().getServerName()); JID address = new JID(usernameToken.trim()); Agent agent; if (agentManager.hasAgent(address)) { agent = agentManager.getAgent(address); } else { agent = agentManager.createAgent(address); } queue.addMember(agent); } catch (Exception e) { Log.error(e.getMessage(), e); } } } }