From 656f25dc97f6b094b86131263d17a6d8069370f7 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 22 Jun 2012 15:44:04 +0100 Subject: [PATCH 01/13] Only output a Data update message if something has changed. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../src/org/anjocaido/groupmanager/GroupManager.java | 4 ++-- .../groupmanager/dataholder/worlds/WorldsHolder.java | 8 +++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 4a3c232be..134d40250 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -183,4 +183,5 @@ v 2.0: - Re-initialize the WorldsHolder on a reload, as un-registering and re-registering a new holder means all plugins have to check for the new service on every quiery. - Prevent null perms getting past the GlobalGroups loader. - Fix forgetting sub groups on a manload. - - Allow 'manucheckp' to notify when superperms reports false but it is really negated. \ No newline at end of file + - Allow 'manucheckp' to notify when superperms reports false but it is really negated. + - Only output a Data update message if something has changed. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 5f357641a..61bb41dd1 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -324,8 +324,8 @@ public class GroupManager extends JavaPlugin { public void run() { try { - worldsHolder.saveChanges(false); - GroupManager.logger.log(Level.INFO, " Data files refreshed."); + if (worldsHolder.saveChanges(false)) + GroupManager.logger.log(Level.INFO, " Data files refreshed."); } catch (IllegalStateException ex) { GroupManager.logger.log(Level.WARNING, ex.getMessage()); } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index 27a7d9a59..f9735c282 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -264,8 +264,9 @@ public class WorldsHolder { /** * */ - public void saveChanges(boolean overwrite) { + public boolean saveChanges(boolean overwrite) { + boolean changed = false; ArrayList alreadyDone = new ArrayList(); Tasks.removeOldFiles(plugin, plugin.getBackupFolder()); @@ -294,6 +295,7 @@ public class WorldsHolder { backupFile(w, true); WorldDataHolder.writeGroups(w, w.getGroupsFile()); + changed = true; //w.removeGroupsChangedFlag(); } else { // Newer file found. @@ -307,6 +309,7 @@ public class WorldsHolder { // Backup Groups file backupFile(w, true); w.reloadGroups(); + changed = true; } } if (!mirrorsUser.containsKey(w.getName().toLowerCase())) @@ -316,6 +319,7 @@ public class WorldsHolder { backupFile(w, false); WorldDataHolder.writeUsers(w, w.getUsersFile()); + changed = true; //w.removeUsersChangedFlag(); } else { // Newer file found. @@ -329,10 +333,12 @@ public class WorldsHolder { // Backup Users file backupFile(w, false); w.reloadUsers(); + changed = true; } } alreadyDone.add(w); } + return changed; } /** From 51d61e7a915aa86d4291516dede211ec454c630f Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 24 Jun 2012 13:10:22 +0100 Subject: [PATCH 02/13] Fix loading users with only numerals in their names to be seen as strings. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../groupmanager/dataholder/WorldDataHolder.java | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 134d40250..3b44270c6 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -184,4 +184,5 @@ v 2.0: - Prevent null perms getting past the GlobalGroups loader. - Fix forgetting sub groups on a manload. - Allow 'manucheckp' to notify when superperms reports false but it is really negated. - - Only output a Data update message if something has changed. \ No newline at end of file + - Only output a Data update message if something has changed. + - Fix loading users with only numerals in their names to be seen as strings. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index fefc698f9..1ccd48772 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -775,20 +775,26 @@ public class WorldDataHolder { Iterator usersItr = allUsersNode.keySet().iterator(); String usersKey; + Object node; Integer userCount = 0; while (usersItr.hasNext()) { try { userCount++; // Attempt to fetch the next user name. - usersKey = usersItr.next(); + node = usersItr.next(); + if (node instanceof Integer) + usersKey = Integer.toString((Integer)node); + else + usersKey = node.toString(); + } catch (Exception ex) { throw new IllegalArgumentException("Invalid node type for user entry (" + userCount + ") in file: " + usersFile.getPath(), ex); } Map thisUserNode = null; try { - thisUserNode = (Map) allUsersNode.get(usersKey); + thisUserNode = (Map) allUsersNode.get(node); } catch (Exception ex) { throw new IllegalArgumentException("Bad format found for user: " + usersKey + " in file: " + usersFile.getPath()); } From 24ec84730e45d5e12f85d7954202c4e9dfeef70d Mon Sep 17 00:00:00 2001 From: ElgarL Date: Wed, 4 Jul 2012 11:32:17 +0100 Subject: [PATCH 03/13] Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 3b44270c6..99133244e 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -185,4 +185,5 @@ v 2.0: - Fix forgetting sub groups on a manload. - Allow 'manucheckp' to notify when superperms reports false but it is really negated. - Only output a Data update message if something has changed. - - Fix loading users with only numerals in their names to be seen as strings. \ No newline at end of file + - Fix loading users with only numerals in their names to be seen as strings. + - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index f9735c282..199c99bb3 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -105,7 +105,7 @@ public class WorldsHolder { * and attempt to load the world data */ for (File folder : worldsFolder.listFiles()) { - if (folder.isDirectory()) { + if (folder.isDirectory() && !folder.getName().startsWith(".")) { GroupManager.logger.info("World Found: " + folder.getName()); /* From 72015d42fc14c548a08f323be61e088a0edf156c Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 6 Jul 2012 08:33:57 +0100 Subject: [PATCH 04/13] Throw a better error than 'null' when someone removes all groups from a yml. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../anjocaido/groupmanager/dataholder/WorldDataHolder.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 99133244e..aa49a1757 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -186,4 +186,5 @@ v 2.0: - Allow 'manucheckp' to notify when superperms reports false but it is really negated. - Only output a Data update message if something has changed. - Fix loading users with only numerals in their names to be seen as strings. - - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). \ No newline at end of file + - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). + - Throw a better error than 'null' when someone removes all groups from a yml. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index 1ccd48772..3df3271a3 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -508,6 +508,10 @@ public class WorldDataHolder { } catch (Exception ex) { throw new IllegalArgumentException("Your " + groupsFile.getPath() + " file is invalid. See console for details.", ex); } + + if (allGroupsNode == null) { + throw new IllegalArgumentException("You have no groups in " + groupsFile.getPath() + "."); + } Iterator groupItr = allGroupsNode.keySet().iterator(); String groupKey; From ed668fcac4aa3f713752d4d3ea3b99dba0bc9259 Mon Sep 17 00:00:00 2001 From: Matt Baxter Date: Tue, 10 Jul 2012 06:24:17 -0300 Subject: [PATCH 05/13] Fix critical flaw in permissions removal. Potential for removing the removal entirely but this can be figured out later. --- .../groupmanager/permissions/BukkitPermissions.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 05e152286..22883414d 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -442,18 +442,7 @@ public class BukkitPermissions { updatePermissions(event.getPlayer(), event.getPlayer().getWorld().getName()); } - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerKick(PlayerKickEvent event) { - - Player player = event.getPlayer(); - - /* - * force remove any attachments as bukkit may not - */ - removeAttachment(player); - } - - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerQuit(PlayerQuitEvent event) { if (!GroupManager.isLoaded()) From a46497255ecb600bcee8ecca99fff53dd0b716f4 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 10 Jul 2012 14:10:13 +0100 Subject: [PATCH 06/13] Stop force removing attachments and let Bukkit handle it's own mess. --- EssentialsGroupManager/src/Changelog.txt | 3 +- .../permissions/BukkitPermissions.java | 74 +++++++------------ 2 files changed, 27 insertions(+), 50 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index aa49a1757..c736d9ee2 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -187,4 +187,5 @@ v 2.0: - Only output a Data update message if something has changed. - Fix loading users with only numerals in their names to be seen as strings. - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). - - Throw a better error than 'null' when someone removes all groups from a yml. \ No newline at end of file + - Throw a better error than 'null' when someone removes all groups from a yml. + - Stop force removing attachments and let Bukkit handle it's own mess. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 05e152286..b145e8f90 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -21,7 +21,6 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -40,7 +39,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; @@ -57,7 +55,7 @@ import org.bukkit.plugin.PluginManager; */ public class BukkitPermissions { - protected WeakHashMap attachments = new WeakHashMap(); + protected WeakHashMap attachments = new WeakHashMap(); protected LinkedHashMap registeredPermissions = new LinkedHashMap(); protected GroupManager plugin; protected boolean dumpAllPermissions = true; @@ -146,19 +144,21 @@ public class BukkitPermissions { return; } + String name = player.getName(); + // Reset the User objects player reference. - User user = plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()); + User user = plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(name); if (user != null) user.updatePlayer(player); PermissionAttachment attachment; // Find the players current attachment, or add a new one. - if (this.attachments.containsKey(player)) { - attachment = this.attachments.get(player); + if (this.attachments.containsKey(name)) { + attachment = this.attachments.get(name); } else { attachment = player.addAttachment(plugin); - this.attachments.put(player, attachment); + this.attachments.put(name, attachment); } if (world == null) { @@ -167,7 +167,7 @@ public class BukkitPermissions { // Add all permissions for this player (GM only) // child nodes will be calculated by Bukkit. - List playerPermArray = new ArrayList(plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getAllPlayersPermissions(player.getName(), false)); + List playerPermArray = new ArrayList(plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getAllPlayersPermissions(name, false)); LinkedHashMap newPerms = new LinkedHashMap(); // Sort the perm list by parent/child, so it will push to superperms correctly. @@ -192,13 +192,15 @@ public class BukkitPermissions { // Then whack our map into there orig.putAll(newPerms); // That's all folks! - //attachment.getPermissible().recalculatePermissions(); - player.recalculatePermissions(); + attachment.getPermissible().recalculatePermissions(); + //player.recalculatePermissions(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } + + GroupManager.logger.finest("Attachment updated for: " + name); } /** @@ -373,19 +375,10 @@ public class BukkitPermissions { * * @param player */ - private void removeAttachment(Player player) { + private void removeAttachment(String playerName) { - if (attachments.containsKey(player)) { - try { - player.removeAttachment(attachments.get(player)); - } catch (IllegalArgumentException e) { - /* - * Failed to remove attachment - * This usually means Bukkit no longer knows of it. - */ - } - attachments.remove(player); - } + if (attachments.containsKey(playerName)) + attachments.remove(playerName); } /** @@ -393,19 +386,6 @@ public class BukkitPermissions { */ public void removeAllAttachments() { - Iterator itr = attachments.keySet().iterator(); - - while (itr.hasNext()) { - Player player = itr.next(); - try { - player.removeAttachment(attachments.get(player)); - } catch (IllegalArgumentException e) { - /* - * Failed to remove attachment - * This usually means Bukkit no longer knows of it. - */ - } - } attachments.clear(); } @@ -420,13 +400,17 @@ public class BukkitPermissions { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(PlayerJoinEvent event) { + + setPlayer_join(true); Player player = event.getPlayer(); + + GroupManager.logger.finest("Player Join event: " + player.getName()); /* * Tidy up any lose ends */ - removeAttachment(player); + removeAttachment(player.getName()); // force GM to create the player if they are not already listed. if (plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()) != null) { @@ -442,18 +426,10 @@ public class BukkitPermissions { updatePermissions(event.getPlayer(), event.getPlayer().getWorld().getName()); } - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerKick(PlayerKickEvent event) { - - Player player = event.getPlayer(); - - /* - * force remove any attachments as bukkit may not - */ - removeAttachment(player); - } - - @EventHandler(priority = EventPriority.LOWEST) + /* + * Trigger at highest so we tidy up last. + */ + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerQuit(PlayerQuitEvent event) { if (!GroupManager.isLoaded()) @@ -464,7 +440,7 @@ public class BukkitPermissions { /* * force remove any attachments as bukkit may not */ - removeAttachment(player); + removeAttachment(player.getName()); } } From 1eac05799fbe323d972dcd38b98c3a79ab222ef9 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 10 Jul 2012 14:35:08 +0100 Subject: [PATCH 07/13] If a permission is found return the correct node for mangcheckp (not null). --- .../groupmanager/permissions/AnjoPermissionsHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java index efad11df4..e954a88fd 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -920,6 +920,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { Group now = stack.pop(); PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targetPermission); if (!resultNow.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { + resultNow.accessLevel = targetPermission; return resultNow; } for (String sonName : now.getInherits()) { From b71a6ac5e1a54294dc8083b931106104a0246eab Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 13 Jul 2012 13:38:53 +0100 Subject: [PATCH 08/13] Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../anjocaido/groupmanager/GlobalGroups.java | 22 +++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index c736d9ee2..c8b8260c7 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -188,4 +188,5 @@ v 2.0: - Fix loading users with only numerals in their names to be seen as strings. - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). - Throw a better error than 'null' when someone removes all groups from a yml. - - Stop force removing attachments and let Bukkit handle it's own mess. \ No newline at end of file + - Stop force removing attachments and let Bukkit handle it's own mess. + - Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java index 04d9e86be..a84666b8e 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java @@ -1,6 +1,7 @@ package org.anjocaido.groupmanager; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; @@ -20,9 +21,10 @@ import org.anjocaido.groupmanager.events.GroupManagerEventHandler; import org.anjocaido.groupmanager.utils.PermissionCheckResult; import org.anjocaido.groupmanager.utils.Tasks; import org.bukkit.configuration.MemorySection; -import org.bukkit.configuration.file.YamlConfiguration; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.reader.UnicodeReader; /** * @author ElgarL @@ -31,7 +33,7 @@ import org.yaml.snakeyaml.Yaml; public class GlobalGroups { private GroupManager plugin; - private YamlConfiguration GGroups; + //private Yaml GGroups; private Map groups; @@ -89,8 +91,9 @@ public class GlobalGroups { @SuppressWarnings("unchecked") public void load() { - GGroups = new YamlConfiguration(); - + Yaml GGroupYAML = new Yaml(new SafeConstructor()); + Map GGroups; + GroupManager.setLoaded(false); // READ globalGroups FILE @@ -106,8 +109,13 @@ public class GlobalGroups { } } + /* + * Load the YAML file. + */ try { - GGroups.load(GlobalGroupsFile); + FileInputStream groupsInputStream = new FileInputStream(GlobalGroupsFile); + GGroups = (Map) GGroupYAML.load(new UnicodeReader(groupsInputStream)); + groupsInputStream.close(); } catch (Exception ex) { throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + GlobalGroupsFile.getPath(), ex); } @@ -115,12 +123,12 @@ public class GlobalGroups { // Clear out old groups resetGlobalGroups(); - if (!GGroups.getKeys(false).isEmpty()) { + if (!GGroups.keySet().isEmpty()) { // Read all global groups Map allGroups = new HashMap(); try { - allGroups = (Map) GGroups.getConfigurationSection("groups").getValues(false); + allGroups = (Map) GGroups.get("groups"); } catch (Exception ex) { // ex.printStackTrace(); throw new IllegalArgumentException("Your " + GlobalGroupsFile.getPath() + " file is invalid. See console for details.", ex); From 76717350d60a42b68311c05451ed227ab55a7ad3 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 13 Jul 2012 16:22:52 +0100 Subject: [PATCH 09/13] Fix a typo because Necrodoom is anal. --- EssentialsGroupManager/src/globalgroups.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EssentialsGroupManager/src/globalgroups.yml b/EssentialsGroupManager/src/globalgroups.yml index a08f9600e..aad503cdc 100644 --- a/EssentialsGroupManager/src/globalgroups.yml +++ b/EssentialsGroupManager/src/globalgroups.yml @@ -6,7 +6,7 @@ # They can also be added as one of a users subgroups, but NOT as a primary group. # These collections are available to ALL group and user yml's. # -# Add to and customize these groups to fit yoru needs. +# Add to and customize these groups to fit your needs. groups: From 6064b9760b9649d370fc41f407b80ddad331efba Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 3 Aug 2012 08:54:06 +0100 Subject: [PATCH 10/13] Fix a cases sensitivity bug in world loading. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index c8b8260c7..bf14359a2 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -189,4 +189,5 @@ v 2.0: - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). - Throw a better error than 'null' when someone removes all groups from a yml. - Stop force removing attachments and let Bukkit handle it's own mess. - - Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. \ No newline at end of file + - Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. + - Fix a cases sensitivity bug in world loading. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index 199c99bb3..afdb0e15b 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -612,7 +612,7 @@ public class WorldsHolder { throw new IllegalArgumentException("Users file for world '" + worldName + "' doesnt exist: " + usersFile.getPath()); } - WorldDataHolder tempHolder = new WorldDataHolder(worldName); + WorldDataHolder tempHolder = new WorldDataHolder(worldNameLowered); // Map the group object for any mirror if (mirrorsGroup.containsKey(worldNameLowered)) From 7b482b612e42a24bd2602a2c1a3dba15c146bc83 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 3 Aug 2012 10:36:26 +0100 Subject: [PATCH 11/13] Stop using the YamlConfiguration in bukkit for our config handling. We can now support periods in world names. --- EssentialsGroupManager/src/Changelog.txt | 3 +- .../groupmanager/GMConfiguration.java | 95 ++++++++++++++----- 2 files changed, 73 insertions(+), 25 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index bf14359a2..027df85f8 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -190,4 +190,5 @@ v 2.0: - Throw a better error than 'null' when someone removes all groups from a yml. - Stop force removing attachments and let Bukkit handle it's own mess. - Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. - - Fix a cases sensitivity bug in world loading. \ No newline at end of file + - Fix a cases sensitivity bug in world loading. + - Stop using the YamlConfiguration in bukkit for our config handling. We can now support periods in world names. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java index 0832000f2..34b50825a 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java @@ -5,22 +5,32 @@ package org.anjocaido.groupmanager; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.util.Map; import java.util.logging.Level; import org.anjocaido.groupmanager.utils.Tasks; -import org.bukkit.configuration.file.YamlConfiguration; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.reader.UnicodeReader; /** * * @author gabrielcouto */ public class GMConfiguration { + + private boolean opOverride; + private boolean toggleValidate; + private Integer saveInterval; + private Integer backupDuration; + private String loggerLevel; + private Map mirrorsMap; + private GroupManager plugin; - private File configFile; - private YamlConfiguration GMconfig; + private Map GMconfig; public GMConfiguration(GroupManager plugin) { @@ -28,12 +38,14 @@ public class GMConfiguration { load(); } + @SuppressWarnings("unchecked") public void load() { if (!plugin.getDataFolder().exists()) { plugin.getDataFolder().mkdirs(); } - configFile = new File(plugin.getDataFolder(), "config.yml"); + + File configFile = new File(plugin.getDataFolder(), "config.yml"); if (!configFile.exists()) { try { @@ -43,59 +55,94 @@ public class GMConfiguration { } } - GMconfig = new YamlConfiguration(); + Yaml configYAML = new Yaml(new SafeConstructor()); try { - GMconfig.load(configFile); + FileInputStream configInputStream = new FileInputStream(configFile); + GMconfig = (Map) configYAML.load(new UnicodeReader(configInputStream)); + configInputStream.close(); + } catch (Exception ex) { throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex); } + /* + * Read our config settings ands store them for reading later. + */ + Map config = getElement("config", getElement("settings", GMconfig)); + + opOverride = (Boolean) config.get("opOverrides"); + toggleValidate = (Boolean) config.get("validate_toggle"); + + /* + * data node for save/backup timers. + */ + Map save = getElement("save", getElement("data", getElement("settings", GMconfig))); + + saveInterval = (Integer) save.get("minutes"); + backupDuration = (Integer) save.get("hours"); + + loggerLevel = ((Map) getElement("settings", GMconfig).get("logging")).get("level"); + + /* + * Store our mirrors map for parsing later. + */ + mirrorsMap = (Map) ((Map) GMconfig.get("settings")).get("mirrors"); + // Setup defaults adjustLoggerLevel(); plugin.setValidateOnlinePlayer(isToggleValidate()); } + + @SuppressWarnings("unchecked") + private Map getElement(String element, Map map) { + + if (!map.containsKey(element)) { + throw new IllegalArgumentException("The config.yml has no '" + element + ".\n"); + } + + return (Map) map.get(element); + + } public boolean isOpOverride() { - return GMconfig.getBoolean("settings.config.opOverrides", true); + return opOverride; } public boolean isToggleValidate() { - - return GMconfig.getBoolean("settings.config.validate_toggle", true); - } - - public Map getMirrorsMap() { - - // Try to fetch the old mirror path first - if (GMconfig.isConfigurationSection("settings.permission.world.mirror")) { - return (Map) GMconfig.getConfigurationSection("settings.permission.world.mirror").getValues(false); - } else if (GMconfig.isConfigurationSection("settings.mirrors")) { - return (Map) GMconfig.getConfigurationSection("settings.mirrors").getValues(false); - } - return null; - + + return toggleValidate; } public Integer getSaveInterval() { - return GMconfig.getInt("settings.data.save.minutes", 10); + return saveInterval; } public Integer getBackupDuration() { - return GMconfig.getInt("settings.data.save.hours", 24); + return backupDuration; } public void adjustLoggerLevel() { try { - GroupManager.logger.setLevel(Level.parse(GMconfig.getString("settings.logging.level", "INFO"))); + GroupManager.logger.setLevel(Level.parse(loggerLevel)); return; } catch (Exception e) { } GroupManager.logger.setLevel(Level.INFO); } + + public Map getMirrorsMap() { + + if (!mirrorsMap.isEmpty()) { + return mirrorsMap; + } + return null; + + } + } \ No newline at end of file From 73fb2d3735e6c4db4ca2e7bd61b163ad359ce25f Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 3 Aug 2012 11:15:14 +0100 Subject: [PATCH 12/13] Fix mirroring now we are not using any Bukkit methods. --- .../dataholder/worlds/WorldsHolder.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index afdb0e15b..f84262eeb 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -22,7 +22,6 @@ import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder; import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; import org.anjocaido.groupmanager.utils.Tasks; import org.bukkit.World; -import org.bukkit.configuration.MemorySection; import org.bukkit.entity.Player; /** @@ -97,9 +96,13 @@ public class WorldsHolder { * Create the data files if they don't already exist, * and they are not mirrored. */ - for (World world : plugin.getServer().getWorlds()) - if ((!worldsData.containsKey(world.getName().toLowerCase())) && ((!mirrorsGroup.containsKey(world.getName().toLowerCase())) || (!mirrorsUser.containsKey(world.getName().toLowerCase())))) + for (World world : plugin.getServer().getWorlds()){ + GroupManager.logger.log(Level.FINE, "Checking data for " + world.getName() + "."); + if ((!worldsData.containsKey(world.getName().toLowerCase())) && ((!mirrorsGroup.containsKey(world.getName().toLowerCase())) || (!mirrorsUser.containsKey(world.getName().toLowerCase())))) { + GroupManager.logger.log(Level.FINE, "Creating folders for " + world.getName() + "."); setupWorldFolder(world.getName()); + } + } /* * Loop over all folders within the worlds folder * and attempt to load the world data @@ -164,12 +167,12 @@ public class WorldsHolder { } else GroupManager.logger.log(Level.WARNING, "Mirroring error with " + o.toString() + ". Recursive loop detected!"); } - } else if (mirrorsMap.get(source) instanceof MemorySection) { - MemorySection subSection = (MemorySection) mirrorsMap.get(source); + } else if (mirrorsMap.get(source) instanceof Map) { + Map subSection = (Map) mirrorsMap.get(source); - for (String key : subSection.getKeys(true)) { + for (Object key : subSection.keySet()) { - if (key.toLowerCase() != serverDefaultWorldName) { + if (((String)key).toLowerCase() != serverDefaultWorldName) { if (subSection.get(key) instanceof ArrayList) { ArrayList mirrorList = (ArrayList) subSection.get(key); @@ -179,28 +182,32 @@ public class WorldsHolder { String type = o.toString().toLowerCase(); try { if (type.equals("groups")) - mirrorsGroup.remove(key.toLowerCase()); + mirrorsGroup.remove(((String)key).toLowerCase()); if (type.equals("users")) - mirrorsUser.remove(key.toLowerCase()); + mirrorsUser.remove(((String)key).toLowerCase()); } catch (Exception e) { } - if (type.equals("groups")) - mirrorsGroup.put(key.toLowerCase(), getWorldData(source).getName()); + if (type.equals("groups")) { + mirrorsGroup.put(((String)key).toLowerCase(), getWorldData(source).getName()); + GroupManager.logger.log(Level.FINE, "Adding groups mirror for " + key + "."); + } - if (type.equals("users")) - mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName()); + if (type.equals("users")) { + mirrorsUser.put(((String)key).toLowerCase(), getWorldData(source).getName()); + GroupManager.logger.log(Level.FINE, "Adding users mirror for " + key + "."); + } } // Track this world so we can create a datasource for it later - mirroredWorlds.add(key); + mirroredWorlds.add((String)key); } else - GroupManager.logger.log(Level.WARNING, "Mirroring error with " + key + ". Recursive loop detected!"); + GroupManager.logger.log(Level.WARNING, "Mirroring error with " + (String)key + ". Recursive loop detected!"); } else { - throw new IllegalStateException("Unknown mirroring format for " + key); + throw new IllegalStateException("Unknown mirroring format for " + (String)key); } } @@ -210,6 +217,7 @@ public class WorldsHolder { // Create a datasource for any worlds not already loaded for (String world : mirroredWorlds) { if (!worldsData.containsKey(world.toLowerCase())) { + GroupManager.logger.log(Level.FINE, "No data for " + world + "."); setupWorldFolder(world); loadWorld(world, true); } From a7a06963ac34807ab9a6149a22a6f7ea717b54a2 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Mon, 6 Aug 2012 07:05:20 +0100 Subject: [PATCH 13/13] Ignore stupid plugins which add empty permission nodes. --- .../permissions/BukkitPermissions.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 6b81f17d0..a4ddcf279 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -214,26 +214,31 @@ public class BukkitPermissions { List result = new ArrayList(); for (String key : permList) { - String a = key.charAt(0) == '-' ? key.substring(1) : key; - Map allchildren = GroupManager.BukkitPermissions.getAllChildren(a, new HashSet()); - if (allchildren != null) { - - ListIterator itr = result.listIterator(); - - while (itr.hasNext()) { - String node = (String) itr.next(); - String b = node.charAt(0) == '-' ? node.substring(1) : node; - - // Insert the parent node before the child - if (allchildren.containsKey(b)) { - itr.set(key); - itr.add(node); - break; + /* + * Ignore stupid plugins which add empty permission nodes. + */ + if (!key.isEmpty()) { + String a = key.charAt(0) == '-' ? key.substring(1) : key; + Map allchildren = GroupManager.BukkitPermissions.getAllChildren(a, new HashSet()); + if (allchildren != null) { + + ListIterator itr = result.listIterator(); + + while (itr.hasNext()) { + String node = (String) itr.next(); + String b = node.charAt(0) == '-' ? node.substring(1) : node; + + // Insert the parent node before the child + if (allchildren.containsKey(b)) { + itr.set(key); + itr.add(node); + break; + } } } + if (!result.contains(key)) + result.add(key); } - if (!result.contains(key)) - result.add(key); } return result;