/* * 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.macros; import java.util.HashMap; import java.util.Map; import org.jivesoftware.xmpp.workgroup.DbProperties; import org.jivesoftware.xmpp.workgroup.UnauthorizedException; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupManager; import org.jivesoftware.xmpp.workgroup.utils.ModelUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.thoughtworks.xstream.XStream; public class WorkgroupMacros { private static final Logger Log = LoggerFactory.getLogger(WorkgroupMacros.class); private Map<Workgroup, MacroGroup> rootGroups = new HashMap<Workgroup, MacroGroup>(); private static WorkgroupMacros singleton; private static final Object LOCK = new Object(); private XStream xstream = new XStream(); /** * Returns the singleton instance of <CODE>WorkgroupMacros</CODE>, * creating it if necessary. * <p/> * * @return the singleton instance of <Code>WorkgroupMacros</CODE> */ public static WorkgroupMacros getInstance() { // Synchronize on LOCK to ensure that we don't end up creating // two singletons. synchronized (LOCK) { if (singleton == null) { WorkgroupMacros WorkgroupMacros = new WorkgroupMacros(); singleton = WorkgroupMacros; return WorkgroupMacros; } } return singleton; } private WorkgroupMacros() { // Load macros WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); xstream.alias("macro", Macro.class); xstream.alias("macrogroup", MacroGroup.class); for (Workgroup workgroup : workgroupManager.getWorkgroups()) { // Load from DB. DbProperties prop = workgroup.getProperties(); String macros = prop.getProperty("jive.macro" + workgroup.getID()); if (ModelUtil.hasLength(macros)) { MacroGroup group = (MacroGroup)xstream.fromXML(macros); rootGroups.put(workgroup, group); } } } public MacroGroup getMacroGroup(Workgroup workgroup) { if (rootGroups.containsKey(workgroup)) { return rootGroups.get(workgroup); } MacroGroup rootGroup = new MacroGroup(); rootGroup.setTitle("Parent Category"); rootGroups.put(workgroup, rootGroup); return rootGroup; } public MacroGroup getMacroGroup(Workgroup workgroup, String name) { final MacroGroup rootGroup = getMacroGroup(workgroup); if (rootGroup.getTitle().equals(name)) { return rootGroup; } for (MacroGroup groups : rootGroup.getMacroGroups()) { if (groups.getTitle().equals(name)) { return groups; } MacroGroup foundGroup = getChildGroup(groups, name); if (foundGroup != null) { return foundGroup; } } return null; } private MacroGroup getChildGroup(MacroGroup rootGroup, String name) { MacroGroup returnGroup = null; for (MacroGroup group : rootGroup.getMacroGroups()) { if (group.getTitle().equals(name)) { returnGroup = group; break; } else { returnGroup = getChildGroup(group, name); if (returnGroup != null) { break; } } } return returnGroup; } public void setRootGroup(Workgroup workgroup, MacroGroup rootGroup) { rootGroups.put(workgroup, rootGroup); } public void saveMacros(Workgroup workgroup) { long id = workgroup.getID(); MacroGroup group = getMacroGroup(workgroup); String saveString = xstream.toXML(group); DbProperties props = workgroup.getProperties(); try { props.deleteProperty("jive.macro" + id); props.setProperty("jive.macro" + id, saveString); } catch (UnauthorizedException e) { Log.error(e.getMessage(), e); } } }