/*
* 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.settings.chat;
import org.jivesoftware.xmpp.workgroup.Workgroup;
import java.util.*;
/**
* Facade for caching of workgroup chat settings. This class will handle adding, removing and
* retrieval of ChatSetting objects from the cache.
*/
public class ChatSettings {
private transient Workgroup workgroup;
private Map<KeyEnum, ChatSetting> settingsList = new HashMap<KeyEnum, ChatSetting>();
/**
* Creates a new ChatSettings instance.
*
* @param workgroup the workgroup.
*/
public ChatSettings(Workgroup workgroup) {
this.workgroup = workgroup;
}
/**
* Adds a ChatSetting to settings list.
*
* @param setting the <code>ChatSetting</code> to add.
*/
protected void addChatSetting(ChatSetting setting) {
settingsList.put(setting.getKey(), setting);
}
/**
* Adds a ChatSetting to settings list.
*
* @param setting the <code>ChatSetting</code> to add.
*/
protected void removeChatSetting(ChatSetting setting) {
settingsList.remove(setting.getKey());
}
/**
* Returns all settings for a workgroup.
*
* @return the list of settings.
*/
public Collection<ChatSetting> getChatSettings() {
return settingsList.values();
}
/**
* Returns all settings of a workgroup of a certain type.
*
* @param type the type of setting to return.
* @return the list of settings in a workgroup with a certain type.
*/
public List<ChatSetting> getChatSettingsByType(ChatSettings.SettingType type) {
final List<ChatSetting> returnList = new ArrayList<ChatSetting>();
for (ChatSetting setting : settingsList.values()) {
if (setting.getType() == type) {
returnList.add(setting);
}
}
Collections.sort(returnList, chatSettingComparator);
return returnList;
}
/**
* Returns a ChatSetting based on it's key value.
*
* @param key the key to search for.
* @return the ChatSetting with the given key, if not found, this method returns null.
*/
public ChatSetting getChatSetting(KeyEnum key) {
ChatSetting setting = settingsList.get(key);
if (setting == null) {
synchronized (key) {
setting = settingsList.get(key);
if (setting == null) {
// Try to create the default setting for the given key
ChatSettingsCreator.getInstance().createDefaultSetting(workgroup.getJID(), key);
setting = settingsList.get(key);
}
}
}
return setting;
}
public ChatSetting getChatSetting(String key) {
for (KeyEnum k : KeyEnum.values()) {
if (k.toString().equals(key)) {
return getChatSetting(k);
}
}
return null;
}
/**
* Sorts all SearchResults by Relevance.
*/
static final Comparator<ChatSetting> chatSettingComparator = new Comparator<ChatSetting>() {
public int compare(ChatSetting item1, ChatSetting item2) {
String str1 = item1.getLabel();
String str2 = item2.getLabel();
// Check if identical
if (str1.equals(str2)) {
return 0;
}
int i = str1.compareToIgnoreCase(str2);
if (i < 0) {
return -1;
}
else if (i > 0) {
return 1;
}
else {
return 0;
}
}
};
public enum SettingType {
image_settings(0),
text_settings(1),
bot_settings(2),
search_settings(3),
offline_settings(4);
private int type;
SettingType(int t) {
type = t;
}
public int getType() {
return type;
}
}
}