package Manager; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import Utility.User.UserPermission; import Utility.chat.Chat; import Utility.chat.ChatCategory; import Utility.jsonUtils; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ChatManager { private static Logger log = LoggerFactory.getLogger(ChatManager.class); private static final String CHATS_FILENAME = "chats.json"; /** * Load All chats to look ak * @return list of Chats */ public static Set loadWatch(){ log.debug("Load WhatchChats"); Set ret = new HashSet<>(); for (Object o : jsonUtils.loadJson("WatchChats.json")){ JSONObject x = (JSONObject) o; ret.add(Long.parseLong(x.get("ID").toString())); } return ret; } /** * Safe list of chats to look at * @param list list of chats to save */ public static void saveWatch(Set list){ log.debug("Save WhatchChats"); JSONArray save = new JSONArray(); for (long x : list){ JSONObject tmp = new JSONObject(); tmp.put("ID", Long.toString(x)); save.add(tmp); } jsonUtils.saveJson(save, "WatchChats.json"); } /** * Add a new Chat Category * @param category new Category */ public static void addCategory(ChatCategory category) { log.info("Adding Utility.chat category " + category.getName()); JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); //Check if the uid is actually unique if (checkCategoryUID(category.getUid())) { log.debug("no unique Chat ID"); return; } JSONObject newCategory = new JSONObject(); newCategory.put("uid", category.getUid()); newCategory.put("name", category.getName()); newCategory.put("chats", new JSONArray()); categories.add(newCategory); jsonUtils.saveJson(categories, CHATS_FILENAME); } /** * Load a List with all Chat Categories * @return List of ChatCategories */ public static List loadCategories() { log.debug("Loading chat categories from file"); JSONArray categoriesJson = jsonUtils.loadJson(CHATS_FILENAME); List categories = new ArrayList<>(); for (Object o : categoriesJson) { JSONObject category = (JSONObject) o; long uid = (long) category.get("uid"); categories.add(loadCategory(uid)); } return categories; } /** * Load singe Chat Category by ID * @param uid id of Categoriy * @return ChatCategory */ public static ChatCategory loadCategory(long uid) { log.debug("Loading chat category by uid " + uid); JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject) o; long searchUid = (long) category.get("uid"); if (searchUid == uid) { String name = (String) category.get("name"); JSONArray chatsJson = (JSONArray) category.get("chats"); List chats = new ArrayList<>(); for (Object c : chatsJson) { JSONObject chatJson = (JSONObject) c; long chatUid = (long) chatJson.get("uid"); String chatName = (String) chatJson.get("name"); String chatUrl = (String) chatJson.get("url"); String permissionJson = (String) chatJson.get("permissionNeeded"); UserPermission permissionNeeded = UserPermission.valueOf(permissionJson); chats.add(new Chat(chatUid, chatName, chatUrl, permissionNeeded)); } ChatCategory found = new ChatCategory(uid, name); found.setChatList(chats); return found; } } return null; } /** * Delete existing Category * @param uid id of Category to delete */ public static void deleteCategory(long uid) { log.info("delete Category: " + uid); JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject)o; long searchUid = (Long) category.get("uid"); if (searchUid == uid) { categories.remove(o); break; } } jsonUtils.saveJson(categories, CHATS_FILENAME); } /** * Check if a ChatCategory uid already exists * @param uid ID to check * @return boolean true if exists */ public static boolean checkCategoryUID(long uid) { log.debug("Checking if Utility.chat category " + uid + " already exists"); JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject) o; long searchUid = (long) category.get("uid"); if (uid == searchUid) { return true; } } return false; } /** * Check if a Chat uid already exists * @param uid ID to check * @return boolean true if exists */ public static boolean checkChatUID(long uid) { JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject)o; JSONArray chats = (JSONArray)category.get("chats"); for (Object c : chats) { JSONObject chat = (JSONObject) c; long chatUid = (long) chat.get("uid"); if (uid == chatUid) return true; } } return false; } /** * Get biggest chatCategory Uid * @return Greatest UID */ public static long getBiggestChatCategoryUid() { log.debug("Get biggest Utility.chat category uid"); JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); long biggestUid = 0; for (Object o : categories) { JSONObject category = (JSONObject) o; long uid = (long) category.get("uid"); if (uid > biggestUid) { biggestUid = uid; } } return biggestUid; } /** * Save Chat into Category * @param chat Chat to save * @param categoryUid Category to save chat into */ public static void saveChat(Chat chat, long categoryUid) { JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); //search for Category for (Object o : categories) { JSONObject category = (JSONObject)o; long searchCategoryUid = (Long) category.get("uid"); //If found if (searchCategoryUid == categoryUid) { JSONArray chats = (JSONArray)category.get("chats"); //search if chat already exist for (Object c : chats) { JSONObject searchChat = (JSONObject)c; long searchChatUid = (Long) searchChat.get("uid"); //if chat already exists, delete it if (searchChatUid == chat.getUid()) { chats.remove(c); break; } } //save chat JSONObject chatJson = new JSONObject(); chatJson.put("uid", chat.getUid()); chatJson.put("name", chat.getName()); chatJson.put("url", chat.getUrl()); chatJson.put("permissionNeeded", chat.getPermissionNeeded().toString()); chats.add(chatJson); } } jsonUtils.saveJson(categories, CHATS_FILENAME); } /** * Loads specific chat out of specific category * @param chatUid chat id to load * @param categoryUid category id where chat is located * @return Chat */ public static Chat loadChatFromCategory(long chatUid, long categoryUid) { JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject)o; long searchCategoryUid = (Long) category.get("uid"); if (searchCategoryUid == categoryUid) { JSONArray chats = (JSONArray)category.get("chats"); for (Object c : chats) { JSONObject chat = (JSONObject)c; long searchChatUid = (Long) chat.get("uid"); if (searchChatUid == chatUid) { String name = (String)chat.get("name"); String url = (String)chat.get("url"); String permissionString = (String)chat.get("permissionNeeded"); UserPermission permissionNeeded = UserPermission.valueOf(permissionString); return new Chat(chatUid, name, url, permissionNeeded); } } } } return null; } /** * Delete Chat * @param chatUid ID of chat to delete */ public static void deleteChat(long chatUid) { JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject)o; JSONArray chats = (JSONArray)category.get("chats"); for (Object c : chats) { JSONObject searchChat = (JSONObject)c; long searchChatUid = (Long) searchChat.get("uid"); if (searchChatUid == chatUid) { chats.remove(c); break; } } category.put("chats", chats); } jsonUtils.saveJson(categories, CHATS_FILENAME); } /** * Change UID of a Chat * @param chat new Chat * @param categoryUid Category ID where chat is located * @param oldUid ID of Chat to change */ public static void changeUid(Chat chat, long categoryUid, long oldUid) { JSONArray categories = jsonUtils.loadJson(CHATS_FILENAME); for (Object o : categories) { JSONObject category = (JSONObject)o; long searchCategoryUid = (Long) category.get("uid"); if (searchCategoryUid == categoryUid) { JSONArray chats = (JSONArray)category.get("chats"); for (Object c : chats) { JSONObject searchChat = (JSONObject)c; long searchChatUid = (Long) searchChat.get("uid"); if (searchChatUid == oldUid) { searchChat.put("uid", chat.getUid()); searchChat.put("name", chat.getName()); searchChat.put("url", chat.getUrl()); searchChat.put("permissionNeeded", chat.getPermissionNeeded().toString()); } } } } jsonUtils.saveJson(categories, CHATS_FILENAME); } }